連載
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.