PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第201回]
●PIC16F627(2)CONFIGはWRITEできていない
PIC16F627用のWRITERプログラム作成作業は思ったより楽に進んだように思えました。
しかし…。
結局悩むことになるのは毎度のことです。
ま。それについては後ほど。
PIC16F627/628はどんなICなのかといいますと。
DataSheetのトップに簡潔にまとめられています。
下はPIC16F627/628のDataSheetです。

[出典]Microchip Technology Inc.PIC16F62XData Sheet
フラッシュプログラムメモリは16F627が1Kワード(2Kバイト)、628が2Kワード(4Kバイト)です。
アセンブラ用途では十分でしょう。
RAMは627/628どちらも224バイトです。
使用可能なI/Oは最大16ポートです。
え?
16ポート?
PIC16F627/628は18pinですからなんとVddとGND以外は全部I/Oポートとして使用可能ということのようです。
そして8bitTimer/CounterX2、16bitTimer/CounterX1ですから通常の用途には十分でありましょう。
しかしADコンバータはありません。
ここが用途によってはちょいと不足かも。
あるのはADコンパレータです。
まあ欲を言えばきりがありませんでしょう。
クロックはmax20MHzですからこれも通常の用途には十分です。
通常正確なクロックが必要な用途には外部にクリスタルをつけますが外部に抵抗を1本つけるだけという簡易クロック発振モードもあります(ERオシレータモード。試したことはありません)。
特筆すべきは内蔵クロック発振モードがあることです(4MHz固定)。
あれ?
上のDataSheetにはありませんね?
記憶違いか?
いえいえ。
ちゃんと書いてありました。

