Forum: Compiler & IDEs ADC ISR funktioniert nicht


von stiefei (Gast)


Lesenswert?

Hallo,

ich bekomme mein ADC ISR nicht zum laufen, vielleicht kann mir einer von 
euch Helfen! Bei dem Aufruf von der ISR soll die LED ausgeschaltet 
werden, wird sie aber nicht --> ISR wird nicht aufgerufen. ISR sind mit 
sei() aktiviert.
1
    
2
//ADC Einstellung    
3
ADCSRA |= (1<<ADEN);    //ADC aktivieren
4
ADCSRA |= (1<<ADSC);    //Messung starten --> Freerunning-Modus
5
ADCSRA &= ~(1<<ADIE);    //ADC Interrutpe erlauben
6
SREG |= (1<<7);        //ADC Interrupte erlauben, Setzte I in SREG
7
ADCSRA |= (1<<ADPS0);    //ADPS2...ADPS0 (ADC Prescaler Select Bits) 
8
ADCSRA |= (1<<ADPS1);
9
ADCSRA |= (1<<ADPS2); 
10
ADMUX  &= ~(1<<REFS0);    //Externe A_REF_Spannung
11
ADMUX  &= ~(1<<REFS1);   
12
  
13
ADMUX |= (1<<MUX4);    //ADC_6 wird verwendet (PIN_A6)
14
ADMUX &= ~(1<<MUX3);
15
ADMUX |= (1<<MUX2);       
16
ADMUX |= (1<<MUX1);     
17
ADMUX &= ~(1<<MUX0);
18
19
20
21
ISR(ADC_vect)
22
{
23
ADC_1_RESULT = ADCL;           //Wert auf 2 mal auslesen
24
ADC_1_RESULT += (ADCH<<8);   
25
  PORTB &= ~(1<<STATUS_LED);    
26
}

Grüße stiefei

von stiefei (Gast)


Lesenswert?

Vergessen: Habe einen Atmega16 mit 16Mhz und externer 
Ref-Spannungsquelle.

von Stefan E. (sternst)


Lesenswert?

> ADCSRA &= ~(1<<ADIE);    //ADC Interrutpe erlauben

Nö.

von Julian B. (julinho)


Lesenswert?

Für den Freerunningmodus must du ADATE auf 1 setzen.

von MWS (Gast)


Lesenswert?

stiefei schrieb:
> werden, wird sie aber nicht --> ISR wird nicht aufgerufen. ISR sind mit
> sei() aktiviert.

Der ADC-Interrupt ist nicht eingeschaltet:
> ADCSRA &= ~(1<<ADIE);    //ADC Interrutpe erlauben

Und das ist auch kein sei():
> SREG |= (1<<7);        //ADC Interrupte erlauben, Setzte I in SREG

von stiefei (Gast)


Lesenswert?

Hallo,

habe es geändert.
ADCSRA |= (1<<ADIE);    //ADC Interrutpe erlauben

• Bit 3 – ADIE: ADC Interrupt Enable
When this bit is written to one and the I-bit in SREG is set, the ADC 
Conversion Complete Interrupt
is activated.

Klappt aber immer noch nicht :(

Gruß

von stiefei (Gast)


Lesenswert?

Ok, vielen Dank funktioniert derweil! :)

ADCSRA |= (1<<ADATE);

Gruß

von MWS (Gast)


Lesenswert?

stiefei schrieb:
> Klappt aber immer noch nicht :(

Da Du wirklich alle Bits einzeln setzt, ist die Reihenfolge 
entscheidend, beim Freerunmodus muss die erste Wandlung mit ADSC 
angeschoben werden. Wenn das zuerst kommt, und Du konfigurierst lustig 
weiter, wird das nichts, ADSC muss also zum Schluss kommen.

Achte darauf, dass die ISR richtig benannt ist, der Compiler sagt Dir, 
wenn da was falsch ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.