マカロニペンギンの健忘録

特にテーマを決めているわけじゃないが、私が気になったことを書いていく予定です。

PICでA/D変換をしてみた

2011年04月16日 | 電子工作
あいかわらず、PICを理解するのは一苦労だ。
おかげで、英語アレルギーが少しは治ってきたような気がする。
ただ、学生の頃にこんなに英語に接していたら今のオレはなかっただろうな・・・

A/D変換を理解するだけで、貴重な休日を丸々一日費やしてしまった。
なんとかならんものかのぉー

今回の落とし穴は数々あったが、一番の落とし穴は抵抗無しのLEDを5つ以上PICに繋ぐと誤動作をすると言うことに気がつかなかったことです。
「お約束は守りましょう」と言うことです。

とりあえず、サーミスタを接続して、温度測定みたいなことをしています。

// Analog to Digital Converter
// PORTB = LED * 8
// RA2 = Variable Register
// Internal OSC

#include "pic16f88.h"
#include "htc.h"
#define _XTAL_FREQ 8000000

__CONFIG(FOSC_INTOSCIO & WDTE_OFF & MCLRE_OFF & BOREN_OFF & LVP_OFF & WRT_OFF & DEBUG_OFF);
//intrc & watch dog off & BOR disabled & Low-Voletage disabled & Write protection off & Degugger enabled

void init(void){
OSCCONbits.IRCF = 7; //Inernal RC Oscillater Frequency = 8MHz
OSCCONbits.SCS = 0; //
CCP1CONbits.CCP1M = 0;
TRISA = 0b00000100; //RA2=Input Other=Output
TRISB = 0b00000000; //All=Output
ANSEL = 0b0000100; //RA2 = Analog,Other = Digital
ADCON1bits.VCFG = 0b00;//A/D Voltage Reference
ADCON0bits.CHS = 0b010;
ADCON1bits.ADCS2 = 0b0;
ADCON0bits.ADCS = 0b10;
ADCON0bits.ADON = 1;
ADCON1bits.ADFM = 1;
GIE = 0;
PEIE = 0;
}

void main(void){
init();
while(1){
ADCON0bits.GO_DONE = 1;
while (ADCON0bits.GO_DONE);
PORTB = ADRESL;
RA0 = ADRESH & 0b1;
RA1 = (ADRESH >> 1) & 0b1;
__delay_ms(1000);
}
}

最新の画像もっと見る

コメントを投稿