Timer1 löst interrupt nicht in jedem Fall aus

Gast #5258997
Lesenswert?

Hallo Leute,

ich habe ein Problem. Ich bin noch recht neu, habe mich aber durch viele 
Dokumente schon durchgearbeitet um es selbst zu lösen, komme aber nicht 
weiter.

eHaJo Breakout board mit CPU: Atmega32U4 mit 16Mhz externem Quarz mit 
Prescaler 8, daher 2Mhz Controller Takt. Spannungsversorgung durch USB.

Programmiert wird mittels Flip.

Auf einem Steckbrett befindet sich eine 4x3 Tastenmatrix, realisiert mit 
einem 595er und 165er. An PortD habe ich 7 LED angeschlossen, um 
Rückmeldungen zu haben und zu sehen, was/ob was passiert.

Mein erster Schritt war, mich mit dem 16 bit Timer1 vertraut zu machen. 
Um zu sehen, ob etwas passiert, lasse ich PinD0 regelmäßig blinken, 
durch Überlauf einer uint16_t Variablen.

Mit dem Timer im CTC möchte ich eine weitere LED blinken lassen. Das hat 
anfänglich auch funktioniert. Aber dann ist mir etwas aufgefallen und 
ich verstehe noch immer nicht, warum das so ist.

Wenn ich im Code den Teil mit dem uint16_t Variablen Überlauf 
auskommentiere und die PinD0 nicht mehr getoggelt wird, scheint es, als 
würde der Timer1 nie anlaufen, bzw, der Interrupt nie ausgelöst.

Ich weiß nicht warum, könnt Ihr mir da weiterhelfen.

Mein Projekt ist modular aufgebaut und hier der Code.


1
#ifndef F_CPU
2
#define F_CPU 2000000UL
3
#endif
4

5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <stdbool.h>
8
#include "Timer.h"
9

10
#define  ms_to_run   50  //Dauer des Timers in ms
11

12
volatile bool timer_flag = false;
13

14
void Timer_init(){
15
  
16
  //Initialissierung 
17
  TCCR1A=0x00;
18
  TCCR1B=0x00; //Timer Reset und anhalten
19
  
20

21
  TCCR1B= (1<<WGM12)|(1<<CS11)|(1<<CS10); //CTC Modus und Prescaler 64
22

23
  OCR1A= ms_to_run*31.25;
24
  
25
  //Interrupt freischalten
26
  TIMSK1=(1<<OCIE1A);  //Compare Match Counter A
27
  
28
}
29

30
//Der Overflow Interrupt Handler
31

32
ISR (TIMER1_COMPA_vect)
33
{
34

35
timer_flag= true;
36

37

38
}



1
#ifndef F_CPU
2
#define F_CPU 2000000UL
3
#endif
4

5

6

7
#include <avr/io.h>
8
#include <avr/interrupt.h>
9
#include <stdbool.h>
10
#include "Timer.h"
11

12

13

14
#define LEDPort PORTD
15
#define LED_DDR DDRD
16

17
extern bool timer_flag;
18

19
uint16_t Anzahl=0;
20

21

22
  int main(void){
23

24

25
  LED_DDR=0xFF;  //PortD als Ausgang für die LEDPort schalten
26

27
  
28
  Timer_init();  //Timer initialisieren
29

30
  sei();
31
   
32
   
33
    while (1) 
34
    {
35
    
36
    //Anzahl++;
37
    //
38
    //if (Anzahl==0){
39
      //LEDPort^=(1<<PIND0);
40
      //
41
    //}
42
    
43

44
    
45
    if (timer_flag==true){
46

47
      LEDPort^= (1<<PIND7);
48
      timer_flag=false;
49

50
    }
51
  }
52
}

Wenn der Teil direkt nach While auskommentiert ist, funktioniert das 
Blinken nicht. Ist es nicht auskommentiert und PIND0 wird regelmäßig 
getoggelt, läuft auch die Timer1 Geschichte.

Ich hoffe, ich habe es verständlich rübergebracht und es kann mir jemand 
weiterhgelfen.

Schöne Tage und einen Guten Ruscth und eine super neues Jahr 2018

Gruß
Jens

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