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

1kワードのTINYBASIC その5

◎1kワードTINYBASICのプログラム例

以前、1kワードTINYBASIC使用のメリットとして、PICのペリフェラルにアクセスできることを挙げました。

その一例として、1kワードTINYBASICでプログラムした時計をご紹介します。

使用したPICはPIC16F18313です。TXはRA4、RXはRA5に割り付けられ19200bpsで通信します。

img_20190712-114309.jpg

このプログラムはPIC16F18323でもそのまま作動しますが、PIC16F1703ではTMR0のハードウエア構成が異なるため作動しません。

2019.07.09 追記
OSCTUNEのアドレスの記述に間違いがありましたので下図と本文を修正しました。ダウンロードファイルを更新しました。


◎PIC16F18313のフラッシュに書き込まれた時計のプログラム
img_20190709-075234.jpg

◎プログラムの説明
10行目 $008はINTCONレジスタ 初期状態ではBASICインタープリタがTMR0のオーバーフロー割り込みを
    使用していますので、GIEをクリアして割り込みを禁止し、TMR0を解放します。
15行目 $91EはOSCTUNEレジスタ 一秒の微調整にOSCTUNEを使用します。
20行目 $017はT0CON0レジスタ TMR0を8bitモードで使用します。TMR0は作動停止。
22行目 $015はTMR0Lレジスタ TMR0のカウンタ値をクリアします。
24行目 $016はTMR0Hレジスタ TMR0のコンペア値を243に設定します。
              TMR0のコンペア値の設定は正しくは243ですが、OSCTUNE=$3Eの条件下で実測の結果244のほうが
              時間誤差を小さくできましたので244を採用しました 。2019.07.10 追記(印加電圧の差や個体差あります)

26行目 $018はT0CON1レジスタ Fosc/4をクロックソースに選択、TMR0のプリスケールを32768に設定します。
    PICのFoscは32MHzですので、Fosc/4は8,000,000Hz、
             プリスケールを含めたカウント値は32768x244=7,995,392なので約1秒でTMR0のオーバーフローが発生します。
              正確な1秒ではありませんので、先述のOSCTUNEレジスタで1秒を微調整します。
    (Fosc/4のクロック値をカウンタ値に寄せる)
28行目 $010はPIR0レジスタ TMR0のオーバーフローフラグをクリアします。
3X行目 変数H,M,Sに現在の時刻を入力します。
40行目 現在の時刻を表示します。
50行目 TMR0作動開始。
60行目 TMR0のオーバーフローフラグがセットされるのを待ちます。
70行目 セットされたオーバーフローフラグをクリアします。
8X行目 時刻の繰り上がり処理。変数Nは秒値と分値の論理和で秒、分ともに0の時だけ0になります。
90行目 現在の時刻を表示します。
99行目 無限ループ

※各レジスタへのアクセスはFSRレジスタを経由して行われますので、アセンブラの時のようにバンクの考慮は不要。
※上図にて零時零分ニ秒の時点でEscキー入力によりプログラムを停止しています。



前回のPIC16F18323用のBASICインタープリタのConfig記述に不足の点があり修正しました。
インタープリタで、EEPROM の内容が正しく読み出せないバグがあり、修正しました。 2019.07.09 追記
PIC16F18313用のBASICインタープリタとともにこちらからダウンロードできます。

https://box.yahoo.co.jp/guest/viewer?sid=box-l-ynvbblq5wtn3l5nx64zrgryqbm-1001&uniqid=e058eee1-7716-4b3a-ae79-cd2762c05f6f&viewtype=detail

https://drive.google.com/file/d/1AHCD3GYllqQYKs0XYlMYho8SxouKseKA/view?usp=sharing