超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第309回]
●PIC12F1612(2)PIC12F629のSFR
突然のアクシデントがきっかけでこのところ久し振りにWindowsパソコンについて書いてきました。
当テーマに戻るのは2週間振りです。
PIC12F1612はPIC12F629などと同じ8pinのPICです。
なんたって8pinしかないPICですしPIC12F629のお仲間だろうぐらいのいい加減な認識でDataSheetにざっと目を通したのですが。
あれあれ?
なんだがちょっと様子が変ではないの?
前回にちょっと書きましたようになかなかにどうして機能てんこ盛りのすごいPICのようです。
まま。しかし。
それはちょっと置くことにしまして。
同じ8pinのPICだからということでとりあえずはPIC12F629用のテストプログラムを書き込んで動作テストをしてみることにしました。
PIC12F1612はPIC12F629などと同じTYPE=3でいけそうということで試しに書き込んでみたところすんなり書き込めてしまいました。
しかし順調だったのはここまでで、プログラムを書き込んだPIC12F1612をPIC12F629のときと同じテスト回路に実装して電源ONしてみたのですが全く反応がありません。
そこまでが前回の要約です。
前回の冒頭で「新しいフェーズに入ります」と書きました。
どういうことかといいますと。
PIC12F1612は比較的新しいPICで私が通常使っているMPLABではアセンブルできません。
MPLABXというのならできそうなのですがあんなものは使う気になりませぬ。
じゃあどうする?
という問題なのです。
それにもうひとつ秋月のPICプログラマPICKITUではPIC12F1612は認識できません。
多分PICKIT3かPICKIT4ならできるのでしょうけれど。
なんだか価格がハネ上がっていてたかだかウン百円程度のPICの書き込みをするのにそんなものは買う気になれません。
そういう理由もあってPICWRITERを製作しているのです。
事実PIC12F629のプログラムですけれど現在開発中のPICWRITERでPIC12F1612に書き込むことができました。
とすると問題は先に書きましたMPLAB非対応という点に絞られます。
どうしましょう。
PICWRITERで書き込みが出来たといっても肝心のプログラムのアセンブルができなかったらどうしようもないのじゃありませんか。
ま。
普通はそう考えますよね。
しかし。
私はそんなことでめげたりはしませんです。
無いものならば自分で作ってしまいます。
そう。
Z80アセンブラだって8080アセンブラだって8086アセンブラだって作ってしまいました。
それに比べればPICのマシン語命令はPIC16F/PIC12Fの場合たかだか30か40命令です。
そこまでやる気はなかったのですがこうなったら乗りかかったフネです。
ええ。作ってしまいましょう。
実はヒナ型はもうできているのです。
それについては近い内に説明いたします。
今回はもっと手っ取り早くウラ技を使うつもりです。
そのウラ技とは?
こういうところがアセンブラ、マシン語の有り難いところです。
Cコンパイラなどではどーしようもありませんでしょう。
その説明に入る前に順序としてなぜPIC12F629のプログラムがPIC12F1612では動かなかったのかということについて説明をする必要があります。
一番の原因はPIC12F629とPIC12F1612のSFR(Special Function Register)の機能に違いがあったことに加えてアドレスにも違いがあったことです。
いきなり深いところに直球ですがここを説明しないと何がなんだかわからなくなります。
ここが肝心要のところです。
PIC12F629のSFRの説明です。
[出典]Microchip Technology Inc. PIC12F629 Data Sheet
PICはI/OもTIMERなどの機能もすべてレジスタに割り付けています。
PIC12F629のテストプログラムではカウントした値をI/Oポートから出力しています。
PICのI/OポートはPORTA、PORTBなどの名前が普通ですがPIC12F629の場合にはGPIOという名前になっています。
GPIOを出力にするか入力にするかはTRISIOで設定します。
出力にしたいGPIOのビットはTRISIOの同じビットを0にします。
入力にしたいビットはTRISIOの同じビットを1にします。
そのGPIOもTRISIOもPICの特定のメモリアドレスに割り付けられています。
上の図でGPIOは05H、TRISIOは85Hに割り当てられています。
ここからがPICの肝心のところで実はPICはSFRのアクセスを普通はRAMアドレスの先頭の00〜1Fの範囲に限っています。
ユーザー用のワークレジスタのアドレスも20〜5Fの範囲に限っています。
PIC16F/12Fの場合レジスタをアクセスする命令のアドレス部分は7ビットしかありません。
アドレスとして00〜7Fの範囲しかアクセスできません。
するとここで疑問が出てきます。
上の文書によればTRISIOのアドレスは85Hです。
それじゃアクセスできないじゃないの?
普通はアクセスできません。
PICの場合にはそれをクリアするためにバンク切り換えを使っています。
80H〜FFHのレジスタはバンク切り換えによってアドレス00〜7FHとしてアクセスします。
バンク切り換えにはSTATUSレジスタを使います。
下はPIC12F629のSTATUSレジスタです。
[出典]Microchip Technology Inc. PIC12F629 Data Sheet
bit5のRP0が0のときBank0(00〜7FH)が有効になります。
bit5のRP0が1のときBank1(80H〜FFH)がアドレス00〜7FHとしてアクセスされます。
そこまで説明した上でPIC12F629のテストプログラムです。
;;;PIC 12F629 testprogram test.asm ;16/1/3 25/04/14 ;clock=4MHz #include <p12f629.inc> ; ;Program Configuration Register 1 __CONFIG _CP_OFF & _MCLRE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT ; cf=0 zf=2 f=1 w=0 ; cntr0 equ 20 cntr1 equ 21 ; org 00 goto start ; org 05 start bsf STATUS,5 ;bank 1 clrf TRISIO bcf STATUS,5;bank 0 ; loop clrf GPIO call t0_5s movlw 0ff movwf GPIO call t0_5s goto loop ; t1ms movlw 0fa;=250 movwf cntr0 t1ms2 nop decfsz cntr0,f goto t1ms2 return ; t0_5s movlw 0fa;=250 movwf cntr1 t0_5s2 call t1ms call t1ms decfsz cntr1,f goto t0_5s2 return ; end ; |
このプログラムは[第260回]でお見せしました。
このプログラムではGPIOの全てのビットを出力にするためにTRISIOを0にしています(TRISIOをクリアしている)。
TRISIOはbank1にあるのでSTATUSレジスタのビット5を1にしてからTRISIOにアクセスしています。
その後はBANK0のGPIOにアクセスするためSTATUSレジスタのビット5を0にしています。
説明の途中ですが説明が長くなりますので今回はここまでにします。
この続きは次回にいたします。
超ローコストPICWRITERの製作[第309回]
2025.7.5 upload
前へ
次へ
ホームページトップへ戻る