| 体当たりのSDCCの小部屋 独断と体当たりで、PICなるものを成敗しようとたくらむページです はじめに、当初”キットで遊ぼう電子回路シリーズNo.6”でひととおり確かに遊びましたが、不満です。 16F84Aって過去の遺物的存在になりつつあるようで、世の中はdsPICです。トラ技のおまけにもなってるし。でも、マルツのCPUは1980円です。これなら、H8/3052の方が慣れてるよ。デジタル信号使わないし。 てなわけで、まずは、PIC C Liteを捨てます。(これってほぼ16F84だけしか使えないじゃん。) 世の中捨てたものじゃなく、SDCCなるフリーコンパイラがあるじゃないですが、これは、デバイス制限ありません。また、PICだけではなくいろいろなデバイスにも対応しています。 まずは、18ピンの16F88、16F628と見てみますと、コストパフォーマンス的には16F648Aがいいじゃないの、ということになり、まずはこれに特化して遊ぶことにします。 |
| SDCCの環境づくり | |
| まずは、SDCCなるコンパイラをゲットしましょう。 こちらがダウンロードページです。さしあたり、最新の日付のものをいただきましょう。自分は2007/08/07のものを使っていますが、すでに過去のもののようです。 たぶん、exeとzipは同じものだと思います。圧縮してるかどうかの違いだけかな? |
![]() |
| 16F84A のサンプルを 16F648A で動かす | |
| 非常に単純なことなのですが、右のソースがサンプルです。これは、PIC CLiteでコンパイルできます。 ポートAを読んで、ポートBに出力する。というものです。ioportは、ポートの入出力の設定です。どうやら、ビットを立てると入力のようです。 このまま、SDCCでコンパイルすると、インクルードのヘッダファイルが見つからないエラーは当然ですが、__CONFIGにもなにやら文句を付けてきます。 気を取り直して、Webをあさると、 PIC16F628のページに(当然SDCCです) tsmtypes.h " // Set the __CONFIG word: // I usually set it to _EXTCLK_OSC&_WDT_OFF&_LVP_OFF&_DATA_CP_OFF&_PWRTE_ON Uint16 at 0x2007 __CONFIG = CONFIG_WORD; などと書いてあります。ヘッダファイルは、意味不明ですが、Uinit16を16ビット変数として定義しているので、パクリます。 また、_EXTCLK_OSは、外部クロック発信でしょうから、クリスタルを使う場合は明らかに違います。 ここは、おそらく_HS_OSC でしょう。この辺はPIC16f628a.hからのパクリです。_XT_OSC と_HS_OSCのいずれかでしょうが、HSはHightSpeedの意味があると小耳に挟んだので。XTももちろんクリスタルの定義ですが。 |
#include<pic.h> __CONFIG(HS & WDTDIS & PWRTEN & UNPROTECT); void ioport(void); void main() { ioport(); while(1) { PORTB=PORTA; } } void ioport(void) { TRISA=0x0f; TRISB=0; } |
| という事で、ひとまず右のようなソースにしてみました。 ちゃんとコンパイルが通ります。当然、PICに書き込んで実行しますが、動きません。なんじゃこりゃ、ぼけ〜!です。意味もわからずパクリだけでは、世の中通用しないようです。またWebをあさります。 PIC16F628事始のページで、 コンパレータのアナログ入力 命令 movlw 0x07 movwf CMCON を追加することによりディジタルI/Oに初期設定する を発見しました。でもここってアセンブラのページなのね。 clrf PORTA ; @Chg movlw 0x07 ; @Chg コンパレータOFF movwf CMCON ; @Chg ディジタルI/Oとして定義 ; ; ------ I/O定義 ------ bsf STATUS,RP0 ; bank1へ切り替え movlw 0xf0 movwf TRISA ; PORTA 下位4ビット出力定義 bcf STATUS,RP0 ; bank0へ戻す お〜っ。アセンブラです。赤いところが問題の場所です。 右のソースをコンパイルしても、この部分がありません。 じゃあ追加すればいいじゃん。てことで。 |
#define __16f648a #include "pic/pic16f648a.h" #include "tsmtypes.h" Uint16 at 0x2007 __CONFIG = _HS_OSC & _WDT_OFF & _LVP_OFF & _DATA_CP_OFF; void ioport(void); void main() { ioport(); while(1) { PORTB=PORTA; } } void ioport(void) { TRISA=0x0f; TRISB=0; } |
| 右のソースを作ってみました。このCMCON なる変数は、 pic16f648a.hにも定義されているので、何らかの意味を持 つのでしょう。このまま、パクリます。コンパイルすると 、ちゃんとPIC16F628事始のソースのように、アセンブラソ ースが吐き出されました。 このまま、ライターで書き込み、実行すると、ボタンを押 すとLEDちかちかです。うおぉぉ〜。出来たーぁ! |
#define __16f648a #include "pic/pic16f648a.h" #include "tsmtypes.h" Uint16 at 0x2007 __CONFIG = _HS_OSC & _WDT_OFF & _LVP_OFF & _DATA_CP_OFF; void ioport(void); void main() { ioport(); while(1) { PORTB=PORTA; } } void ioport(void) { CMCON=0x07; TRISA=0x0f; TRISB=0; } |