2025.8.1
前へ

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


超ローコスト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

前へ

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