楽天市場
[無料でホームページを作成] [通報・削除依頼]

1kワードのTINYBASIC その3

久々の更新になります。
前回はRAM容量512バイトのPIC16F1704を対象に1kワードTINYBASICの搭載を検討しました。
 
今回RAM/Flash容量がPIC16F1704の半分のPIC16F1703(PIC16F18323)をターゲットに、1kワードのTINYBASIC
の搭載を検討しましたのでご紹介します。
 
PIC16F1703はUART非搭載のため、ソフトウエアシリアルを使用します。
また、プログラムを手直しすればPIC16F18313にも搭載可能です。
 
TXはRC4、RXはRC5に割付けられています。PIC16F1703では9600bps、PIC16F18323では19200bpsで通信します。
PICにはリセット回路とリセットSWを設けてください。
flash領域へのBasicプログラム書き込みにはTinyMultiBootloader+を使用します。
 
;-----------+---------+---------+----+---+
;PIC DEVICE |Flash(kw)|RAM(byts)|UART|PIN|
;-----------+---------+---------+----+---+
;PIC16F1705 |8kw      |1024     |Yes |14 |
;-----------+---------+---------+----+---+
;PIC16F1704 |4kw      |512      |Yes |14 |
;-----------+---------+---------+----+---+
;PIC16F1703 |2kw      |256      |No  |14 |
;-----------+---------+---------+----+---+
;PIC16F18323|2kw      |256      |Yes |14 |
;-----------+---------+---------+----+---+
;PIC16F18313|2kw      |256      |Yes |8  |
;-----------+---------+---------+----+---+
 
 
紹介する本人が云うのもアレですが、このクラスのPICでBASICを使いたいとなるとインタープリタはあきらめて
"Great Cow BASIC"や"PICBASIC Pro"のようなBASICコンパイラを使うのが速度やコードサイズの面で無難です。
と最初にお断りしておきます。
 
 
 
<機能と制約>
使用可能なコマンドは前回PIC16F1704で提示したものと同一ですが、
flash領域にプログラムを記述する場合に、使用できる行番号が1~126の最大126ラインとなることが新たな制約です。
 
 
<PIC16F1703/PIC16F18323のメモリーマップ >
◎左側:flash領域、右側:RAM領域、106バイトはユーザープログラムとスタックの合計
◎左側:flash領域のユーザープログラム領域は768ワードしか無いため、仮想のflash領域を設けプログラムエリアを倍化します。
◎仮想flash領域は7bit長のため、HEXファイルに16進で記載できる行番号の上限は8bit(PIC16F1704)の時の半分の126となります。
(HEXファイル上で127=$7Fはエンドコードとして使用されるため、行番号として使用不可。)
img_20190623-024210.jpg
 
 
<1kWBASICで使用する特別なアドレス>
◎前回PIC16F1704との相違点を赤文字で記載しています。
PIC16F1703では$007Fのレジスタをソフトウエアシリアルの送受信バッファーとして使用するため、自由に使用できません。
img_20190623-024324.jpg
 
 
<flash領域のBASICプログラムを実行する方法>
手順はPIC16F1704の時と一緒です。
ランチャーで1(Basic)を選択した後、$0070:$0071には仮想flash領域のアドレス$4800を入力します。

ループ処理
img_20190623-024420.jpg

文字列の表示
img_20190623-024455.jpg


 
<Hexファイルの作成方法>
BasicファイルからTinyMultiBootloader+で書き込み可能なHexファイルを生成するTeraTermのマクロを作成しました。
 
◎手順
①Basicファイルの作成
_TEST.BAS(任意)という名前のBASICファイルを作成し、任意のフォルダーに保存。
img_20190623-024620.jpg
②マクロの起動
Basic2Hex(7bits).ttlをttpmacro.exeから起動し、_TEST.BASを選択してOpenをクリック。
(Basic2Hex(8bits).ttlはPIC16F1704版で使用する)
img_20190623-024717.jpg


 
③Hexファイルの生成
_TEST.BASと同一のフォルダーに_TEST.BAS.HEXが生成される。
img_20190623-024755.jpg
<仮想フラッシュの考えかた>
 
◎PIC16F1703/PIC16F18323で使用しているFSRアドレス
0x0000~0x0FFF:Core Registers、Special Function Registers (SFR)、Common RAM または General Purpose RAM
0x2000~0x20EF:General Purpose RAM
0x7000~0x70FF:EEPROM (PIC16F18323のみ) 追記.2019.07.09
0x8000~0x87FF:Flash
 
◎未使用のFSRアドレス0x4800~0x4DFFの領域に仮想フラッシュを設定。
;-------------+------+-----+
;Virtual flash|NVMADR|Carry|
;-------------+------+-----+
;$4800        |$0400 |0    |
;-------------+------+-----+
;$4801        |$0400 |1    |
;-------------+------+-----+
;$4802        |$0401 |0    |
;-------------+------+-----+
;$4803        |$0401 |1    |
;-------------+------+-----+
;             |      |     |
;-------------+------+-----+
;$4DFE        |$06FF |0    |
;-------------+------+-----+
;$4DFF        |$06FF |1    |
;-------------+------+-----+
 
◎FSRレジスタアクセス時、FSR0Hレジスタの6ビット目が1(仮想フラッシュ)の時のみNVMDATレジスタの値を返す、
それ以外の時はINDF0レジスタの値を返す。
 
◎仮想フラッシュアドレスから実フラッシュアドレスへの変換
①FSR0Hレジスタをゼロ詰めで右シフトしWレジスタに代入、Carryをセット。
 FSR0=$4821のときW=$24、Carry=0
②FSR0Hレジスタの6ビット目に相当するWレジスタのの5ビット目をクリアし、NVMADRHレジスタに代入。
 NVMADRH=$04
③FSR0Lレジスタをキャリー詰めで右シフトしWレジスタに代入、Carryをセット。
 W=$10、Carry=1
④WレジスタをNVMADRLレジスタに代入。
 NVMADR=$0410、Carry=1
⑤NVMDAT(14ビット)を読み込み、Carry=0のときは上位7ビット、Carry=1のときは下位7ビットをWレジスタに代入
 Wレジスタが0の時、Zフラグ=1となる
⑥Wレジスタが$7F(=127)の時はWレジスタを$FF(=255)に変換、Wレジスタの値をAregに代入。
 $7F->$FFへの変換はエンドコードの処理で必要
 
◎実際のコード例
img_20190625-213843.jpg
 
 
PIC16F1703(PIC16F18323)版のアセンブラソースと変換マクロのダウンロードはこちらから
注)アセンブラはGPASMでコンパイルされています。
 
https://drive.google.com/file/d/16UK9O3a0eiR8KI29qocbDFrWDGbwU0VP/view?usp=sharing