簡単なテストプログラムを書きました。
;;;pic p16f627 test
;25/1/7 1/8
;
#include <p16f627.inc>
__CONFIG _WDT_OFF & _INTRC_OSC_CLKOUT
;
;int CLOCK 4MHz
;
w=0
f=1
c=0
z=2
;
cntr0=20
testcntr=21
testcntr2=22
;
org 0
goto start
;
org 5
start
movlw 7;a0-a3 is digital
movwf CMCON
bsf STATUS,5 ;bank 1
clrf TRISA
clrf TRISB
bcf STATUS,5 ;bank0
;
testloop
movf testcntr,w
movwf PORTA
testloop2
call t1ms
decfsz testcntr2
goto testloop2
decf testcntr
goto testloop
;
;1msec timer
t1ms
movlw 0fa;=250
movwf cntr0
t1ms2;4micros
xorwf PORTB;1
decfsz cntr0;1
goto t1ms2;2
return
;
end
;
|
PIC16F1827のときのテストプログラムとクロックは違いますがそこは合わせてありますからやってることは同じです。
これで準備ができました。
PIC16F627/628用のWRITERプログラムも作成しましたのでさっそくテストです。
下はそのときのログです。
logfile piciolog\0109084922.txt open *** pic i/o *** picio-30 connected >/picrd startcode=01 type=04,uadrs=00 [01] 0000[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0010[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0020[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0030[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0040[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0060[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FA0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FB0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FC0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FD0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FE0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FF0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] type=04,uadrs=01 [03] 1000[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] |
ちょっと訳ありでまずはPIC16F627を秋月のPIC WRITERで全消去してからテストスタートです。
最初に/PICRDでプログラムエリアを読み出しました。
PIC16F627/628のプログラムエリアは14ビットですから消去されていれば3FFFが読み出されます。
3FFFが読み出されたということはPICRDプログラムはうまく働いていることになります。
冗長になりますから途中をカットしてあります。
PIC16F627のプログラムエリアは1024x14ビット(1Kワード)ですから2Kバイトです。
アドレスは0000〜07FFになります。
作成したプログラムはPIC16F628を意識していますから4KBの範囲を読み出しています。
そのことについては後でまた書くことにします。
最後の行はCONFIGですがここはCONFIGアドレスについての思い違いがあって正しく読み出せてはいません。
それについても後ほど書くことにします。
とにかく消去できていることは確認できましたのでいよいよプログラムを書き込みます。
>/hload 16f627test.hex loading 16f627test.hex ... i=175,binbfend=72 >/picwr startcode=01 i=6,b=2,[04]0000 [05][04][02][00][00][00][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=12,b=2,[00]0000 [05][00][02][00][00][05][28][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=22,b=6,[00]000a [05][00][06][00][0A][07][30][9F][00][83][16][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] i=42,b=16,[00]0010 [05][00][10][00][10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] [01] i=62,b=16,[00]0020 [05][00][10][00][20][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] [01] i=68,b=2,[00]400e [05][00][02][40][0E][F9][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] [01] picwrend |
上の方でお見せしたプログラムをMPLABでアセンブルして作成されたHEXファイル(16F627TEST.HEX)をロードしてそれを書き込みました。
書き込んだらVERIFYです。
>/verify inbfend=0 startcode=01 i=6,b=2,[04]0000 [06][04][02][00][00][00][00][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (01)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) i=12,b=2,[00]0000 [06][00][02][00][00][05][28][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (02)(05)(28)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o] i=22,b=6,[00]000a [06][00][06][00][0A][07][30][9F][00][83][16][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (06)(07)(30)(9F)(00)(83)(16)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F)(FF)(3F) [o][o][o][o][o][o] i=42,b=16,[00]0010 [06][00][10][00][10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] (10)(85)(01)(86)(01)(83)(12)(21)(08)(85)(00)(12)(20)(A2)(0B)(0D)(28) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=62,b=16,[00]0020 [06][00][10][00][20][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] (10)(A1)(03)(0B)(28)(FA)(30)(A0)(00)(86)(06)(A0)(0B)(14)(28)(08)(00) [o][o][o][o][o][o][o][o][o][o][o][o][o][o][o][o] i=68,b=2,[00]400e [06][00][02][40][0E][F9][3F][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF][FF] (02)(F9)(3F)(0B)(28)(FA)(30)(A0)(00)(86)(06)(A0)(0B)(14)(28)(08)(00) [o][o] vfend error=0 |
うまく書き込めているようです。
念のために/PICRDFコマンドで読み出してHEXファイルを作成しました。
>/picrdf 16f627test250109.hex startcode=01 type=04,uadrs=00 [01] 0000[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][07][30][9F][00][83][16] 0010[10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] 0020[10][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] 0030[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0040[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0050[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07D0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07E0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 07F0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0800[10][05][28][FF][3F][FF][3F][FF][3F][FF][3F][07][30][9F][00][83][16] 0810[10][85][01][86][01][83][12][21][08][85][00][12][20][A2][0B][0D][28] 0820[10][A1][03][0B][28][FA][30][A0][00][86][06][A0][0B][14][28][08][00] 0830[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0840[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0850[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FA0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FB0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FC0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FD0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FE0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] 0FF0[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] type=04,uadrs=01 [03] 1000[10][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F][FF][3F] [01] |
さきほどPIC16F627のプログラムエリアは07FFまでですがそれを0FFFまで読み出しましたと書きました。
PIC16F627では実装されていないはずの0800〜0FFFを読み出すと0000〜07FFのイメージが読み出されるようです。
0800〜には0000〜と同じ値が読み出されています。
それはそれとして最後のCONFIGには問題があるようです。
WinMergeでもとのファイルと比較しました。

CONFIGのところは駄目です。
この時点(1月9日)ではまだCONFIGのアドレスについては思い違いをしていました。
そのことに気がついたのは3日後(1月12日)のことです([第197回])。
説明の途中ですが時間がなくなってしまいました。
次回に続きます。
PICBASICコンパイラ[第201回]
2025.1.21 upload
前へ
次へ
ホームページトップへ戻る