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はエンドコードとして使用されるため、行番号として使用不可。)

<1kWBASICで使用する特別なアドレス>
◎前回PIC16F1704との相違点を赤文字で記載しています。
PIC16F1703では$007Fのレジスタをソフトウエアシリアルの送受信バッファーとして使用するため、自由に使用できません。

<flash領域のBASICプログラムを実行する方法>
手順はPIC16F1704の時と一緒です。
ランチャーで1(Basic)を選択した後、$0070:$0071には仮想flash領域のアドレス$4800を入力します。
ループ処理
ループ処理

文字列の表示

<Hexファイルの作成方法>
BasicファイルからTinyMultiBootloader+で書き込み可能なHexファイルを生成するTeraTermのマクロを作成しました。
◎手順
①Basicファイルの作成
_TEST.BAS(任意)という名前のBASICファイルを作成し、任意のフォルダーに保存。

②マクロの起動
Basic2Hex(7bits).ttlをttpmacro.exeから起動し、_TEST.BASを選択してOpenをクリック。
(Basic2Hex(8bits).ttlはPIC16F1704版で使用する)

③Hexファイルの生成
_TEST.BASと同一のフォルダーに_TEST.BAS.HEXが生成される。

<仮想フラッシュの考えかた>
◎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
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への変換はエンドコードの処理で必要
◎実際のコード例

PIC16F1703(PIC16F18323)版のアセンブラソースと変換マクロのダウンロードはこちらから
注)アセンブラはGPASMでコンパイルされています。
https://drive.google.com/file/d/16UK9O3a0eiR8KI29qocbDFrWDGbwU0VP/view?usp=sharing
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT