連載
PICでもっと遊ぶその3「EEROMを使ってサーボを“ガガガ”と動かす」:夏でも楽しい工作教室(2/3 ページ)
前回、AD変換回路をくみ上げて何とかサーボを動かした。あくまでテスト用、ということで可変ボリュームを使ったが、本来の野望を実現するためにはシーケンス動作してくれないと困る。というわけで今回はEEROMをはじめとするメモリを活用することになる。
;(……ソースコードの続き……)
INTMAIN
| ▼▼ | MOVWF | WBUF | ; レジスタ類退避 | ||
|---|---|---|---|---|---|
| ▼▼ | SWAPF | STATUS,W | |||
| ▼▼ | BCF | STATUS,RP0 | |||
| MOVWFSBUF | |||||
;
| MOVLW0EAH; タイマー再セット |
| ▼▼ | MOVWF | TMR1L |
|---|---|---|
| ▼▼ | MOVLW | 0B1H |
| ▼▼ | MOVWF | TMR1H |
| BCFPIR1,TMR1IF | ||
;
RC1SET
| ▼▼ | MOVF | RC1POS,W | ; サーボ1のデータを送る | ||||
|---|---|---|---|---|---|---|---|
| ▼▼ | BTFSC | STATUS,Z | ; データが0なら送らない | ||||
| ▼▼ | GOTO | RC2SET | ; 中心値128 1-128-255 | ||||
| ▼▼ | BSF | GPIO,GPIO5 | |||||
| ▼▼ | ; サーボパルス調整値 | ||||||
| ▼▼ | ; 01での幅 80での幅 FFでの幅 W値 前/後NOP数 | ||||||
| ▼▼ ; | MOVLW | 0F6H | ; 01:0991 80:1499 FF:2007 F6 N1 N1 | ||||
| ▼▼ ; | MOVLW | 0D6H | ; 01:0864 80:1499 FF:2134 D6 N1 N2 | ||||
| ▼▼ | MOVLW | 0B6H | ; 01:0737 80:1499 FF:2261 B6 N1 N3 | ||||
| MOVWFCOUNT | |||||||
INTLP1
| ▼▼ | NOP | ; 前NOP | |||||
|---|---|---|---|---|---|---|---|
| ▼▼ | DECFSZ | COUNT,F | |||||
| ▼▼ | GOTO | INTLP1 | |||||
| ▼▼ | MOVF | RC1POS,W | |||||
| MOVWFCOUNT | |||||||
INTLP2
| ▼▼ | NOP | ; 後NOP | |||||
|---|---|---|---|---|---|---|---|
| ▼▼ | NOP | ||||||
| ▼▼ | NOP | ||||||
| ▼▼ | DECFSZ | COUNT,F | |||||
| ▼▼ | GOTO | INTLP2 | |||||
| BCFGPIO,GPIO5 | |||||||
RC2SET
| DECFRC1TIM,F |
RCSETE
;
| ▼▼ | SWAPF | SBUF,W | ; レジスタ類復帰 | |
|---|---|---|---|---|
| ▼▼ | MOVWF | STATUS | ||
| ▼▼ | SWAPF | WBUF,F | ||
| ▼▼ | SWAPF | WBUF,W | ||
| ▼▼ | BSF | INTCON,GIE | ; 割り込み再許可 | |
| RETFIE | ||||
;
;
;
MAIN
| ▼▼ | CLRWDT | ; 割り込み関連初期化 | |||
|---|---|---|---|---|---|
| ▼▼ | CALL | 3FFh | ; 内蔵オシレーター調整 | ||
| ▼▼ | MOVWF | OSCCAL | |||
| ▼▼ | BANKSEL | T1CON | |||
| ▼▼ | MOVLW | B'00000001' | ; TMR1 1:1 | ||
| ▼▼ | MOVWF | T1CON | |||
| ▼▼ | MOVLW | B'11000000' | ; GIE & PEIE | ||
| ▼▼ | MOVWF | INTCON | |||
| ▼▼ | BANKSEL | PIE1 | |||
| ▼▼ | MOVLW | B'10000001' | ; EEIE & TMR1IE | ||
| ▼▼ | MOVWF | PIE1 | |||
| ▼▼ | BANKSEL | TMR1L | |||
| ▼▼ | MOVLW | 0F0H | ; タイマ初期化 20ms | ||
| ▼▼ | MOVWF | TMR1L | |||
| ▼▼ | MOVLW | 0B1H | |||
| MOVWFTMR1H | |||||
;
| ▼▼ | CLRF | GPIO |
|---|---|---|
| ▼▼ | MOVLW | 07h |
| ▼▼ | MOVWF | CMCON |
| ▼▼ | BANKSEL | TRISIO |
| ▼▼ | CLRF | TRISIO |
| ▼▼ | CLRF | ANSEL |
| BANKSELGPIO | ||
;
| ▼▼ | MOVLW | 080H | ; フェイルセーフ | |
|---|---|---|---|---|
| MOVWFRC1POS | ||||
MAIN01
| CLRFEERPOS |
;
| ;ここからループ開始 |
;
MAIN02
; EEPOSから二バイト読み出し
; RC1POS(サーボ位置)
; RC1TOM(サーボ保持時間[20ms単位])
; を書き込む。RC1TIMが0ならデータエンドなのでループ
| ▼▼ | BANKSEL | EEADR | ||
|---|---|---|---|---|
| ▼▼ | MOVF | EERPOS,W | ||
| ▼▼ | MOVWF | EEADR | ;Address to read | |
| ▼▼ | BSF | EECON1,RD | ;EE Read | |
| ▼▼ | MOVF | EEDATA,W | ;Move data to W | |
| ▼▼ | MOVWF | RC1POS | ||
| ▼▼ | INCF | EEADR , F | ||
| ▼▼ | BSF | EECON1,RD | ;EE Read | |
| ▼▼ | MOVF | EEDATA,W | ;Move data to W | |
| ▼▼ | MOVWF | RC1TIM | ||
| ▼▼ | BCF | STATUS,RP0 | ; Bank 0 | |
| ▼▼ | INCF | EERPOS,F | ||
| ▼▼ | INCF | EERPOS,F | ||
| ▼▼ | MOVF | RC1TIM,F | ; RC1TIM = 0 なら | |
| ▼▼ | BTFSC | STATUS,Z | ; データ終了なのでリピート | |
| GOTOMAIN01 | ||||
MAIN03
;
; RC1TIMが0になるまで待つ
; (減算は割り込みルーチンが行う)
;
| ▼▼ | MOVF | RC1TIM , F |
|---|---|---|
| ▼▼ | BTFSC | STATUS,Z |
| ▼▼ | GOTO | MAIN02 |
| GOTOMAIN03 | ||
;(ソースコードは“もうちょっと”続く……)
Copyright © ITmedia, Inc. All Rights Reserved.