超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第312回]
●PIC12F1612(5)MPLABでアセンブル
前回作成したPIC12F1612テストプログラムをMPLABでアセンブルしました。
その結果は
Errors :0
BUILD SUCCEEDED
です。
でもよく見るといくつかWarningが出ています。
「警告」ですからエラーではありませんがちょっと気になります。
ASM 28とかASM 31というのはソースプログラムの行番号です。
28、31、35、37の4箇所です。
Invalid RAM location specified
と書かれています。
「無効なRAM領域を割り当てた」というような意味になります。
確認するためにソースプログラムをTeraPadで行番号をつけて表示しました。
28、31、37にあるのはBSR、35はOSCSTATです。
プログラムの先頭でBSRにはアドレスとして08を指定しています。
またOSCSTATには1Aを指定しています。
MPLABはこのプログラムをPIC12F629用のものとしてアセンブルしました。
そこでPIC12F629のRAMアドレスを確認してみました。
[出典]Microchip Technology Inc. PIC12F629 Data Sheet
上のマップは[第309回]でお見せしました。
アドレス08、1Aにはアミがかかっています。
PIC12F629では「未定義」です。
未定義のRAMアドレス(SFRのアドレス)に何かを書こうとしているので、それは無効ですよ、という警告が出されたというわけです。
PIC12F629では無効でもPIC12F1612では有効なアドレスです。
しかしMPLABで無効とされたアドレスを指定しても大丈夫なのでしょうか?
下はアセンブルの結果作成されたLISTファイルです(部分)。
MPASM 5.34 PIC12F1612TEST.ASM 7-8-2025 8:52:00 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ;;;PIC 12F1612 testprogram from pic12f629test.asm 00002 ;25/07/4 00003 ;clock=4MHz 00004 #include <p12f629.inc>;*****************;***************** 00001 LIST 00002 ; P12F629.INC Standard Header File, Version 1.04 Microchip Technology, Inc. 00258 LIST 00005 ; 2007 3FF5 00006 __CONFIG _CP_OFF & _MCLRE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT;*************** 00007 ; 00000000 00008 cf=0 00000002 00009 zf=2 00000001 00010 f=1 00000000 00011 w=0 00012 ; 00000008 00013 bsr=08 0000000C 00014 porta=0c;bnk0 0000000C 00015 trisa=0c;bnk=1 00000019 00016 osccon=19;bnk=1 0000001A 00017 oscstat=1a;bnk=1 0000000C 00018 ansela=0c;bnk=3 00000020 00019 cntr0 equ 20 00000021 00020 cntr1 equ 21 00021 ; 0000 00022 org 00 0000 2805 00023 goto start 00024 ; 0005 00025 org 05 0005 00026 start 0005 3003 00027 movlw 3 Warning[219]: Invalid RAM location specified. 0006 0088 00028 movwf bsr 0007 018C 00029 clrf ansela 0008 3001 00030 movlw 1;bsf STATUS,5 ;bank 1 Warning[219]: Invalid RAM location specified. 0009 0088 00031 movwf bsr 000A 3068 00032 movlw 68;PLL disenable,intosc=4MHz 000B 0099 00033 movwf osccon 000C 3058 00034 movlw 58;HFINTOSC Warning[219]: Invalid RAM location specified. 000D 009A 00035 movwf oscstat 000E 018C 00036 clrf trisa;clrf TRISIO Warning[219]: Invalid RAM location specified. 000F 0188 00037 clrf bsr;bcf STATUS,5;bank 0 00038 ; 0010 00039 loop 0010 018C 00040 clrf porta;clrf GPIO 0011 201C 00041 call t0_5s 0012 30FF 00042 movlw 0ff 0013 008C 00043 movwf porta;movwf GPIO 0014 201C 00044 call t0_5s 0015 2810 00045 goto loop 00046 ; |
Warningが出ているところを見ると
0006 0088 movwf bsr
0009 0088 movwf bsr
000D 009A movwf oscstat
000F 0188 clrf bsr
となっています。
最初の4桁はマシン語プログラムのアドレスです。
次の4桁はマシン語コードです。
次の5桁は行アドレスなので省略しました。
最後はソースプログラムのニーモニック命令です。
マシン語コードの末尾の7ビットがレジスタアドレスを示しています。
bsrが08、oscconが1Aに置き換えられていることが分かります。
PIC12F1612のSFRは[第310回]で説明しました。
どちらも正しく置き換えられていることがわかります。
ところで。
問題のCONFIGです。
上のリストの先頭を見るとCONFIG行は
2007 3FF5になっています。
下はアセンブルの結果作成されたHEXファイルです。
:020000040000FA :020000000528D1 :06000A00033088008C01A8 :10001000013088006830990058309A008C018801BE :100020008C011C20FF308C001C201028FA30A0000E :100030000000A00B18280800FA30A1001620162096 :06004000A10B1E280800C0 :02400E00F53F7C :00000001FF |
CONFIG行はファイルの終わりに記述されます。
02400E00F53F7C
です。
HEXファイルについてはどこかで説明したと思います(どこだか忘れてしまいました)。
こんなときにはGoogleが役に立ちます。
「中日電工 インテルヘキサファイル」で検索すると、ほらトップに表示されました。
しっかり「備忘録」として役に立っています。
えっと。
「PICBASICコンパイラ」[第193回]で説明しておりました。
リストファイルのアドレスは2007ですがHEXファイルでは400Eになっています。
PICプログラムは16ビット表記ですがHEXファイルは8ビットのファイルなので16ビットアドレスの2007を8ビットのアドレスにすると400Eになります。
またリストファイルのマシン語コードも16ビット(8ビット×2桁)を上位8ビット下位8ビットの順で記述していますがHEXファイルはそこを8ビットアドレスの順に表記しています。
リストファイルの3FF5はHEXファイルではF53Fになっています。
ここはPIC12F629のCONFIGのままですから変更が必要です。
最後の仕上げです。
上のHEXファイルをTeraPadで開いて下のように書き換えました。
:020000040000FA :020000000528D1 :06000A00033088008C01A8 :10001000013088006830990058309A008C018801BE :100020008C011C20FF308C001C201028FA30A0000E :100030000000A00B18280800FA30A1001620162096 :06004000A10B1E280800C0 :02400E00FC317C :00000001FF |
PIC12F1612の今回のテストプログラムではCONFIG1の値は31FCにすればよいはずです。
PICのCONFIGは実にわかりにくいです。
それで駄目なら考え直します。
なお書き換えた行の末尾のチェックサムはPICWRITERでは参照していませんからもとのままにしておきます。
下はPIC12F1612のCONFIG1です。
[出典]Microchip Technology Inc. PIC12F1612 Data Sheet
ひとつ気になる点があります。
PIC12F1612のCONFIGはCONFIG1のほかにCONFIG2があります。
CONFIG2は何も定義していませんからデフォルトのままになるはずです。
それでよいかという疑念です。
下はPIC12F1612のCONFIG2です。
[出典]Microchip Technology Inc. PIC12F1612 Data Sheet
bit 8のPLLENがちょっと気になります。
実行してみればわかると思います。
超ローコストPICWRITERの製作[第312回]
2025.7.8 upload
前へ
ホームページトップへ戻る