Conectando LDR con atmega32

0

Tengo que hacer un interruptor de luz basado en LDR que encienda las luces en condiciones de luz definidas. Para hacer esto tengo que usar el micro controlador atmega32. Sigo algunos tutoriales y escribo algunos códigos. el código se compila en Atmel studio sin ningún problema, pero cuando ejecuto el código utilizando el simulador de Proteaus, el código no funciona

Este es el código

#include <avr/io.h>
#include <util/delay.h>

#define LTHRES 500

// initialize adc
void adc_init()
{
    // AREF = AVcc
    ADMUX = (1<<REFS0);

    // ADC Enable and prescaler of 128
    // 16000000/128 = 125000
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}

// read adc value
uint16_t adc_read(uint8_t ch)
{
    // select the corresponding channel 0~7
    // ANDing with '7' will always keep the value
    // of 'ch' between 0 and 7
    ch &= 0b00000111;  // AND operation with 7
    ADMUX = (ADMUX & 0xF8)|ch;     // clears the bottom 3 bits before ORing

    // start single conversion
    // write '1' to ADSC
    ADCSRA |= (1<<ADSC);

    // wait for conversion to complete
    // ADSC becomes '0' again
    // till then, run loop continuously
    while(ADCSRA & (1<<ADSC));

    return (ADC);
}

int main()
{
    uint16_t adc_result0, adc_result1;
    char int_buffer[10];
    DDRC = 0x01;           // to connect led to PC0

    // initialize adc and lcd
    adc_init();



    _delay_ms(50);

    while(1)
    {
        adc_result0 = adc_read(0);      // read adc value at PA0


        // condition for led to glow
        if (adc_result0 < LTHRES)
        PORTC = 0x01;
        else
        PORTC = 0x00;


    }
}

Y esta es una captura de pantalla de la simulación de proteaus.

Recibí este error

  

[AVR AD CONVERTER] Valor de referencia = 0

Solo tengo conocimientos básicos de programación de microcontroladores y simulación con proteaus. ¿Alguien puede ayudarme? ¿Cómo debo configurar esto?

    
pregunta charith

3 respuestas

1

Asegúrate de que estás conectado a AVcc con 5v

y mi código para ADC Config

void ADC_Init()
{
    DDRA=0x0;               /* Make ADC port as input */
    ADCSRA = 0x87;          /* Enable ADC, fr/128  */
    ADMUX = 0x40;           /* Vref: Avcc, ADC channel: 0 */

}

int ADC_Read(char channel)
{

     int Ain,AinLow;

     ADMUX=ADMUX|(channel & 0x0f);  /* Set input channel to read */

     ADCSRA |= (1<<ADSC);           /* Start conversion */
     while((ADCSRA&(1<<ADIF))==0);  /* Monitor end of conversion interrupt */

     _delay_us(10);
     AinLow = (int)ADCL;                /* Read lower byte*/
     Ain = (int)ADCH*256;           /* Read higher 2 bits and 
                                    Multiply with weight */
    Ain = Ain + AinLow;             
    return(Ain);                    /* Return digital value*/
}
    
respondido por el Arnob
1

intenta agregar el encabezado

#define F_CPU 1000000UL // (or 8000000UL or 16000000UL depending upon what
                        //frequency you want your Atmega32 to run at)

antes o después de incluir util / delay.h Proteus requiere que la frecuencia de su Atmega se determine de antemano.

¡Comenta si aún no funciona!

    
respondido por el Rohan Narlanka
0

editar: no es un tablero arduino. Sin embargo, AVCC y AVREF todavía deben estar conectados.

Una placa arduino tiene más componentes electrónicos que una simple ATMEGA y un LED (aunque no mucho más).

Asegúrese de que sus pines AVCC y AVREF estén conectados a los voltajes correctos, y también asegúrese de que sus pines XTAL estén conectados a un cristal y algunos condensadores.

Vea si puede encontrar un esquema para su Arduino en particular, que muestre exactamente cómo configurar los pines de voltaje, tierra y cristal del chip.

    
respondido por el Nicholas Clark

Lea otras preguntas en las etiquetas