Tengo problemas para leer datos de sensores que usan ATmega16 en Proteus. Usamos sensores de luz para los cuales uso LDR en proteus, o sensor de temperatura LM35 para la lectura de temperatura. El problema es que, no importa qué sensor use, aparece un error "[AVR AD CONVERTER] Valor de referencia = 0" cuando ejecuto la simulación de Proteus y una gran lectura en la pantalla, creo que es el valor máximo.
El problema está en algún lugar al leer el valor del canal ADC, a saber, CH0 o PA0 en mi caso. Al menos creo que lo es.
Aquí está el código para el sensor de temperatura:
#define F_CPU 7372800UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include "lcd.h"
void writeLCD(uint16_t adc) {
lcd_clrscr();
char adcStr[16];
itoa(adc, adcStr, 10);
lcd_puts(adcStr);
}
ISR(ADC_vect) {
uint16_t temp = ((ADC * 5.0/1024) - 0.5) * 1000/10;
writeLCD(temp);
}
int main(void) {
DDRD = 0xff;
TCCR1A = _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(WGM12) | _BV(CS11);
OCR1B = 64;
lcd_init(LCD_DISP_ON);
ADMUX = _BV(REFS0);
ADCSRA = _BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1);
sei();
while (1) {
ADCSRA |= _BV(ADSC);
_delay_ms(1000);
}
}
Códigodelsensordeluz:
#defineF_CPU7372800UL#include<avr/io.h>#include<util/delay.h>#include<stdlib.h>#include"lcd.h"
void writeLCD(uint16_t adc) {
lcd_clrscr();
char adcStr[16];
itoa(adc, adcStr, 10);
lcd_puts(adcStr);
}
int main(void)
{
DDRD = 0xff;
TCCR1A = _BV(COM1B1) | _BV(WGM10);
TCCR1B = _BV(WGM12) | _BV(CS11);
OCR1B = 64;
lcd_init(LCD_DISP_ON);
ADMUX = _BV(REFS0);
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1);
while (1) {
ADCSRA |= _BV(ADSC);
while (!(ADCSRA & _BV(ADIF)));
writeLCD(ADC);
_delay_ms(100);
}
}
Esquema:
¿No estoy seguro de si debo cambiar el registro ADMUX o tal vez agregar un capacitor externo? Porque cuando usamos el sensor irl agregamos un capacitor entre el AREF y los pines de tierra. Cualquier sugerencia es apreciada, gracias de antemano.
P.S. Los códigos son un poco diferentes porque utilizamos diferentes mecanismos de activación para la conversión de datos, pero eso es irrelevante aquí. Mismo error para ambos códigos.