Interrupt Routine ???

Gast #526291
Lesenswert?

Hallo zusammen...

habe nochmal versucht ein kleines Programm zu schreiben, was einen 
Interrupt durch einen Timer auslösen soll und dann meine LED an PIn Pc1 
einschalten soll... aber es funktioniert irgendwie nicht...
habe den timer1 benutzt (16 bit timer)

könnt ihr mir sagen wieso ?

#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#ifndef F_CPU
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
#endif
#include <util/delay.h>


ISR(TIMER1_OVF_vect)
{
    PORTC = PINC ^ ( 1 << PC1 ); //Diode an
}



int main (void)
{

DDRC = 0xFF; // 11111111 I/o - Konfiguration PORT C
PORTC = 0x00; // kompletter Port C auf 0 gesetzt


TIMSK |= _BV(TOIE1);
TCCR1B = _BV(CS12) | _BV(CS10);
TCNT1 = 55771; //Zählregister vorladen für 10sek.
sei (); //Interrupts global zulassen
return 0;

}
#526297
Lesenswert?

Ob Du die Interrupt-Serviceroutine korrekt geschrieben hast, weiß ich 
nicht - ich kenne Deine Umgebung nicht.

Was aber definitiv falsch ist: Das 'return 0' in main.

Du darfst main nach der Initialisierung nicht verlassen, sondern mußt 
den Controller in einer unendlichen Schleife laufen lassen - die 
'Arbeit' macht ja die ISR und der Vordergrund muß einfach nur nichts 
machen, insbesondere darf er nicht den Controller ins Nirvana rennen 
lassen...
Gast #526299
Lesenswert?

Du solltest noch ein while(1) {} in die main machen.

Außerdem kommt mir die PORT = PIN ^ (1<<) Konstruktion jetzt seltsam 
vor.
Sollte aber eigentlich schon tun. Lass zum Testen doch mal nach zehn 
Sekunden  den Interrupt die LED anschalten, also NUR PORTC|=(1<<).

Ich hoffe mal, dass es nur an der fehlenden Schleife liegt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren