Forum: Mikrocontroller und Digitale Elektronik Timer1 löst interrupt nicht in jedem Fall aus


von Jens Kotte (Gast)


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

von . . (Gast)


Lesenswert?

Jens Kotte schrieb:
> extern bool timer_flag;

Sieht nach einem fehlenden "volatile" aus :)

von Jens K. (fkott)


Lesenswert?

Hallo Gast,

vielen Dank. Ich hatte es befürchtet, das es am Ende etwas sehr 
einfaches ist, bin aber trotzdem nicht drauf gekommen.

Gruß
Jens

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.