TIMER1 Overflow interrupt wird nicht aufgerufen

OP #2783643
Hallo zusammen,

irgendwie steh ich auf dem Schlauch...

Bei angefügtem Code wird der TIMER1 OVerflow Interrpt nicht 
aufgerufen... einer ne Idee?

Die ISR soll eigentlich alle 100ms aufgerufen werden und mir einen 
Portpin toggeln ( nur zu testzwecken).

Hoffe jemand ist nicht so blind wie ich im moment.

MFG
1
 
2
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3

4
// Demoprogramm für den ClockClock Slave
5

6
// µC :ATmega8
7

8
// CPU Takt : 8MHz
9

10
// Funktionsbeschreibung:
11

12
//------------------------------
13

14
// Version: V0.1
15
// Datum: 05.08.12
16

17

18

19
//------------------------------
20

21
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22

23
#include <avr/io.h>
24
#include <avr/interrupt.h> 
25
#include "uart.h" //Enthällt uart funktionen (Achtung uart.c muss in makefile eingetragen werden, wenn dies nicht von der ide gemacht wird)
26
#include <stdlib.h> // enthällt die Umwandlung von int zu char (itoa)
27
#include <util/delay.h> // Enthällt delay funktionen
28
#include <avr/wdt.h>  // Enthält Watchdog Funktionen
29

30
// Definitionen
31

32
  #define TIMER1_preload     53036
33

34
  #ifndef F_CPU
35
  #define F_CPU         8000000UL  // CPU Takt in Hz
36
  #endif
37
  #define UART_BAUD_RATE    9600  
38

39

40

41

42
//Deklaration der Variablen
43

44
  int test_text                = 122;
45

46
  int time_counter              =    0; // Enhällt die Bits zur Intervall Erzeugung
47
                            // 1Bit = 100ms
48

49
//Deklaration der Funktionsprototypen
50

51
void send_int_uart(int value); // Deklaration für UART INt SEND Unterfunktion
52

53

54

55
//Interrupts
56

57

58
// Aktion bei Timer 1 Overflow (alle 100ms)
59
ISR (TIMER1_OVF_vect)
60
{
61

62
  PORTD ^= (1 << PD5 ); // Test Led 1 toggeln
63
  
64
  
65
  TCNT1 = 53036; // TImer1 vorladen damit er  nach 100ms überläuft
66
}
67

68

69

70

71

72
// Hauptschleife
73
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
74
  int main (void) // Start Hauptschleife
75
  {
76
  
77
  
78
  
79
  while(1)  // Start Dauerschleife
80
  {
81
    // Eingänge definieren
82
    
83

84

85
    // Ausgänge definieren
86
      DDRD |=(1<< PD1);       //UART Tx
87
      DDRD |=(1<< PD5);       //Test Led1
88
    
89
    // UART initialisieren
90

91
      uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );   
92

93
    
94
      // Startkonfig Timer 1 
95
  
96
        TCCR1B |= (1<<CS10);   // Prescaler /64 = Overflow alle 100ms und Timer starten
97
        TCCR1B |= (1<<CS11);   //
98
        
99
        TIMSK |= (1<<TOIE1);   // Overlfow ISR erlauben
100

101
        
102
        TCNT1 = 53036;      // TImer1 vorladen damit er  nach 100ms überläuft
103
    
104
    // Global Interrupts aktivieren
105
      sei();  
106

107
      
108

109
  
110
      
111

112
    
113
    /*
114
    uart_puts("Test");
115
    uart_puts("\n\r");
116
    send_int_uart(test_text);
117
    send_int_uart(test_text);
118
    uart_puts("\n\r");
119
    */
120
    
121
    
122
    
123

124
    
125
    
126
    
127
      
128

129
  }//Ende Dauerschleife
130
  }//Ende Hauptschleife
131

132
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
133

134
//Unterfunktion Integerwert über uart ausgeben
135
  void send_int_uart(int value)
136
  {
137
    char buffer [33];
138
    itoa (value,buffer,10);
139
    uart_puts(buffer);
140
  }
#2783661
Es macht keinen Sinn, wenn du den Timer dauern neu initialisierst

Mach deine Initialisierung EINMAL am Programmanfang und dann lass dein 
Programm die Hauptschleife betreten, in der es dann eben diesmal 
momentan (noch) nichts zu tun gibt. Ist ja kein Problem, wenn das so 
ist.
1
int main()
2
{
3

4
   die Initialisieungen
5
   wie zb Hardware Einstellungen
6
   Timer einstellungen etc.
7

8
   sei();
9

10
   while( 1 ) 
11
   {
12
      Logik in der Hauptschleife
13
   }
14
}

so sieht dein grundsätzlicher Programmaufbau aus.
#2783663
Und schmeiss die exzessiven Leerzeilen raus!

Dein Programm wird dadurch nicht übersichtlicher. Ganz im Gegenteil, du 
ziehst es nur künstlich in die Länge, ohne dass du etwas dafür bekommst.

Achte lieber auf konsistente Einrückung. Da hast du mehr davon.

Dann erledigt sich die 'Bin ich blind' Frage oft ganz von alleine.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.