Forum: Mikrocontroller und Digitale Elektronik Noch eine Frage zum Interrupt


von Jannik O. (jannipanni)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lecker! (Gast)


Lesenswert?

6 Äpfel!

von Thomas E. (thomase)


Lesenswert?

Obi Wan schrieb:
> danke, sowas habe ich gesucht, jetzt kann ich den auch für den mega8
> umschreiben :D
Dann wirst du das für den 644 auch hinkriegen.

mfg.

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.