2010年11月21日日曜日

A/D変換-C18プログラミング-PIC18F2550

未完成



/*
概要:A/D変換値をRS232C通信で送信

HID - Bootloaderを使った書き込み

マイコン:PIC18F2550

ファイル名:RS232C.c

開発環境:MPLAB C18

*/

#include <p18f2550.h>
#include <usart.h>
#include <stdio.h>
#include <adc.h>
#include <stdlib.h>
#include <delays.h>

// リセットベクタ  
#pragma code reset_vector=0x1000

extern void _startup(void);
void remapped_reset(void) { _asm goto _startup _endasm}

#pragma code

void main (void){
char ad_value[10] = "AD=";
char v_value[10] = "Volt=";
char str2[8] ="\r\n";

int ADread;  //AD変換値
char buf_ad[3]; //一時的に保存
double press; //電圧値整形前
int One_digit; //電圧値の整数部分
int v_m;  //小数点以下2桁
 
 TRISA = 0b00001001;     //RA0,A/D input RA3 Vref input
 TRISB = 0;              //all output
 TRISC = 0;        //all output
 
 LATC = 0;    //ポートCの出力ラッチCすべてに0:OFFを出力
 
 ADCON0 = 0b00000001; //bit0=1 AD変換開始
       //bit3,4,5の000でAN0を一つのだけのポートに指定
 ADCON1 = 0b00011101; //アナログ入力ポートの使い方の設定
       //bit4,5の0,1でVss、AN3/Vref+
       //bit0,1,2,3の1101でAN0,AN1がアナログ他はデジタル
 ADCON2 = 0b10110110; //bit0,1,2 の110で64Tosc
       //bit3,4,5の110で16TAD
 
 T0CON = 0b10000110;     //Timer0 の設定
       //bit0,1,2 110 プリスケーラ使用時の倍率指定256
       //bit3=0 プリスケーラ使用有無 使用する 
       //bit4=0 立ち上がり 
       //bit5=0 TMR0クロックソース選択 命令サイクル 
       //bit6=0 16ビットモード 
       //bit7=1 TMR0有効
 
 
 INTCONbits.TMR0IE = 1;  // Timer0 Interrupt Enable
 
 RCONbits.IPEN = 1;      // Interruput Priority Enable
 INTCON2bits.TMR0IP = 0; // Timer0 Interrupt is Low Priority
 
 INTCONbits.GIEH = 1; //INTCONの7bit目
       //高位割込み許可
 INTCONbits.GIEL = 1; //INTCONの6bit目
       //低位割込み許可
 
 while(BusyADC());       //AD変換が終わるまで待つ

 // configure USART  
 OpenUSART(USART_TX_INT_OFF & //送信割込みの禁止  
 USART_RX_INT_OFF &       //受信割込みの禁止  
 USART_ASYNCH_MODE &      //非同期(調歩)モード  
 USART_EIGHT_BIT &      //8ビットモード  
 USART_CONT_RX &        //連続受信モード  
 USART_BRGH_LOW,        //低速ボーレート  
 77);             //SPBRGレジスタ 9600 bps  

 while (1)
 {
  ConvertADC();   //start A/D
  ADread = ReadADC();     //AD変換値読込み int
  itoa(ADread,buf_ad); //型変換 
  putsUSART(ad_value); //
  putsUSART(buf_ad);  //rs232c通信で送信
  putsUSART(str2);  //改行
  putsUSART(v_value);
  press = ADread * 0.005;//電圧値を取得
  One_digit = press;  //電圧値の整数部分
  itoa(One_digit,buf_ad); //型変換 
  putsUSART(buf_ad);  //送信
  WriteUSART('.');  //コンマの送信
  v_m = press*100 - One_digit*100;//小数点以下2桁取得
  itoa(v_m,buf_ad);  //型変換 
  putsUSART(buf_ad);  //送信
  putsUSART(str2);  //改行
  
  Delay10KTCYx(200);  //wait about 0.8sec

 }
 
 CloseUSART();
}

0 件のコメント:

コメントを投稿