体当たりの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;
}