Hilfe! Ich versuche ein ganz einfaches Beispiel zur Nutzung von Countern zu machen. Das Programm soll den Zählerstand auf LED's am Port B ausgeben, aber er bleibt konstant beim Initialisierungswert! #include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <stdio.h> // Counter Wert unsigned int Counter = 0xAA; // Timer 0 overflow ISR ISR(SIG_OUTPUT_COMPARE0) { Counter++; } void main(void) { // Port B PORTB=0x00; DDRB=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 7,813 kHz // Mode: Output Compare // OC0 output: Disconnected TCCR0=0x05; TCNT0=0x00; OCR0=0xFF; // External Interrupt(s) initialization // INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x03; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // Global enable interrupts sei(); while (1) { PORTB=Counter; }; }
Die ueblichen Verdächtigen: // Counter Wert volatile unsigned int Counter = 0xAA; ********
Vielen Dank. "volatile" sorgt dafür, das der Wert im Register der CPU bleibt, oder?! Allerdings funktioniert es immer noch nicht. Es scheint so als ob der Zähler zählt, aber der Interrupt nicht auslößt. Was kann es da für Fehler geben? Vieleicht außer dem Programmcode, Fuse Bits, Makefile?! Hab nen Makefile mit MFile für ATMega32 / 16MHz generiert und die Fuse Bits alle 1 außer die beiden BOOTSZ-Flags.
Yippee! Es funktioniert! Mit Signal hat es auch nicht funktioniert. Habe dann nochmal in die avr-libc Dokumentation geschaut und da stand das man fpr sei() und cli() die interrupt.h braucht, die ja schon eingebunden war. Für Interrupts aber das Makro INTERRUPT(SIGNALVECTOR) aus der signal.h benutzt werden soll. Hab die dann noch zusätzlich eingebunden und aus ISR(SIGNALVECTOR) umbenannt. Danke für die Tipps! So klappt es: #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <inttypes.h> #include <stdio.h> // Counter Wert volatile unsigned int Counter = 0xAA; // Timer 0 overflow ISR INTERRUPT(SIG_OUTPUT_COMPARE0) { Counter++; }
Kleine Anmerkung noch: SIGNAL schaltet im Gegensatz zu INTERRUPT die anderen Interrupts während der ISR ab, kann also von einem anderen Interrupt nicht gestört werden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.