kuroの覚え書き

96の個人的覚え書き

AD変換とシリアル通信



┌─┬─┐ +5v
+5v ┤   ├ GND |
┤   ├470Ω-volume
Tx ┤   ├ |
+5V-1kΩ ┤   ├ GND
└───┘


ソース

675ad.c


#include <pic.h>
#include <stdio.h>
#include "delay.h"
#include "adc.h"
#include "putch.h"

__CONFIG(UNPROTECT & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);

__IDLOC(0100);

#define VDD 5000 /* 電源電圧 */
//#defineはある識別子や定数、式をほかの識別子で表す。この場合VDDは5000と同意ということ。電源電圧を変更した時はここを書き換えれば良い。
ioport();

main()
{
unsigned long ad_data0;
unsigned short ad_data;
//変数の宣言
OSCCAL=_READ_OSCCAL_DATA();

ioport();

ADIE=1; /* A/D変換が終わったときに起きる */
//A/D変換割り込みを使う(PIEレジスタ
PEIE=1;
//A/D変換割り込みはPIEレジスタに入っているので
("\rVoltage\r\n);
//タイトル入れてみる

while(1){

ioport();

DelayMs(250); /* 約1秒間ごと */
DelayMs(250);
DelayMs(250);
DelayMs(250);

ad_data0=(long)adc(0)*VDD; /* AN0をA/D変換して電圧値に変換 */
//adc()を呼び出している 10ビットなのでデータ型はlong 引数の0はなに?←要調査
ad_data=ad_data0/1024; /* 割り算は切り捨てになるから */
if((ad_data0%1024)>=512) /* 四捨五入 */
++ad_data;
//ad_data0%1024はad_data0を1024で割ったあまりを意味する あまりが512より大きかったら1足す

printf("\r%4dmV",ad_data); 
//printf関数:formatを標準出力に出力する \r→CR(行頭復帰) \n→LF(改行) %dはコンマの後ろの物を代入する %4d→スペース含めて4文字表示 
//ヘッダファイル→stdio.h 標準出力→putch
}
}

ioport()
{
GPIO4=1; /* GP4ピンの出力データを1にする */
TRIS4=0; /* GP4ピンは出力ピン */

TRIS0=1; /* GP0ピンは入力ピン */
ANS0=1; /* AN0ピンをアナログ入力モードにする */
}

delay.c (PICC Lite Sample 前出)

adc.c


#include <pic.h>
#include "delay.h"

unsigned short adc(unsigned char ch)
//関数adcから返るデータはunsigned short→16bit正  関数adcが受け取る引数chはunsigned char→8bit正
{
ADCON0=((ch<<2)&0x0C); /* アナログ入力チャネルを設定する */
//0x0C→1100 chを2bit左シフトし1100で論理積する・・・どういう意味だ?
//CHS1=0, CHS2=0にするとGP0/AN0を選択したことになるはずだが

ADON=1; /* A/Dコンバータを電源オンする */
ADFM=1; /* A/D変換結果を右詰めにする */

ADCS0=1; /* A/D変換クロックはFRC */
ADCS1=1;
ADCS2=1; /* この場合ADCS2=0;でもFRC */
//スリープモードのままAD変換する場合FRCにする。

DelayUs(20); /* 20usec待つ */

ADIF=0; /* ADIFを0にする 割り込みフラグビットADIF(PIR1にある)はAD変換が終わると1になる*/
GODONE=1; /* A/D変換開始 */

asm("sleep"); /* スリープ・モードにする */

ADCON0=0;

return((ADRESH*256)+ADRESL);
}

putch.c


#include <pic.h>
#include "delay.h"

void putch(unsigned char tx_byte) /* 約2400bps,8N1で1バイトだけ */
{ /* シリアル・データを送る */
unsigned char i;

GPIO4=0; /* スタート・ビット */

DelayUs(12);

for(i=0;i<10;i++){

DelayUs(200);
DelayUs(196);

GPIO4=(tx_byte&0x01); /* データ・ビット */

tx_byte>>=1;
tx_byte|=0x80; /* ストップ・ビットを作っておく */
}
}

ヘッダ

pic.h

stdio.h

delay.h (以上PICC Lite Sample)

adc.h


unsigned short adc(unsigned char);

putch.h


void putch(unsigned char);


さてさていったいどういうことになってるんだろうか?全然わからん。とくにシリアル通信のところ