ATtiny4313: 16 Bit Timer/Interrupt jede s erzeugen

Gast #3418527
Lesenswert?
• ▲
▼
Hallo,

ich bin relativ neu hier und hab noch nicht sooo viel Ahnung von MCUs.
Ich versuche eine einfache Binäruhr mit dem Attiny zu basteln. Dazu habe 
ich folgenden Code geschrieben um den entsprechenden Timer einzustellen:
1
  TCCR1B = (1<<CS12|1<<WGM12);
2
  OCR1A = 15625-1;
3
  TIMSK = 1<<OCIE1A;
4
  sei();
die ISR schaut so aus:
1
ISR(TIMER1_COMPA_vect)
2
{
3
  seconds++;
4
        usw.
5
}
Der Tiny hängt an einem 4MHz quarz und Fuses habe ich sowie auf dem Bild 
gesetzt.
Nun zum eigentlichen Problem. Der INterrupt kommt nicht annährend im 
sekundentakt. Es vergehen mindestens 3-5s bis der MCU schaltet.
Woran liegt das was ist da los?
Ich habe einen ähnlichen code mit meinem ATMega8 getestet mit dem 
unterschied, dass ich in der ISR eine LED ein und ausschalte aber dort 
ist das schon eher ein sekundentakt (auch 4mhz quarz)

Den kompletten sourcecode gibt es hier unten (damit es oben 
übersichtlicher bleibt):
1
#define F_CPU  4000000UL
2
#include <util/delay.h>
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5

6
/*Global Variables Declarations*/
7
unsigned char hours = 0;
8
unsigned char minutes = 0;
9
unsigned char seconds = 0;
10

11
void refreshDisplay(void)
12
{
13
  PORTD = hours+96;
14
  PORTB = seconds;
15
}
16

17
ISR(TIMER1_COMPA_vect)
18
{
19
  seconds++;
20
   
21
  if(seconds == 60)
22
  {
23
    seconds = 0;
24
    minutes++;
25
  }
26
  if(minutes == 60)
27
  {
28
    minutes = 0;
29
    hours++;  
30
  }
31
  if(hours > 23)
32
    hours = 0;
33
}
34

35
int main(void)
36
{
37
  int Pressed = 0;
38
  int Pressed_Confidence_Level = 0; //Measure button press cofidence
39
  int Released_Confidence_Level = 0; //Measure button release confidence
40
  DDRB = 0xff;
41
  DDRD = 0x1f;
42
  
43
  DDRD &= ~(1 << PIND6);
44
  PORTD |= 1 << PIND6;
45
  DDRD &= ~(1 << PIND5);
46
  PORTD |= 1 << PIND5;
47

48
  TCCR1B = (1<<CS12|1<<WGM12);
49
  OCR1A = 15625-1;
50
  
51
  TIMSK = 1<<OCIE1A;
52
  
53
  sei();
54
   
55
   
56
  while(1)
57
  {  
58
    if (bit_is_clear(PIND, 5))
59
    {
60
      Pressed_Confidence_Level ++;
61
      Released_Confidence_Level = 0;
62
      if (Pressed_Confidence_Level >500)
63
      {
64
        if (Pressed == 0)
65
        {
66
          minutes++;
67
          seconds = 0;
68
          if(minutes == 60)
69
          {
70
            minutes = 0;
71
            hours++;  
72
          }
73
          refreshDisplay();
74
          Pressed = 1;
75
        }
76
        Pressed_Confidence_Level = 0;
77
      }
78
    }
79
    else if (bit_is_clear(PIND, 6))
80
    {
81
      Pressed_Confidence_Level ++;
82
      Released_Confidence_Level = 0;
83
      if (Pressed_Confidence_Level >500)
84
      {
85
        if (Pressed == 0)
86
        {
87
          hours++;
88
          if(hours > 23)
89
            hours = 0;
90
          refreshDisplay();
91
          Pressed = 1;
92
        }
93
        Pressed_Confidence_Level = 0;
94
      }
95
    }
96
    else
97
    {
98
      Released_Confidence_Level ++;
99
      Pressed_Confidence_Level = 0;
100
      if (Released_Confidence_Level >500)
101
      {
102
        Pressed = 0;
103
        Released_Confidence_Level = 0;
104
      }
105
    }
106
    refreshDisplay();
107
  }
108
}
Angehängte Dateien:

Antwort schreiben

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.

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.