PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer-Interrupt ohne Funktion ?



Technikus
07.08.2006, 19:12
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 ?



#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;
}


Servus
Technikus

Technikus
08.08.2006, 09:37
Oh Mann, ich bin wirklich blind!

Da liegt der Fehler: TIMSK |= (1 << OCIE3A);

OCIE3A steht in ETIMSK und nicht in TIMSK, also muß es richtig heißen: ETIMSK |= (1 << OCIE3A);

Wen wundert's, so funktioniert es auch einwandfrei.

Servus
Technikus