2025.8.31
前へ
次へ
ホームページトップへ戻る


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

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