2025.1.21
前へ
次へ
ホームページトップへ戻る


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

前へ
次へ
ホームページトップへ戻る