超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第311回]
●PIC12F1612(4)テストプログラム
前回書きましたようにPIC12F629のテストプログラムでは全く駄目だということがわかりました。
ではどこをどのように直したらよいのかそこを考えてみました。
PIC12F1612のテストプログラムを書くのは難しいことではありません。
それは今まで他のPICでもやってきました。
問題はただ書いただけでは駄目だということです。
私の現在の環境ではPIC12F1612のソースプログラムはアセンブルできません。
現在開発中の自前のPICWRITERを使えばPIC12F1612にプログラムを書き込むことができるということは既に確認しています([第308回])。
そのときはPIC12F629のためのHEXファイルを読み込んでそれをPIC12F1612に書き込みました。
PIC12F1612のためのHEXファイルを作成するにはPIC12F1612のソースプログラムをアセンブルできるアセンブラが必要です。
勿論ここまで来たからにはそれは近日中に作ってしまうつもりです。
それは正攻法なのですが。
正攻法ではなくても「とりあえず」ということならここは奇策で行ってみたいと思います。
マシン語が理解できればこういう面白い策もあるのです。
元にするのは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にしています。
前回書きましたようにそこの部分が大きく変わります。
それとほかに2点新たに加えなければならないことがあります。
その一つ目はアナログ端子の処理です。
PIC12F1612のI/Oポートの端子には別の機能の入出力が多重に割り当てられています。
一番問題なのはアナログの機能です。
I/Oポート(デジタル)端子にアナログ機能が割り当てられているPICではデフォルトではアナログが有効になっています。
その端子を普通にデジタルのI/Oポートとして使うためにはアナログ機能をディスイネーブルにしなければなりません。
PIC12F1612の場合それはANSELAレジスタの該当するビットを0にすることです。
それからもうひとつは内蔵クロック発振モードの指定です。
PIC12F629は内蔵クロック発振モードを指定するとクロックは4MHzになります。
PIC12F1612ではさらに発振する周波数を選択する必要があります。
デフォルトの周波数でもいいのですがせっかくなのでここはPIC12F629と同じ4MHzを指定してみます。
ここのところはちょっと面倒です。
以上を考慮してPIC12F1612のためのテストプログラムをウラ技的に書くとこうなります。
;;;PIC 12F1612 testprogram from pic12f629test.asm ;25/07/4 ;clock=4MHz #include <p12f629.inc>;***************** ; __CONFIG _CP_OFF & _MCLRE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT;*************** ; cf=0 zf=2 f=1 w=0 ; bsr=08 porta=0c;bnk0 trisa=0c;bnk=1 osccon=19;bnk=1 oscstat=1a;bnk=1 ansela=0c;bnk=3 cntr0 equ 20 cntr1 equ 21 ; org 00 goto start ; org 05 start movlw 3 movwf bsr clrf ansela movlw 1;bsf STATUS,5 ;bank 1 movwf bsr movlw 68;PLL disenable,intosc=4MHz movwf osccon movlw 58;HFINTOSC movwf oscstat clrf trisa;clrf TRISIO clrf bsr;bcf STATUS,5;bank 0 ; loop clrf porta;clrf GPIO call t0_5s movlw 0ff movwf porta;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 ; |
ANSELAはBANK3にあります。
最初にその部分を書き加えました。
次にクロックモードの指定をしています。
関係するレジスタはOSCCONとOSCSTATです。
いずれもBANK1にあります。
ここの部分の詳細は説明がしつこくなりますから省略します。
そしてTRISAもBANK1にあります。
最後にBANK0を選択します。
BANKの切り換えはBSRで行ないます。
ここからがウラ技です。
MPLABではPIC12F1612のプログラムはアセンブルできません。
そこをウラ技でムリムリにアセンブルさせてしまいます。
このソースプログラムにはそのためのシカケがいくつかあります。
最初の仕掛けは
#include<p12f629.inc>
です。
MPLABはPIC12F1612のプログラムはアセンブルできませんがPIC12F629のプログラムならアセンブルできます。
ですからp12f629.incをインクルードして、このプログラムはPIC12F629のプログラムだとMPLABに告げています。
そんなことをしてもいいの?
実はこれはその下にあるCONFIGのための宣言です。
こうしないとHEXファイルにCONFIGのための記述が行なわれません。
もっともこのCONFIG文はPIC12F629のためのものなのでPIC12F1612には意味がないのですけれどそれでもヒナ型は必要です。
それからbsr=08以下PIC12F1612のSFRのアドレスを記述しています。
これもウラ技です。
これで本当にPIC12F1612のHEXファイルが作れるのか?
ということなのですが。
あいかわらず多忙で時間がありません。
説明の途中ですが今回はここまでです。
この続きは次回にいたします。
超ローコストPICWRITERの製作[第311回]
2025.7.7 upload
前へ
次へ
ホームページトップへ戻る