#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>
#include "lcd_lib.h"
#define ADC_REF 0x40
unsigned int read_adc(unsigned char adc_input);
int main( void )
{
int Temperatura;
double Sal_adc, Vin;
char s_num[20];
// configura PORTA como entradas
DDRA = 0x00;
// configura PORTB as SALIDA
DDRB = 0xFF;
// configura PORTC como salidas
DDRC = 0xFF;
// configura PORTD como salida
DDRD = 0xFF;
ADMUX=ADC_REF; //0x40 REFS0=1 (AREF= AVCC)
ADCSRA=0x86; //ADEN=1 ADPS2:1:0 = 110 Frecuencia del reloj del ADC
//de 125Khz 8M/32
Sal_adc=0;
Temperatura=0; //de 125Khz 8M/32
LCDinit();
while (1)
{
_delay_ms(1000);
Sal_adc=read_adc(0); // 0 Canal 0 no dif
// 16 Modo diferencial con ganancia 1
// 9 Modo diferencial con ganancia 10
// 11 Modod diferencial con ganancia 20
Vin = Sal_adc*5/1023; //sal_adc = Vin*1024/Vref -- Voltage de entrada
if (0<=Vin && Vin<=1.203)
Temperatura= (Vin+0.453)/0.018;
if (1.203<Vin && Vin<=2.005)
Temperatura= (Vin-0.121)/0.012;
if (2.005<Vin && Vin<=3.208)
Temperatura= (Vin+0.97)/0.019;
if (3.208<Vin && Vin<=5)
Temperatura= (Vin+0.768)/0.018;
sprintf(s_num,"Temperatura=%dGrados",Temperatura);
LCDclr();
LCDGotoXY(0,0);
lcd_puts(s_num, 16);
} //Fin while principal
return 0;
}
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_REF & 0xFF); //Selecciona el canal de entrada
_delay_us(10);
ADCSRA|=0x40; //ADSC =1 Inicia la conversión. Se coloca en 0
//automaticamente al finalizar la conversión.
while ((ADCSRA & 0x10)==0); //Espera hasta que finalice la conversión
ADCSRA|=0x10; //El bit se limpia colocándolo en 1
return ADCW; //ADCH:ADCL
}