Forum: Compiler & IDEs Problem mit ATtiny2313 Timer0 compare


von Doran S. (utzer)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

1
  if(count==625);

schau mal ganz scharf ans Ende dieser Zeile in der ISR :-)

von Doran S. (utzer)


Lesenswert?

Hallo,

ok, danke, dass ist mir ganrnicht aufgefallen........
Allerdings läuft das jetzt ewig(Zeit viel zu lang....)
wo ist da noch ein Fehler????

mfg

Doran

von Karl H. (kbuchegg)


Lesenswert?

1
  DDRB=0b11111011;
2
  PORTB=0b11111011;  //LEDs aus
3
4
  count=0;
5
  sec=0;
6
7
  while(1)
8
  {
9
    if((PINB & 0b00100000) == 0)

Du fragst PB5 ab, ob der entsprechende Input Pin auf 0 liegt. Du 
konfigurierst PB5 aber nie auf Input.

von Doran S. (utzer)


Lesenswert?

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

von Doran S. (utzer)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

Bau dir Code rein, an dem du erkennen kannst, ob der Tastendruck auch 
wirklich angenommen wird.

Laut Simulator sollte das Timing stimmen.

von Karl H. (kbuchegg)


Lesenswert?

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

von Doran S. (utzer)


Lesenswert?

Hallo,

ok, dann passt jetzt alles.... freu :-)

Vielen Dank für die Hilfe!

mfg

Doran

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.