Hallo zusammen,
ich bin gerade verzweifelt, weil mich ein Mega128 und WinAVR 20060125 bei einer simplen Timerinterrrupt-Routine ärgert.
Das folgende Beispielprogramm soll einfach auf dem USART den Wert der globalen Variable dummy ausgeben. Diese wird vom Timer-ISR hochgezählt. Also sollte am USART 0\n 0\n 0\n 0\n 2\n 2\n 2\n 2\n .... ausgegeben werden. Klapppt aber nicht, ich komme nie bei der 2 an!
Ich habe den Eindruck, der Handler wird nie aufgerufen. Der Vector-Name sollte stimmen, IRQ ist aktiviert, Controller funktioniert ansonsten brav.
Bin ich blind oder warum funktioniert das nicht ?
ServusCode:#define MAXINTEXT 101 #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define F_CPU 16000000UL #include <util/delay.h> #include <stdlib.h> // für itoa, strtod #include <string.h> // für strcat #include <math.h> #include "Mega128RS232.h" // Strings für Input/Outputverwaltung und allgemeine Flags char outtext[MAXINTEXT], string[21]; // für Ausgaben auf LCD und RS232 char usbintext[MAXINTEXT]; char ictext[MAXINTEXT]; unsigned char command_done; // Variablen aus anderen C-Dateien extern volatile unsigned char command_complete; // aus rs232.c extern volatile unsigned char dataready; // aus rs232.c volatile unsigned int dummy = 0; int main(void) { USART_Init(1); // initialisiert die serielle Schnittstelle sei(); TCCR3A = 0; TCCR3B = (1 << WGM32); // WGM32: Timermode Normal TCCR3B |= (1 << CS30) & ~(1 << CS32) & ~(1 << CS31); // Prescaler = 1 OCR3A = 512; // gibt rund 60 µs TIMSK |= (1 << OCIE3A); // Interrupt für Timer einschalten while(1) { _delay_us(10); utoa(dummy, outtext, 10); strcat(outtext, "\n"); USART1_Transmit_string(outtext); // an den PC rausschreiben } return(0); // :-) } ISR(TIMER3_COMPA_vect) // wird aufgerufen, wenn der Timer-IRQ auftritt { dummy += 2; }
Technikus







Zitieren

Lesezeichen