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


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

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