PICBASICコンパイラ
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第194回]
●PIC16F1827(7)テストプログラム
前回まででPIC16F1827に対するPIC WRITERプログラムは一部をはしょってはいますがおおまかにはめでたく完成いたしました。
それで次いこう、でもよろしいのですが。
PIC WRITERプログラムを作るのが目的だといっても肝心のPIC16F1827が動いてくれないプログラムを書いてみたってそれじゃあ最後の詰めの動作確認ができません。
ということになりますとまずはテストプログラムから作らなければなりません。
ところがこのPIC16F1827は結構クセツヨなPICなのです。
ま。このPICに限ったことじゃありませんけれど。
そこは悪名高き(?)PICアセンブラであります。
もうPICごとに見事に仕様が異なっていたりします。
端子配列はPIC16F628などと同じなのですが、そのつもりでPIC16F628のプログラムを流用しようとしてもそんなに甘いもんじゃないのですよねえ。
PIC16F628はWindows98SEに仕込んでいるMPLAB IDEv8.40でもアセンブルしてくれるのですが、そもそもそのバージョンではPIC16F1827は未知のPICになってしまいます。
Windows7にインストールしたv8.92ではアセンブル可能です。
もちろんPIC16F628のノリで適当なプログラムを書いてもすんなりとは通してくれません。
例によってCONFIGでつかえてしまいます。
下はPIC16F1827で一応動くプログラムです。
ここで「一応」と書いたのには訳があります。
そのことについては後ほど説明をするつもりです。
以前お見せしたPIC18F45K50用のテストプログラム([第175回]参照)をもとにして作りました。
ごくごく簡単なプログラムです。
256msecごとにPORTAからカウント値を出力します。
カウントついでにPORTBから1μsecごとに1、0を交互に出力します。
;;;pic p16f1827 test ;25/1/3 1/4 ; #include<p16f1827.inc> ;cpuclock=32MHz(4xPLL),internal OSC ; __CONFIG _CONFIG1,_FOSC_INTOSC & _WDTE_OFF __CONFIG _CONFIG2,_PLLEN_ON ; w=0 f=1 c=0 z=2 ; cntr0=20 cntr2=21 testcntr=22 testcntr2=23 ; org 0 goto start ; org 5 start banksel ANSELA;BANK3 clrf ANSELA clrf ANSELB ; banksel TRISA;BANK1 clrf TRISA clrf TRISB movlw 0f3 movwf OSCCON ; banksel LATA;BANK2 ; testloop movf testcntr,w movwf LATA testloop2 call t1ms decfsz testcntr2 goto testloop2 decf testcntr goto testloop ; ;1msec timer t1ms movlw 0a;=10 movwf cntr2 t1ms2 call tm100micros decfsz cntr2 goto t1ms2 return ; tm100micros movlw 64;=100 movwf cntr0 tm100micros2;1micros nop nop nop movlw 0ff;1/8 xorwf LATB;1/8 decfsz cntr0;1/8 goto tm100micros2;2/8 return ; end ; |
もとのプログラムとCONFIGの表記が全然違います。
PIC16F1827の場合CONFIGはこのように書かなければいけません。
なんだかなあ。
こんな書き方はp.16F1827.incを見ても書いてありません。
PIC16F1827を初めてさわったのはもう5年ほど前のことになります。
当時のことはすっかり忘れてしまいましたが多分GOOGLEさまのお力でなんとか情報を確保したのだろうと思います。
それともうひとつ。
PIC16F1827はSFR(Special Function Register)がPIC16F628などに比べて格段に多くなっていてかつそれが多バンクにわたって貼り付けられています。
ごくごく限られたベーシックなSFR以外はアクセスの度にバンクを切り換えなければなりません。
なかなかに厄介です。
DatasheetのサンプルプログラムによるとSFRのバンク切り換えにはBANKSELという命令を使えとのご託宣です。
ところがBANKSELなんて命令はPIC16F1827の命令一覧にはないのですよねえ。
どうやらPICアセンブラの擬似命令のようであります。
それにしてもどうしてこんなに細かくメモリバンクを割っているのでしょう。
[出典]Microchip Technology Inc.PIC16F1827DataSheet
[出典]Microchip Technology Inc.PIC16F1827DataSheet
[出典]Microchip Technology Inc.PIC16F1827DataSheet
[出典]Microchip Technology Inc.PIC16F1827DataSheet
なんと32バンクもあります。
もううんざりしてしまいます。
もっともよくよく見てみると実際にSFRが割り当てられているのはBANK0〜BANK8までで残りは同じベーシックなSFRのみアクセスできます。
アドレス00〜0Bは共通のアクセスになっています。
32バンクもあるのはユーザー用のRAMがアドレス70〜7Fに割り当てられているからのようです。
なんでこんな面倒なことになっているのか。
どうせ必要なメモリ量は同じなのだからこんなに細かく多バンクに分けなくても線形に配置すればすっきりするはずなのに。
アドレスを線形にせずにバンクに分ける理由はただひとつ。
アドレスのビット数が足りないからです。
なるほどそういうことか。
こちらはPIC16F1827の命令フォーマットです。
[出典]Microchip Technology Inc.PIC16F1827DataSheet
PIC16F1827の命令長は14ビットです。
なぜ16bitではなくて半端な14ビットなのか。
多分そうしなければならない訳があるのでしょう。
最上部の2つを見ると’f’が7ビットになっています。
ここがターゲットのレジスタアドレスです。
7ビットしかありませんから直接アクセスできるアドレスは00〜7Fの範囲になります。
(それ以上の範囲のメモリにアクセスするには間接アドレッシングを使います)
とりあえずは納得です。
PICBASICコンパイラ[第194回]
2025.1.7 upload
前へ
次へ
ホームページトップへ戻る