超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第329回]
●PIC16アセンブラ(9)機能追加(FSR)
前回までしばらくの間はPIC18アセンブラについて書いてきましたがPIC18アセンブラは前回で一応の完成を見たと思います。
その前にはPIC16アセンブラについて書いてきました。
PIC16アセンブラについては[第321回]で一応完成したとしてその次からはPIC18アセンブラの作成作業に着手したのでした。
PIC18アセンブラの作業に入った当初はPIC16アセンブラとほぼ同じ機能にするつもりでした。
ところが実際に作業してみるとあらためてPIC18FのSFR(Special Function Register)の数の多さを実感することになりこれをユーザー定義の通常レジスタと同じようにユーザープログラムの先頭で定義するのでは余りにプログラム作成の負荷が大きいと思わざるを得ませんでした。
MPLABのPICアセンブラではSFRの定義はそれぞれのPICごとに用意されたINCファイルをユーザプログラムの先頭でインクルードすることでその問題を回避しています。
やっぱりその方法が最善のようです。
PICアセンブラのINCファイルはMPLABをダウンロードすると展開されるMPASM Suiteフォルダに収められています。
それをそのまま利用できればよいのですがそうすると私が作成したPICアセンブラを使うためにはユーザーがそれぞれにMPLABをダウンロードしなければなりません。
MPLABも今ではMPLAB Xになっています。
それを使いたくないから自前のPICアセンブラを開発したのにそれでは何をやっているのかわからなくなってしまいます。
ということになりますと私自身が作業してINCファイルに代わるものを作るしかありませんでしょう。
もちろん膨大な数のPICのINCファイルを全て作成するなんてことはとてもできません。
せめて秋月などで普通に入手できるPICのうちのできるだけ安価で使い易いものに的をしぼって作成することになります。
そのように腹を決めたので実際にサンプルとしてPIC18アセンブラに組み込んだのでした。
前書きが長くなってしまいました。
そういうことでPIC18アセンブラについてはSFR用のTXTファイルを用意してそれを組み込むことにしました。
ということになりますと。
一応は完成したつもりになっていたPIC16アセンブラについてもやらないわけにはいきませんでしょう。
その作業そのものはそれほど手間のかかる作業ではなかったのですがプログラムを変更する過程でついうっかりポカをやってしまったりして思わぬ時間を浪費してしまいました。
今後のために恥ながら備忘録として書いておくことにします。
今回うっかりはまってしまったC++の注意すべき点です。
プログラムの変更に伴って配列のサイズを大きくしたのですが。
その変更作業に漏れがあったために同時に変更すべき配列の一部がもとのサイズのまま残ってしまいました。
テストの過程でその配列のサイズを越えてアクセスしたためにシステムがハングアップしてしまいました。
このエラーの出所がなかなかわからず随分無駄に時間を費やしてしまいました。
C++プログラムをコンパイルする時点では(C++に限りませんが)配列の範囲を超えてアクセスするなんてことは想定できませんからそこはユーザープログラムで範囲を超えないようにガードしておかなければなりません。
それはもちろんそのようにしていたのですがまさかサイズを拡大し忘れていた配列があったなんて想定外でありました。
さてさてやっと本題です。
とにかくそのようにしましてPIC16アセンブラにもSFRの機能を組み込みました。
PICアセンブラでは英大文字は使わないというルールでしたがそこはルールを変更します。
SFRはData Sheetに記載されている通りのSFR名で英大文字で記載します。
PIC16アセンブラはPIC12F1612のためのプログラムを使ってテストをしました。
テストプログラムのにアセンブルリストは[第317回]でお見せしました。
これはSFRについて機能追加する前のリストですが比較のためにまずはそのリストを再掲します。
もとのリストは結構長いのですが比較の対象にするのはSFRについての命令部分だけですから今回は途中までを示すことにして後ろの部分は省略しました。
******* 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 ; |
SFRに関係する部分はプログラムの先頭部分でSFRのアドレスを定義しているところです。
bsr=08〜ansela=0cです。
あとはstartから後ろでSFRを使っている命令部分です。
下は今回の機能追加により上のテストプログラムのSFR部分を変更したあとのアセンブルリストです。
こちらも後半は省略しました。
0000 #include <p12f1612.inc>;***************** 400E FC31 config1=31fc 4010 FF3E config2=3eff 4012 9F3F config3=3f9f 0000 20 cntr0=20 0000 21 cntr1=21 0000 org 00 0000 0528 goto start 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 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 t1ms |
今回の変更により#include文は必須になりました。
PIC18アセンブラと同様インクルードファイル名の拡張子はincですが実際にはSFR情報のみを記載した同名のTXTファイルが引用されます。
それを引用しますからユーザープログラムの先頭に記載していたSFRのアドレスの定義は不要になりました。
それからstartの後ろの命令文で使っているSFR名は全て英大文字に変更しました。
参考までに上記でPIC16アセンブラが引用したp12f1612.txtファイルの中身(一部)を下に示します。
PIC12F1612のSFRは[310回]でData Sheetをコピーした画像を掲載しています。
超ローコストPICWRITERの製作[第329回]
2025.8.31 upload
前へ
次へ
ホームページトップへ戻る