MPLABでシミュレーション(LED点灯) - PIC電圧計

Posted by kyosuke at 07/26 2007
>>次の記事: PIC16F877にプログラムを書き込んでみる
>>前の記事: MPLABを使ってみよう



前回の失敗の主な原因は、
PICのRP0とRPOは、MPLABのエディタ上、見分けがつかなかったこと。
リンクエラーは、.lkrのファイルを削除すると消える。

あとは適当にぼちぼち手直しして、デバックのしやすいように、カウンター値を小さくして、
Animationをする。




Animationのときに、Special Registerを表示させておくのがデバックのコツだ。
以下、そのときのコード。

LIST		P=PIC16F877
INCLUDE		"P16F877.INC"

	ORG	0CH
CNT1	RES	1
CNT2	RES	1
CNT3	RES	1

	ORG	0
START
	BSF	STATUS,RP0
	CLRF    TRISA
	BCF     STATUS,RP0
	MOVLW	0FFH
	MOVWF   PORTA

MAIN
	BTFSS	PORTA,0
	GOTO	LEDON
LEDOFF
	BCF	PORTA,0
	CALL	T1SEC
	GOTO	MAIN
LEDON
	MOVLW	0FFH
	MOVWF	PORTA
	CALL	T1SEC
	GOTO	MAIN

T1SEC
	MOVLW	01H ;10=AH
	MOVWF	CNT3	
T1SEC2
	CALL	T100MSEC
	DECFSZ	CNT3,F
	GOTO	T1SEC2
	RETURN

T100MSEC
	MOVLW	01H	;100=64H
	MOVWF	CNT2
T100MSEC2
	CALL	T1MSEC
	DECFSZ	CNT2,F
	GOTO	T100MSEC2
	RETURN

T1MSEC
	MOVLW	01H; 256=FF
	MOVWF	CNT1
T1MSEC2
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	CNT1,F
	GOTO	T1MSEC2
	RETURN

	END


結果。

ちゃんと動いてねぇよ。

LEDを点滅させるのに、
PORTAの出力を0と1にきりかえなきゃいけないのに、
してない。

直す。


見た感じ、下のコードがおかしい。
START
	BSF	STATUS,RP0
	CLRF    TRISA
	BCF     STATUS,RP0
	MOVLW	0FFH
	MOVWF   PORTA
PORTAに0FFHが入っていない。
なんか、無視して素通りしやがる。

とりあえず、RP0とかってナンやねん。
Datasheetみろってことで、16f877のデータシートのアドレス関係の所をみる。

RP0とRP1でバンクを切り替えるらしい。
BANK1にある、PORTAの入出力を決めるのに、RP0を1にセットしなければならない。

RP0を0にすると、BANK1に戻ると。


もしかして、PORTAをすべて出力にまわすのがいけないのだろうか?
そんなこといけないとは書かれていない。

とりあえず、PORTBをすべて出力にしてみる。
START
	BSF	STATUS,RP0
	CLRF    TRISB
	BCF     STATUS,RP0
	MOVLW	0FFH
	MOVWF   PORTB
あ、
変わった。

うーん、

もしかして、
PORTAは5ビットしかないのに、FFを入れようとしたのが原因か?

試してみる。

うーん、
そういうわけではなさそう。

なんかいろいろ試してみたけど、
RA0-3までは出力を受け付けないようだ。
というかRA4だけ出力を受け付ける。
それ以外は無反応だ。

どうも、設定に問題があるような気分。

もういいや、PORTBを出力に使おう。


・・・・。


ちゃんと動いた。

最後に、Logic Analyzerで見る。

おー、ちゃんと動いてますよ。


以上、終了。

次回は、適当にテスト基盤に取り付けてみる。



ちなみに、最終的なLED点滅コード

RB0でLEDを1秒間隔で点滅させる。
LIST		P=PIC16F877
INCLUDE		"P16F877.INC"

	ORG	0CH
CNT1	RES	1
CNT2	RES	1
CNT3	RES	1

	ORG	0
START
	BSF	STATUS,RP0
	BCF	STATUS,RP1
	CLRF    TRISB
	BCF     STATUS,RP0
	MOVLW	0FFH
	MOVWF   PORTB

MAIN
	BTFSS	PORTB,0
	GOTO	LEDON
LEDOFF
	BCF	 PORTB,0
	CALL	T1SEC
	GOTO	MAIN
LEDON
	MOVLW	0FFH
	MOVWF	PORTB
	CALL	T1SEC
	GOTO	MAIN

T1SEC
	MOVLW	0AH ;10=AH
	MOVWF	CNT3	
T1SEC2
	CALL	T100MSEC
	DECFSZ	CNT3,F
	GOTO	T1SEC2
	RETURN

T100MSEC
	MOVLW	064H	;100=64H
	MOVWF	CNT2
T100MSEC2
	CALL	  T1MSEC
	DECFSZ	CNT2,F
	GOTO 	 T100MSEC2
	RETURN

T1MSEC
	MOVLW	0FFH; 256=FF
	MOVWF	CNT1
T1MSEC2
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ	CNT1,F
	GOTO 	 T1MSEC2
	RETURN

	END


>>次の記事: PIC16F877にプログラムを書き込んでみる
>>前の記事: MPLABを使ってみよう





PIC電圧計のモノ作り記事

Vol_reg_thumb
定電圧電源の製作、電圧表示付き(7セグメント3つ)
PIC電圧計の完成!(C言語バージョン+7セグメントLED)<br /> http://give-n-take.net/gat/user/show_diary/229 <br /...
続きを読む>>定電圧電源の製作、電圧表示付き(7セグメント3つ)
Posted by kyosuke at 04/10 2008

Vol_reg_seg_thumb
PIC電圧計の完成!(C言語バージョン+7セグメントLED)
PICマイコンの10ビットA/Dコンバータのプログラム+回路図+LEDバー<br /> http://toolible.net/monozukuri/articles/51<br ...
続きを読む>>PIC電圧計の完成!(C言語バージョン+7セグメントLED)
Posted by kyosuke at 04/02 2008

Vol_reg_thumb
PICマイコンの10ビットA/Dコンバータのプログラム+回路図+LEDバー
電圧計の完成!<br /> http://toolible.net/monozukuri/articles/21<br /> <br /> とか書いてあります...
続きを読む>>PICマイコンの10ビットA/Dコンバータのプログラム+回路図+LEDバー
Posted by kyosuke at 03/30 2008

Pictester_thumb
PIC電圧計の完成!(アセンブラバージョン)
前回は、割り込み処理のデバックが終わった。<br /> <br /> いうなれば、今回のデバックが電圧計のためのものと。。<br /> <br /&gt...
続きを読む>>PIC電圧計の完成!(アセンブラバージョン)
Posted by kyosuke at 08/11 2007

No_image
電圧計PICプログラム デバック
さて、デバックする。<br /> <br /> 凡ミスを取り除いて、<br /> ビルトOK。<br /> <br /> RUNし...
続きを読む>>電圧計PICプログラム デバック
Posted by kyosuke at 08/09 2007

PIC電圧計 の14記事を見る