超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第317回]
●PIC16アセンブラ(4)念のため命令コードを確認
前回までのところでPIC12F1612のテストプログラムについては正しくアセンブルできることが確認できました。
しかし同テストプログラムは簡単なプログラムなのでPIC16/PIC12の一部の命令を使っているだけです。
そこで使用していない命令についてはどうなのか?
ここはやっぱり押さえておくべきでありましょう。
そこでPIC16/PIC12の全命令を記述したテストプログラムを作ってそれを自作アセンブラとMPLABの両方でアセンブルして同じコードが出力されるかどうかを比較してみることにしました。
ここでテストするのはあくまでアセンブルした結果出力される命令コードが正しいかどうかを確認することが目的なのでプログラムとして意味があるかどうかは考えていません。
単純に命令を羅列しているだけです。
MPLABではCONFIG行の記述のためにPIC名を記したincファイルをヘッダーファイルとして記述する必要があります。
一方自作アセンブラではそこのところを簡略化しているためにCONFIGは16進数データとして与えます。
従ってincファイルの記述も不要です。
またEND行も不要です。
逆に自作アセンブラでは上記の記述があるとエラーになります。
自作アセンブラとMPLABでは上記の相違のみを直したテストプログラムを使ってアセンブルしました。
下はPIC16アセンブラで出力されたリストファイルです。
今までのPIC12F1612テストプログラムにテスト用の命令を追記したソースプログラムをアセンブルした結果です。
同様のファイルはMPLABでも作成されました。
******* 0000 ;25/07/4 25/7/22 for p16asm 0000 ;7/23 7/30 0000 ;clock=4MHz 0000 ; #include <p12f629.inc>;***************** 0000 ; 0000 ; __CONFIG _CP_OFF & _MCLRE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT;********0000 ; 0000 ; 400E FC31 config1=31fc 4010 FF3E config2=3eff 4012 9F3F config3=3f9f 0000 00 cf=0 0000 02 zf=2 0000 01 f=1 0000 00 w=0 0000 ; 0000 08 bsr=08 0000 0C porta=0c;bnk0 0000 0C trisa=0c;bnk=1 0000 19 osccon=19;bnk=1 0000 1A oscstat=1a;bnk=1 0000 0C ansela=0c;bnk=3 0000 20 cntr0=20 0000 21 cntr1=21 0000 ; 0000 org 00 0000 0528 goto start 0002 ; 000A org 05 000A start 000A 0330 movlw 3 000C 8800 movwf bsr 000E 8C01 clrf ansela 0010 0130 movlw 1;bsf STATUS,5 ;bank 1 0012 8800 movwf bsr 0014 6830 movlw 68;PLL disenable,intosc=4MHz 0016 9900 movwf osccon 0018 5830 movlw 58;HFINTOSC 001A 9A00 movwf oscstat 001C 8C01 clrf trisa;clrf TRISIO 001E 8801 clrf bsr;bcf STATUS,5;bank 0 0020 ; 0020 loop 0020 8C01 clrf porta;clrf GPIO 0022 1C20 call t0_5s 0024 FF30 movlw 0ff 0026 8C00 movwf porta;movwf GPIO 0028 1C20 call t0_5s 002A 1028 goto loop 002C ; 002C t1ms 002C FA30 movlw 0fa;=250 002E A000 movwf cntr0 0030 t1ms2 0030 0000 nop 0032 A00B decfsz cntr0,f 0034 1828 goto t1ms2 0036 0800 return 0038 ; 0038 t0_5s 0038 FA30 movlw 0fa;=250 003A A100 movwf cntr1 003C t0_5s2 003C 1620 call t1ms 003E 1620 call t1ms 0040 A10B decfsz cntr1,f 0042 1E28 goto t0_5s2 0044 0800 return 0046 ; 0046 ;for p16asm test 0046 A107 addwf cntr1 0048 2107 addwf cntr1,w 004A A107 addwf cntr1,f 004C A105 andwf cntr1 004E 2105 andwf cntr1,w 0050 A105 andwf cntr1,f 0052 A101 clrf cntr1 0054 0001 clrw 0056 A109 comf cntr1 0058 2109 comf cntr1,w 005A A109 comf cntr1,f 005C A103 decf cntr1 005E 2103 decf cntr1,w 0060 A103 decf cntr1,f 0062 A10B decfsz cntr1 0064 210B decfsz cntr1,w 0066 A10B decfsz cntr1,f 0068 A10A incf cntr1 006A 210A incf cntr1,w 006C A10A incf cntr1,f 006E A10F incfsz cntr1 0070 210F incfsz cntr1,w 0072 A10F incfsz cntr1,f 0074 A104 iorwf cntr1 0076 2104 iorwf cntr1,w 0078 A104 iorwf cntr1,f 007A A108 movf cntr1 007C 2108 movf cntr1,w 007E A108 movf cntr1,f 0080 A100 movwf cntr1 0082 0000 nop 0084 A10D rlf cntr1 0086 210D rlf cntr1,w 0088 A10D rlf cntr1,f 008A A10C rrf cntr1 008C 210C rrf cntr1,w 008E A10C rrf cntr1,f 0090 A102 subwf cntr1 0092 2102 subwf cntr1,w 0094 A102 subwf cntr1,f 0096 A10E swapf cntr1 0098 210E swapf cntr1,w 009A A10E swapf cntr1,f 009C A106 xorwf cntr1 009E 2106 xorwf cntr1,w 00A0 A106 xorwf cntr1,f 00A2 A112 bcf cntr1,5 00A4 A116 bsf cntr1,5 00A6 A11A btfsc cntr1,5 00A8 A11E btfss cntr1,5 00AA 053E addlw 5 00AC 0539 andlw 5 00AE 0001 clrwdt 00B0 0538 iorlw 5 00B2 0900 retfie 00B4 0534 retlw 5 00B6 6300 sleep 00B8 053C sublw 5 00BA 053A xorlw 5 00BC ;; 00BC ; end ************************ 00BC ; |
このリストファイルのコード部分を比較してもよいのですけれどそれでは手間がかかります。
両者の比較はアセンブル後に作成されるHEXファイルによるのが簡便です。
それも作成されたファイルを左右に並べて比べるのではまだ手間がかかりますしなんだか間違えてしまいそうです。
そこで下のように加工しました。
左側はPIC16アセンブラの出力ファイルに右側のMPLABからの出力ファイルの各行を上下に並べる形でコピーしたものです。
左側の行の下に右側の行を置いています。
PIC16アセンブラでは0000の行も16バイト1行として出力しますがMPLABでは2行で出力します(前回参照)。
その部分は比較し易いように並べてあります。
これなら上下の値を比較できますから不一致があればすぐにわかります。
とはいえなにしろ老眼ですので画像をさらに拡大して比較しました。
すると。
不一致が2箇所みつかりました。
アドレス0054と00AE、00AFです。
リストで確認しました。
アドレス0054はCLRWです。
0054 0001 clrw |
Data Sheetで確認しましたらCLRWの下位バイトは0xxx xxxxになっていました。
xは’don’t care’ですがPIC Assemblerではx=0になると書かれています。
するとMPLABがここを0000 0011としていることがおかしいのですがそれでも’don’t care’なのでそういうことでよしとしておきましょう。
こんな命令(CLRW)があるなんて気が付きませんでした。
CLRFは確かに必要性を感じますがCLRWはMOVLW 0を使えばよいのでそれほど必要とは思いません。
念のために確認してみましたらPIC18アセンブラにはCLRWはありませんでした。
もうひとつアドレス00AE、00AFについてです。
こちらはCLRWDTです。
00AE 0001 clrwdt |
CLRWDTは6400(下位8ビット上位8ビットの順)です。
プログラムミスがみつかったので修正しました。
やっぱり確認してよかったです。
これでPIC16/PIC12アセンブラについてはMPLABから開放されました。
なによりあのCONFIGの記述から開放されたことが有り難いです。
超ローコストPICWRITERの製作[第317回]
2025.8.1 upload
前へ
ホームページトップへ戻る