No se puede activar la interrupción AVC ADC

2

Estoy usando una mini placa de XP con Atmega328PB de Atmel. Estoy tratando de usar la interrupción ADC, sin embargo no puedo hacer que se dispare. Aquí está el código con el que tengo un problema:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>


ISR(ADC_vect){
    PORTC ^= (1<<PINC2);
}

int main(void)
{
DDRC |= (1<<PINC2); //pin 2 as output
DDRC &= ~(1<<PINC3); //adc pin as input
sei();
ADMUX |= (1<<REFS0); //reference voltage VCC
ADMUX |= (1<<MUX0);
ADMUX |= (1<<MUX1);// channel 3
ADCSRA |= (1<<ADPS2);//
ADCSRA |= (1<<ADPS1);//
ADCSRA |= (1<<ADPS0);//prescaler to 128
ADCSRA |= (1<<ADATE);//auto trigger enable
ADCSRA |= (1<<ADIE); //adc interrupt enable
ADCSRA |= (1<ADEN); //adc enable
ADCSRA |= (1<< ADSC); //start conversion    

while (1) 
    {
    }
}

Según tengo entendido, el código debería permitir una conversión constante en un modo de ejecución libre con una frecuencia de 16MHz / 128, y cada vez que se completa la conversión, ADC_vect debe disparar el PIN2 de alternancia del puerto C. El problema es que no 't Supongo que no estoy inicializando correctamente el ADC, sin embargo no puedo identificar el punto donde el problema es.

EDIT : Después de señalar que el adc no se estaba ejecutando en un modo de ejecución libre, borré los bits ADTS. Sin embargo, todavía no podía cambiar el pin. Creo que algo más tiene la culpa aquí.

    

2 respuestas

4

Has escrito

ADCSRA |= (1<ADEN); //adc enable

Y creo que debería ser

ADCSRA |= (1<<ADEN); //adc enable

Lo que parece plausible ya que el error con el que te has encontrado es que nunca hace nada.

    
respondido por el Harry Svensson
1

Consulte tabla 24 -6 de la hoja de datos . Está configurando los bits ADTS1 y ADTS0 alto (dejando ADTS2 como cero). Significa que la señal de activación es "Temporizador / Contador 0 Comparar coincidencia A". No está haciendo nada para configurar ese temporizador (y el estado de reinicio del temporizador simplemente se "detiene").

Para usar el modo de ejecución libre, debe borrar ADTS0, ADTS1, ADTS2 en ADCSRB ( o simplemente dejar ADCSRB solo en su valor de restablecimiento ).

    
respondido por el filo

Lea otras preguntas en las etiquetas