#include <p18cxxx.h>
#include <delays.h>
#include <usart.h>
#pragma config WDT = OFF
void read_a2d(unsigned int adc_ch) //Read the A2D Inputs
{
switch (adc_ch)
{
case 0: // Setup AN0
ADCON1 = 0b00001011; //-Vref=Vdd, +Vref=Vss, AN0:An3 inputs,
ADCON0 = 0b00000000;
ADCON2 = 0b10101010; // (Fosc/32), 12 TAD (LM35 needs longer time, higher impedance)
ADCON0bits.ADON = 1; //Turn On ADC
break;
case 1: // Setup AN1
ADCON1 = 0b00001011;
ADCON0 = 0b00000100;
ADCON2 = 0b10101010;
ADCON0bits.ADON = 1;
break;
case 3: // Setup AN3
ADCON1 = 0b00001011;
ADCON0 = 0b00001100;
ADCON2 = 0b10101010;
ADCON0bits.ADON = 1;
}
}
void SendData(unsigned char data)
{
while(BusyUSART());
WriteUSART(data);
while(BusyUSART());
}
void main(void)
{
unsigned int adcbits, adcbit0, adcbit1, adcbit2, adcbit3;
unsigned char adctemp,adcvalue;
TRISB = 0x00;
TRISA = 0x01;
TRISC = 0b11000000;
TRISD = 0x00;
TRISE = 0b000;
PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
read_a2d(0);
OpenUSART (
USART_TX_INT_OFF &
USART_RX_INT_ON &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH, 25
);
while(1)
{
ADCON0bits.GO=1;
while(ADCON0bits.GO);
adctemp = ADRESH;
adctemp = adctemp<<8;
adcbits = adctemp|ADRESL;
adcvalue = adcbits;
adcvalue = ((adcbits*3.3)/(1023));
adcvalue = adcvalue * 1000; // Multiply by 1000 to include 3 d.p's
adcbits = adcvalue; // Force interger value xxxx.0000
adcbit0 = adcbits;
adcbit0 = adcbit0/1000; // Extract "thousands" value
adcbit1 = adcbits-(adcbit0*1000);
adcbit1 = adcbit1/100; // Extract "hundreds" value
adcbit2 = adcbits-((adcbit0*1000)+(adcbit1*100));
adcbit2 = adcbit2/10; // Extract "tens" value
adcbit3 = adcbits-((adcbit0*1000)+(adcbit1*100) + (adcbit2*10));
adcbit3 = adcbit3/1; // Extract "singles" value ***Good Practice***
SendData(adcbit0+48); // Output to UART in ASCII
SendData('.');
SendData(adcbit1+48);
SendData(adcbit2+48);
SendData(adcbit3+48);
SendData(32); // Space
Delay10KTCYx(60);
}
}