Ich verwende ein XPlained-Miniboard von Atmel mit Atmega328PB. Ich versuche, den ADC-Interrupt zu verwenden, kann ihn jedoch nicht auslösen. Hier ist der Code, mit dem ich ein Problem habe:
#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)
{
}
}
Soweit ich weiß, sollte der Code eine konstante Konvertierung in einen frei laufenden Modus mit der Frequenz von 16 MHz/128 ermöglichen, und jedes Mal, wenn die Konvertierung abgeschlossen ist, sollte der ADC_vect das Umschalten von PIN2 von Port C auslösen. Das Problem ist, dass dies nicht der Fall ist. Ich vermute, dass ich den ADC nicht richtig initialisiere, aber ich kann nicht genau bestimmen, wo das Problem liegt.
BEARBEITEN : Nachdem ich darauf hingewiesen hatte, dass der Adc nicht in einem freilaufenden Modus ausgeführt wurde, habe ich die ADTS-Bits gelöscht. Allerdings konnte ich den Pin immer noch nicht umschalten. Ich denke, hier ist etwas anderes schuld.
Du hast geschrieben
ADCSRA |= (1<ADEN); //adc enable
Und ich denke, es sollte sein
ADCSRA |= (1<<ADEN); //adc enable
Was plausibel erscheint, da der Fehler, auf den Sie gestoßen sind, darin besteht, dass es nie etwas tut.
Siehe Tabelle 24-6 des Datenblatts . Sie setzen die Bits ADTS1 und ADTS0 hoch (lassen ADTS2 auf Null). Dies bedeutet, dass das Triggersignal "Timer/Counter0 Compare Match A" ist. Sie tun nichts, um diesen Timer zu konfigurieren (und der Reset-Status des Timers ist einfach "gestoppt").
Um den freilaufenden Modus zu verwenden, müssen Sie ADTS0, ADTS1, ADTS2 in ADCSRB löschen ( oder ADCSRB einfach auf seinem zurückgesetzten Wert belassen ).
Anthropomorpher Dodekaeder
Harry Swensson
1<ADEN
wird so ausgewertet, als wäre es in einerif
Anweisung enthalten. Ich weiß nicht, welchen Wert ADEN tatsächlich hat, aber wenn er beispielsweise gleich 2 ist, wird daraus1<ADEN
dastrue
,00000001
was dann mit ADCSRA ODER: verknüpft wird. - Es sollte also weder einen Fehler noch eine Warnung erzeugen, es ist ein vollkommen legaler Code.