またまた登場。本日2回目です。笑点まではまだ時間があるけどもう今日もおしまいって気分になってしまって少々気が重い。
こんなときにはPICのアセンブラでもやって気を紛らわせましょう。っておいおい。
では今日の教材は新しいやつです。
http://picdetukutte.toshi-ie.com/infoA.zip
にある
84A_SAMPLE2
を使いましょう。そうしましょうそうしましょう。
内容は前回と同じ・・と思いきや見慣れないのがあります。
初期設定の下のほうに
TIMER1 EQU 20H ;「TIMER1」という箱の住所 20H
TIMER2 EQU 21H ;「TIMER2」という箱の住所 21H
TIMER3 EQU 22H ;「TIMER3」という箱の住所 22H
ってのがあるこれは何? ってことっだね。
で これは後回し、次行こう。
昨日の内容と違うところから話そう。
昨日のところは復習しておいてね。
内容としては「RA0のスイッチがオン(0Vにする)されるのをぐるぐる回って待ってて押されたらRA2のLEDをオンさせてRA3のLEDはオフさせる」んだったね。
で次からが新しいところ。時間を稼ぐプログラムだよ。
昨日話しけれどプログラムはその場所でじっとしていないのさ。いつも動き回ってる。基本的には下へ行こうをしているのだけどね。
時間稼ぎっていうことはPICさんに時間が来るまでいろんなところをぐるぐる回って暇をつぶしてもらうってことなんだよ。
でプログラムをご覧いただこう。
CALL T3
ってなってる。この意味はT3まで行ってまた戻って来い、って意味だよん。
戻って来い ってのは向こう側(行った先)のプログラムに必ずRETURNとかRETLWって命令語があってこれが「戻って行け!」って追い出される命令語ってことよ。
T3ってのも昨日話したね。電柱に書いてある「ここはT3丁目」って感じの標識だよ。
ではT3へ行こう。この標識はどこにあるかは勝手に作られてるのでちゃんと探すこと。自分でプログラムするときも勝手に書けるので自分で迷子にならないようにね。
見つけたかい? ヘンなところにあるよね。
入り組んだところにあるので説明がしづらいよ。だから近所の T1 を見よう。
T1 ;「CALL T1」より到着
MOVLW D'250' ;250という数を
MOVWF TIMER1 ;「TIMER1」という箱に入れる
T1_LOOP
NOP ;何もしないで下へ進む
DECFSZ TIMER1,F ;ここを通るたびに箱から「1」ずつ減っていく。
GOTO T1_LOOP ;まだ箱に数が残っていれば「T1_LOOP」へ戻る。
RETURN ;箱の数が0ならば「CALL T1」の下へ行く。③
こうなってる。
前に
MOVLW 数字
MOVWF 場所
って教えたよね。これもそれだよ。
250って数字をTIMER1という場所に入れるのさ。
TIMER1って場所はオレが勝手に作って命名しました。
で 勝手に作った場所は住所が必要なのさ。
それがさっきのヤツ
TIMER1 EQU 20H ;「TIMER1」という箱の住所 20H
TIMER2 EQU 21H ;「TIMER2」という箱の住所 21H
TIMER3 EQU 22H ;「TIMER3」という箱の住所 22H
これだよ。20番地とでも言おうか。これもオレが決めた。
でもねルールがあってこのPIC16F84Aは新規入居者は0C番地から4F番地までしか住めない。上の住所はセーフだよな。で何で0C番地から使わないんだ?てか?
それはこの84A以外の型式のPICはほとんど20番地からの募集なんだよ。だから他の型式にプログラムを移植してもOKなようにこうしてるんだよ。これはオレの癖だからアンタは好きにすればいい。
参考までに話そう。今まで出てきた場所、PORTA,PORTAB,TRISA,TRISB,STATUS,も住所があるんだよ。
PORTAは05番地,PORTABは06番地,TRISAはバンク1の05番地,TRISBはバンク1の06番地,STATUSはナンとバンク0にもバンク1にもあって共に03番地。
前の話、思い出せるかい?
STATUSって場所のRP0って小部屋を1にしたり0にしたりしてバンク1へ行ったりバンク0へ戻ったりしたよな。だからSTATUSはどっちのバンクにもないとオレが移動できないのさ。アンタもそうなんだけどね。
以上の番地はマイクロチップ社が決めたんだよ。オレの許可も無くね。ははは。
T1の話に戻そう。
TIMER1には250って数字を入れたぞ。
で次、
T1_LOOP
NOP ;何もしないで下へ進む
DECFSZ TIMER1,F ;ここを通るたびに箱から「1」ずつ減っていく。
GOTO T1_LOOP ;まだ箱に数が残っていれば「T1_LOOP」へ戻る。
RETURN
こうだ。
T1_LOOPも電柱の看板な。
NOPってのは「何もしません」って呑気な命令語だ。本当に何もしないんだよ。
でもね 使うことはオレは多いよ。ここでも時間稼ぎなのでこれがあったほうが時間が稼げるって理屈はわかるかい? で 次。
DECFSZ TIMER1,F
TIMER1に入ってる数字をここを通るたびに1個ずつ引いていけ! なおかつ
残数が0以外のときはすぐ下の行へ行け!
0のときは2行目へ行け!
ってながーーーい意味の命令だ。
TIMER1,Fの「,F」は決まり事なので付けるようにね。
でプログラムわかるかい?
下の行にはT1_LOOPへ行けって書いてあるぜ。
つまりここを249回まわって250回目に中身が0になるので2行目の
RETURN。さっき言ったよな。CALLで行って戻って来いってヤツな。
でもさっきはT3だったよな。
んじゃT3から行くぜ。って ちょっと休憩。
また 来るぜ。
多分アンタはオレがこれを書いてる5年後ぐらいにこれを読んでるんだろうね。
時空を越えて喧嘩腰って話も期待出来そうだね。