Noch eine Frage zum Interrupt

OP #2713303
Habe folgenden Code für den ATmega644:
1
#ifndef F_CPU
2
#define F_CPU 16000000UL
3
#endif
4

5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8
#include <stdio.h>
9
#include "lib_lcd.h"
10

11
#ifndef TIMER1_OVF_vect
12
#endif
13

14
#define TASTER1 (PORTC&1)==1
15
#define TASTER2 (PORTC&1)==1
16

17
char Sekunden     = 0;
18
char Minuten      = 0;
19
char Stunden      = 0;
20

21

22
// INTERRUPT
23

24
ISR (TIMER1_OVF_vect)             //Interrupt-Routine
25
{
26
  cli();                  //Interrupt abschalten
27
  
28
  Sekunden++;          
29
  
30
    if (Sekunden >= 59) 
31
    {
32
      Sekunden = 0;
33
      Minuten++;
34
  
35
      if (Minuten >= 59) 
36
      {
37
        Minuten = 0;
38
        Stunden++;
39
  
40
        if (Stunden >= 23) 
41
        {
42
          Stunden = 0;
43
        }
44
      }
45
    }
46
  }
47

48
  sei();                  //Interrupt zulassen
49
}
50

51

52
int main ()
53
{
54
  char text_buffer[17];
55

56
  TCCR1B = 0x02;              //Timer System Frequency Prescaler 8
57
  TIMSK0 |= (1<<TOIE1);          //Interrupt alle 100ms (Timer 1)
58
  sei();                  //Interrupt erlauben
59

60
  lcd_init();
61

62
  while (1)
63
  {
64
    if (TASTER1)
65
    {
66
      Minuten++;
67
    }
68

69
    if (TASTER2)
70
    {
71
      Stunden++;
72
    }
73
  
74
  sprintf(text_buffer,"%02u:%02u:%02u",Stunden,Minuten,Sekunden);
75
  lcd_string_xy(0,1,text_buffer);
76
  }
77

78
}

Wie muss ich nun den Timer-Interrupt parametrieren um jede Sekunde den 
Interrupt auszulösen?
Obi Wan schrieb:

> Wie muss ich nun den Timer-Interrupt parametrieren um jede Sekunde den
> Interrupt auszulösen?

Einfach mal ein wenig nachdenken.
Hier ist eine Anleitung dazu, wie man an Timer rangeht, so dass man all 
diese Dinge leicht bestimmen kann

FAQ: Timer

Du musst dazu keine komplizierten Formeln können oder sonstwas. Du musst 
nur soviel Mathe können, dass du ausrechnen kannst: wenn du in 10 
Minuten 1 Apfel essen kannst, wieviele Äpfel kannst du dann in 1 Stunde 
essen? Jeder Grundschüler kann das.
1
ISR (TIMER1_OVF_vect)             //Interrupt-Routine
2
{
3
  cli();                  //Interrupt abschalten

und das cli() bzw. das sei() am Ende der ISR nimmst du gleich wieder 
raus. Da hat der, bei dem du abgeschrieben hast, einen Fehler gemacht. 
Das gehört da nicht rein und ist gefährlich.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.