Timer attiny45

#3834626
Lesenswert?

Hallo,
ich wollte am attiny45 mit einem Timer eine LED blinken lassen, 
allerdings bleibt diese aus. (die ist nicht kaputt (das habe ich schon 
getestet))
1
#define F_CPU 8000000UL
2
#include <avr/interrupt.h>
3
#include <avr/io.h>
4
volatile uint16_t zaehler = 0;
5

6

7

8
void Init(){
9
  DDRB |= (1<<PB0);  //PB0 -> Ausgang  
10
  PORTB &= ~(1<<PB0);  // PB0 -> low 
11
}
12

13

14
void Setup(){
15
 // Timer 0 konfigurieren
16
  TCCR0A = (1<<WGM01); // CTC Modus
17
  //TCCR0B |= (1<<CS01); // Prescaler 8
18
  TCCR0B |= ((1 << CS02) | (1 << CS00)); // Prescaler 1024
19
  // Overflow Interrupt erlauben
20
  TIMSK |= (1<<TOIE0);
21
  // Global Interrupts aktivieren
22
  sei();
23
}
24

25

26
int main(){
27
  Init();
28
  Setup();
29
  while(1){
30
  }
31
} 
32

33

34
ISR (TIMER0_OVF_vect){
35
  /* Interrupt Aktion alle
36
  (8000000/1024) Hz = 7182,5 Hz
37
  bzw.
38
  1/7182,5s = 0,128 ms  
39
  */
40
  zaehler++;
41
  if(zaehler>=7812){
42
    zaehler = 0;
43
    PORTB ^= ( 1 << PB0 );
44
  }
45
}

Eigentlich sollte die LED grob im Sekundentakt Blinken.
Hat einer eine Idee, woran das liegen könnte?

Chandler
#3834659
Lesenswert?

Eigentlich ist es egal, in welchen modus der läuft (so lange es 
funktioniert hätte)

aber ich habe auf den normal-modus gewechselt und es funktioniert (Habe 
also die Zeile
1
TCCR0A = (1<<WGM01); // CTC Modus
komplett gelöscht.

Eine andere Frage hätte ich dann aber noch bezüglich der Interrupt-Zeit, 
jetzt wechsel ich den status der LED, wenn der zähler >= 30 ist. das ist 
sehr grob eine Sekunde. Aber das passt absolut nicht mit meiner 
Berechnung zusammen.
Wie wird das denn berechnet?
Gast #3834665
Lesenswert?

Flohzirkus schrieb:

> CTC heißt: Clear Timer on Compare Match. Ein Overflow findet dann nicht
> mehr statt, soweit ich das in Erinnerung habe.

Fast richtig. Es gibt einen Sonderfall. Allerdings von eher geringem 
Interesse, das muß man schon zugeben. ;o)

> Ich glaube nicht, dass CTC der MOdus ist, den du haben möchtest.

Um einfach nur 'ne LED mit symmetrischem Tastverhältnis blinken zu 
lassen, ist CTC sogar ziemlich optimal. Man muß bloß die LED an dem 
Ausgang anschließen, wo der Timer das Blinksignal direkt hinliefern 
kann.

Eine ISR braucht man dafür dann nämlich gar nicht. Womit auch die 
korrekte Quellenwahl für den Interupt völlig überflüssig wird.
#3834681
Lesenswert?

Ahso, ja das passt dann ja.
Der Tiny sollte mit 8MHz laufen. Der Low-Fuse ist C2. Auf Enbgeded.com 
konnte ich das eingeben. mit C2 wird die clock(?) nicht durch 8 geteilt, 
sodass es 8MHz bleiben müssten.

@c-hater was meintest du, dass eine ISR nicht benötigt wird. Meintest 
du, dass ich es auch mit delay hätte machen können? Das ist richtig, 
allerdings wollte ich den Timer kennen lernen, damit ich später damit 
umgehen kann und mal eine Uhr oder ähnliches machen kann.
Persönliche Seite #3834689
Lesenswert?

Chandler Bing schrieb:
> @c-hater was meintest du, dass eine ISR nicht benötigt wird. Meintest
> du, dass ich es auch mit delay hätte machen können? Das ist richtig,
> allerdings wollte ich den Timer kennen lernen, damit ich später damit
> umgehen kann und mal eine Uhr oder ähnliches machen kann.

Der Timer kann selber bestimmte Ausgänge setzen/toggeln, ohne einen 
Interrupt bemühen zu müssen.
Gast #3834723
Lesenswert?

Hi

>Ergänzung: auch nicht mit dem Timer1, selbst dessen Prescaler mit max.
>16384 reicht nicht.

Bei Prescaler 1024 und 8MHz hat ein 16-Bit-Timer eine Overflow-Zeit von 
8,389 s. Also lässt sich ein 1s-Takt problemlos erzielen.

MfG Spess
Gast #3834727
Lesenswert?

der alte Hanns schrieb:

> Wie c-haters Vorschlag auf einem ATtiny45 (nur 8-bit-timer) umgesetzt
> werden kann, ist mir unklar; es wird doch eine Umsetzung 8 MHz -> 1 Hz
> verlangt.

Da habe ich wirklich nicht drauf geachtet, bei den x5-Tinys geht das 
tatsächlich nicht ohne ISR.

Also: Offensichtlich falsche Controllerwahl. Wenn das Ziel ist, eine LED 
mit 1Hz zu toggeln, sind die Tiny x5 nicht gut dafür geeignet.
#3834729
Lesenswert?

Oha, die letzten beiträge waren ein bisschen zu hoch für mich.
Ich bin froh, dass es bisher so funktioniert.
HAbe aber geguckt, wie der Timer direkt den Ausgang toggeln kann, aber 
nichts gefunden. Hat da evtl einer gerade die richtige seite oder tip 
parat?

@der alte Hanns
mit Sekundentakt blinken meine ich eine Sekunde an, eine Sekunde aus.
#3834745
Lesenswert?

Chandler Bing schrieb:
> Oha, die letzten beiträge waren ein bisschen zu hoch für mich.
> Ich bin froh, dass es bisher so funktioniert.
> HAbe aber geguckt, wie der Timer direkt den Ausgang toggeln kann, aber
> nichts gefunden. Hat da evtl einer gerade die richtige seite oder tip
> parat?

Sie dir die OUtput Compare Unit bzw. die COM-Bits im Register TCCR0A an.

In aller Kürze:
Es gibt da zb das Register OCR0A. Wenn immer der Wert in diesem Register 
mit dem Zählwert des Timers übereinstimmt, dann hat man einen Compare 
Match. Mit dem COM Bits COM0A0 bzw. COM0A1 kann man dieses Ereignis mit 
dem Pin OC0A (Pin 5, PB0) verknüpfen, so dass dieser Pin eine der 
Tabelle 11.2 entsprechende Aktion macht.
Gast #3834759
Lesenswert?

Wenn ich noch ergänzen darf: mit einem Systemtakt von 1 MHz (CKDIV8 
eingeschaltet) geht auch
>eine Sekunde an, eine Sekunde aus
auf dem ATtiny45.
(Und am Wochenende schalten Sie dann per clock-prescaler auf 4 MHz.)
Gast #3834778
Lesenswert?

>Hmmmm.
Um Missverständnissen vorzubeugen: ich meinte mit fortgeschrittenem 
Erkenntnisstand.

Aber ich hatte tatsächlich mal eine Anfrage für eine Uhr, die von Mo..Fr 
von 08:00..17:00 einige Minuten vorgeht, und nach Feierabend diese 
Differenz wieder 'zurückgibt'.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren