/*
* ADC_test.c
*
* Created: 24/05/2013 2:01:57 PM
* Author: Antonius
*/
//Mention Clock frequency here
#define _XTAL_FREQ 8000000
#define F_CPU 8000000UL // 8 MHz
#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
// structure to allow bit field operations, name conversions: PORTA.0 -> PORT_A.b0 PORTB.7 -> PORT_B.b7
typedef struct{ uint8_t b0:1;
uint8_t b1:1;
uint8_t b2:1;
uint8_t b3:1;
uint8_t b4:1;
uint8_t b5:1;
uint8_t b6:1;
uint8_t b7:1; } bits;
// define all the ports of your microcontroller, add more ports depending on the available mcu ports
#define PORT_D (* (volatile bits *) &PORTD)
#define PIN_D (* (volatile bits *) &PIND)
#define DDR_D (* (volatile bits *) &DDRD)
#define PORT_G (* (volatile bits *) &PORTG)
#define PIN_G (* (volatile bits *) &PING)
#define DDR_G (* (volatile bits *) &DDRG)
#define lcd_data_pin PORTA
#define en PORT_D.b0
#define rs PORT_D.b1
#define rw PORT_D.b2
#define relay1 PORT_D.b3
#define relay2 PORT_D.b4
// //ADC definitions
#define ADC_0 0
#define ADC_1 1
#define ADC_2 2
#define ADC_3 3
#define ADC_4 4
#define ADC_5 5
#define ADC_6 6
#define ADC_7 7
#define ADC_VREF_TYPE 0x00
void lcd_init();
void lcd_data(unsigned char data1);
void lcd_cmd(unsigned char cmd);
void lcd_control(unsigned char cmdordata);
void lcd_string(unsigned char *str);
void adc_init(void);
uint16_t read_adc(void);
void adc_init()
{
// enable ADC, select ADC clock = F_CPU / 128 (i.e. 125 kHz)
ADCSRA = (1<<ADEN | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0 );
//Do a conversion to get rid of rubbish
ADMUX=(1<<REFS0 | ADC_0); //Conversion on channel 0, thermistor input
//Internal VCC Voltage Reference
ADCSRA |= (1<<ADSC); //Start conversion
loop_until_bit_is_clear(ADCSRA, ADSC); //Wait for conversion complete
}
uint16_t read_adc(void)
{
ADMUX=(1<<REFS0) | (1<<ADLAR) | ADC_0; // Conversion on channel 0, AVCC reference, 10 bit mode
ADCSRA |= (1<<ADSC); // Start conversion
loop_until_bit_is_clear (ADCSRA, ADSC); // Wait for conversion complete
return(ADCH);
}
void lcd_init(){
lcd_cmd(0x30);
_delay_ms(10);
lcd_cmd(0x38);
_delay_ms(10);
lcd_cmd(0x0F);
_delay_ms(10);
lcd_cmd(0x80);
_delay_ms(10);
}
void lcd_data(unsigned char data1)
{
lcd_data_pin = data1;// & 0x0F;
en=1;
rs=1;
rw=0;
_delay_ms(10);
en=0;
}
void lcd_cmd(unsigned char cmd){
lcd_data_pin = cmd ;
en=1;
rs=0;
rw=0;
_delay_ms(10);
en=0;
}
void lcd_string(unsigned char *str){
while(*str){
lcd_data(*str++);
}
}
int main(){
char volts[50];
int adc_result;
float adcA;
DDR_D.b0 = 1;
DDR_D.b1 = 1;
DDR_D.b2 = 1;
DDR_D.b3 = 1;
DDR_D.b4 = 1;
DDRA = 0xFF;
lcd_init();
adc_init();
while(1){
lcd_cmd(0x80);//put the cursor into the first row
_delay_ms (10);
lcd_cmd(0x01);//Clear display
_delay_ms (10);
lcd_string("ADC Value");
lcd_cmd(0xC0);//goto second row
//lcd_string("Value of PF0");
_delay_ms(1000);
//check the adc result begin
adc_result=read_adc();
adcA = (int)(adc_result*5.0)/1024.0;
if (adcA != 0)
{
//itoa(adcA,volts,5);
sprintf(volts,"adc=%.3f",adcA);
lcd_string(volts);
_delay_ms(1000);
}
else
{
lcd_string("No Result!");
_delay_ms(2000);
}
//check the adc result end
}//end while
return (0);
}//end main