Simulación de sensor en proteus usando Atmega16

0

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);
    }
}

... y el esquema proteus:

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.

    
pregunta Machi

2 respuestas

0

Parece que no has conectado AVcc a Vcc. Técnicamente, en la vida real, siempre necesita estar conectado a Vcc, pero la simulación puede ser de perdón. En este caso, ha establecido AVcc como la referencia, por lo que definitivamente necesita estar conectado y el simulador está captando eso.

En una nota al margen, no puede conectar AVcc a un voltaje que no sea Vcc. Si desea usar una referencia de voltaje diferente para ADC, debe conectarlo a Aref.

    
respondido por el BeB00
0

Ok, no importa, algo loco estaba sucediendo, realmente no estoy seguro de qué se debe a que reinicié todo al principio y la pantalla aún no funcionaba, incluso después de desconectar todo y simplemente salir de la pantalla y tratar de escribir Hola Lol mundo Así que simplemente borré todo y comencé desde cero con un nuevo código y un nuevo esquema de Proteus, y después de conectar AREF y AVCC para que funcione ¡realmente FUNCIONA! Así que muchas gracias, BeB00, me salvaste el día y quizás mi semestre porque ahora puedo practicar adecuadamente por mi cuenta: D

El problema es que no poseo todos los equipos que necesito, por lo que necesitaba una forma de practicar la codificación con estos sensores sin el equipo. Gracias a Dios por Proteus y BeB00, ¡salud!

    
respondido por el Machi

Lea otras preguntas en las etiquetas