SDCCの使い方


ここではPIC16F88,PIC16F877を例にSDCCによるCプログラムの書き方を示す。


注意:下の例に示したプログラムをコピーアンドペーストしてコンパイルすると全角スペース等が入っているのでエラーが出ます。

 

【例1】  Aポート RA<7:0>に接続した8個のLEDを次のように点灯させる。○点灯(1出力),●消灯(0出力)
  ○●○●○●○●

【手順】
 1.Aポートのディレクションを全ビット出力とする。
 2.Aポートに0xAAを出力する。
【プログラム led.c】(for 16F88)
#include <pic/pic16f88.h>

//コンフィグレーションビットの設定

int at 0x2007 __config = _INTRC_IO & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _MCLR_OFF & _LVP_OFF & _BODEN_OFF;

void main(void) {

   OSCCON=0x70; //内蔵クロック8MHZを使う

  TRISA = 0x00; //全ビット出力

   while( 1 ){  //無限ループ

    PORTA = 0xAA; //Aポートに0xAAを出力

  }

}


【例2】 アナログポートAN0の電圧を8ビット幅で読み取りDポートのLEDに出力する。
【手順】
  1.アナログポートの初期設定を行う

  2.ADC制御関数を呼び出してADC値を得る

  3.ADC値をDポートに出力する。

  ADC制御関数では次の処理を行う
   1)ポートのリセット
   2)読み取りポート番号をセット
   3)AD変換開始
   4)アクイジション時間(コンデンサ充電時間)待ち
   5)サンプリング開始
   6)サンプリング終了まで待つ

   7)ADCを止める
   8)ADCの値を持ってリターン
【プログラム adc.c】(for 16F877)
#include <pic/pic16f877.h>

#define ADOSC 0x80 //ADCクロックに32TOSC(CPUクロックの32倍周期)を使う

#define ACQUI 0x18 //アクィジション時間

//コンフィグレーションビットの設定
int at 0x2007 __config = _HS_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _DEBUG_OFF & _LVP_OFF ;
//ADC読み取り関数

unsigned char get_adc(unsigned char port) {

  unsigned char i;
  ADCON0 &= 0xC0; //ポート番号などをクリア
  ADCON0 |= (port&0x07)<<3; //ポート番号セット
  ADON = 1; //AD変換開始
  for(i=0;i<ACQUI;i++); //アクィジション時間待ち
  GO=1; //サンプリングフラグを立てる(サンプリング開始)
  while(GO); //サンプリングフラグが倒れるまで待つ
  ADON=0; //AD変換停止
  return ADRESH; //上位8ビットを戻り値にしてリターン
}

//メインルーチン

void main(void){ 

  //Dポートのディレクションの設定 全ビット出力

   TRISD = 0;

  //アナログ入力 AN<7:0>の8チャンネルを使う

  TRISA = 0x1F;

  TRISE = 0x07; 
  //ADCの構成  ADFM = 0; PCFG3=0; PCFG2=0; PCFG1=0; PCFG0=0;

  ADCON1 = 0;

  // ADCクロックの設定

  ADCON0 = ADOSC;

  while(1){  //無限ループ
    PORTD = get_adc(0); //AN0のADC値を読んでPORTDに出力
  }

}


コンパイルのし方

コマンドプロンプトから次のように入力

  PIC16F88の場合  sdcc -mpic14 -p16f88 led.c
  PIC16F877の場合 sdcc -mpic14 -p16f877 adc.c


データシート(PDF)

  PIC16F88 (英文)
  PIC16F877A (英文)
  PIC16F87* (日文)



もどる