2025.7.8
前へ

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


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

前へ

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