PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt wird nicht ausgelöst



Michael_am32
01.08.2010, 23:18
Hallo zusammen, bin noch recht neu bei der Programmierung von Microcontrollern.
Ich wollte eigentlich etwas mit den Timern experimentieren, jedoch wird aus irgendeinem Grund der Interrupt beim TCNT Überlauf nicht ausgelöst

Habe das rn-control Board mit atmega 32

folgender Code:

habe nun in der Interruptroutine nur PIN4 low gesetzt, sodass wenn der Interrupt ausgelöst wird die LED ausgehen müsste, tut sie aber nicht.



#include<avr/io.h>
#include<avr/interrupt.h>

ISR(TIMER2_OVF_vect)
{
PORTC |= (1<<4); //Falls der Interrupt überhaupt aufgerufen wird LED aus!
}



int main(void){

// Initialisierung TIMER2
TCCR2 = (1<<CS22); // Prescaler von 1
TCNT2 = 0; // Counter mit 0 Initialisieren
TIMSK |= (1<<TOIE2); // Interrupts aktivieren und damit Timer starten


// Initialisierung PORTC
DDRC=0xff; //alle LEDS an

sei();

while(1)
{
}

}

markusj
02.08.2010, 00:33
Jeder fängt Mal klein an, um den Frustfaktor niedrig zu halten, empfiehlt es sich bei Problemen den Code Schritt für Schritt durchzugehen und immer gegen die entsprechenden Datenblätter/Schaltpläne zu prüfen.

Fangen wir Mal an:
PORTC |= (1<<4);
Hat mich zuerst stutzig gemacht, aber wie der Schaltplan zum Board zeigt, sind die LEDs gegen VCC geschaltet - auch gut. Aber, man kann ja immer besser werden:
PORTC |= (1 << PC4); // Verwendung der Konstanten aus der avr-libc. Macht den Code besser lesbar.

TCCR2 = (1<<CS22); // Prescaler von 1
Stimmt nicht, laut Datenblatt ist der Prescaler 64, du wolltest wahrscheinlich:
TCCR2 = (1<<CS20); // Prescaler von 1

Davon abgesehen ist der Code korrekt (gerade simuliert), ich würde also weitere Fehlerquellen wie die Stromversorgung o.ä. in Betracht ziehen.

mfG
Markus

Michael_am32
02.08.2010, 01:08
Stromversorgung sollte eigentlich alles in Ordnung sein, wenn ich dass Setzen des Ports aus der ISR Routine in die main Funktion kopiere tritt auch exakt dass erwartet Ergebnis ein, PIN4 Wird High => LED aus.
Es wird tatsächlich der Interrupt nicht ausgelöst bzw die ISR nicht ausgeführt.

Nutze AVR Studio und den AVRISP mkII kann beim Programmer was schief gehen ? andere Programme funktionierten bisher eigentlich einwandfrei.

Müssen evtl bestimmte FUSEbits gesetzt werden um Interrupts zu verwenden?

laut Datenblatt reicht das Globale Interrupt Enable und eben für den spezifischen Interrupt hier TOIE2 für den Counterüberlauf.

Michael_am32
02.08.2010, 01:21
Ich habs, hatte in den Configuration Options den falschen Controller. ](*,)

Vielen Dank

markusj
02.08.2010, 01:37
Hihi, der Teufel ist ein Eichhörnchen.
Da kostet ein einzelnes falsch gesetztes Bit auch schon Mal ein ganzes Wochenende.

mfG
Markus