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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jens Kotte (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Jens Kotte schrieb:
> extern bool timer_flag;

Sieht nach einem fehlenden "volatile" aus :)

von Jens K. (fkott)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.