Forum: Compiler & IDEs TIMER1 Overflow interrupt wird nicht aufgerufen


von M. H. (dbzwerg)


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
  }

von MWS (Gast)


Lesenswert?

Wie soll er auch weiterzählen, wenn er in der while immer wieder auf 
seinen Preload gesetzt wird ? Pack die while mal woanders hin.

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von M. H. (dbzwerg)


Lesenswert?

Super Jungs!!!

Manchmal sieht man die einfachsten Dinge nicht :-)

@ Karl Heinz

Die Leerzeilen fliegen auf jedfefall noch raus...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.