TIMER1 Overflow interrupt wird nicht aufgerufen

OP #2783643
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren