- LiFePO4 Speicher Test         
Ergebnis 1 bis 2 von 2

Thema: Timer-Interrupt ohne Funktion ?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2006
    Beiträge
    14

    Timer-Interrupt ohne Funktion ?

    Anzeige

    Powerstation Test
    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 ?

    Code:
    #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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2006
    Beiträge
    14
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad