Problem mit ATtiny2313 Timer0 compare

OP #1395605
Hallo,

ich habe folgenden Code geschrieben:
1
#include <avr/io.h>
2
#include <inttypes.h>
3
#ifndef F_CPU
4
#define F_CPU 4000000UL
5
#endif
6
#include <util/delay.h>
7
#include <stdint.h>
8
#include <avr/interrupt.h>
9
#include <stdlib.h>
10

11
volatile uint16_t count;
12
volatile uint16_t sec;
13

14
int main()
15
{
16
  DDRB=0b11111011;
17
  PORTB=0b11111011;  //LEDs aus
18

19
  count=0;
20
  sec=0;
21

22
  while(1)
23
  {
24
    if((PINB & 0b00100000) == 0)
25
    {
26
      sei();  //Gobale Interrupts erlauben
27

28
      TCCR0B |= (1<<CS01);  //CPU/64
29
      TCCR0B |= (1<<CS00);  //auch... :-)
30

31
      TCCR0A |= (1<<WGM01);  //CTC
32

33
      OCR0A = 100;  //Setze Compare-register auf 100
34

35
      TIMSK |= (1<<OCIE0A);  //aktivire compare-interrupt
36

37
      PORTB=0x00;
38

39
      while(1)
40
      {
41
        if(sec==60)
42
        PORTB |= (1<<PB3);
43

44
        if(sec==120)
45
        PORTB |= (1<<PB4);
46

47
        if(sec==180)
48
        {
49
          while(1)
50
          {
51
            PORTB |= (1<<PB2);
52
            _delay_ms(1.5);
53
            PORTB &= ~(1<<PB2);
54
            _delay_ms(1.5);
55
          }
56
        }
57
      }
58
    }
59

60
  }
61

62
  return 0;
63
}
64

65
ISR (TIMER0_COMPA_vect)
66
{
67
  count++;
68

69
  if(count==625);
70
  {
71
    count=0;
72
    sec++;
73
  }
74
}

das ganze soll nach einer Minute eine LED ausschalten (PB3), dann 
nochmals eine Minute später eine weiter ausschalten(PB4). Wiederrum eine 
Minute später wird die 3. LED ausgeschaltet.

Das funktioniert auch soweit, nur dass die Zeit nicht stimmt.... 
1min=1sec??? (circa) warum? -  was mache ich falsch???

Ich benute den internen 4MHZ RC.

Doran

PS: Nutze AVR-Studio und den ATtiny2313
OP #1395705
Hallo,

ok, danke, die Funktion mit dem Taster hat aber trotzdem 
funktioniert....
Habs jetzt aber natürlich korregiert.
Doch die Zeit ist immernoch viel zu lang, ich habe das jetzt schon ewig 
an und die LEDs gehen nicht aus....... :-(

weiß jemand Rat?

Doran
OP #1395737
Hallo,

echt?

Ich dachte:

4000000HZ/64=62500

62500/100=625

oder stimmt da was nicht?

Habe jetzt die CKLDIV8 Fuse "unprogrammed" gemacht, jetzt stimmt die 
Zeit.
Was genau ist denn eigentlich die Funktion dieser Fuse?

mfg

Doran

PS: Oder stimmt meine Zeit jetzt nicht ganz genau?
#1395746
Doran S. schrieb:

> 4000000HZ/64=62500
>
> 62500/100=625
>
> oder stimmt da was nicht?

Habe meinen Einwand zurückgezogen. Habe mich im Simulator vertan.

> Habe jetzt die CKLDIV8 Fuse "unprogrammed" gemacht, jetzt stimmt die
> Zeit.
> Was genau ist denn eigentlich die Funktion dieser Fuse?

Datenblatt!

CLKDIV8

   CLK   wie Clock
   DIV   wie Divide
   8     wie Acht

In Summe: Teile die Clock Frequenz durch 8

Dein µC lief nicht mit 4 Mhz, sondern mit 4/8 -> 0.5Mhz

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.