Forum: Mikrocontroller und Digitale Elektronik Timer attiny45


von Chandler B. (chandler)


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

: Bearbeitet durch User
von Flohzirkus (Gast)


Lesenswert?

Chandler Bing schrieb:

>   TCCR0A = (1<<WGM01); // CTC Modus

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

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

von Flodder (Gast)


Lesenswert?

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

Und wenn er ihn doch haben möchte, muß kann er einen anderen Interrupt 
nutzen und muß das Compareregister setzten.

von Chandler B. (chandler)


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?

von Flodder (Gast)


Lesenswert?

Chandler Bing schrieb:
> Wie wird das denn berechnet?

Zeich erst nochmal dein komplettes Programm. Der Tiny läuft wirklich mit 
8MHz (CKDIV8 Fuse beachtet)?

von c-hater (Gast)


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.

von der alte Hanns (Gast)


Lesenswert?

>Wie wird das denn berechnet?
Der Timer0 läuft mit seinen 8 bit von 0 bis 255:
8000000 Hz /1024/256= 30.5 Hz

von Chandler B. (chandler)


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.

von Christian H. (netzwanze) Benutzerseite


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.

: Bearbeitet durch User
von der alte Hanns (Gast)


Lesenswert?

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.

von der alte Hanns (Gast)


Lesenswert?

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

von Flodder (Gast)


Lesenswert?

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

Warum nicht wenn man den Comparematch-pin toggeln läßt?

von der alte Hanns (Gast)


Lesenswert?

Okay, zugegeben - es kommt darauf an, was genau der Fragesteller unter 
dem 'Sekundentakt blinken' versteht.

von spess53 (Gast)


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

von der alte Hanns (Gast)


Lesenswert?

Und welches ist der 16-bit-timer beim ATtiny45?

von c-hater (Gast)


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.

von Flodder (Gast)


Lesenswert?

spess53 schrieb:
> 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.

Na ja, im Tiny45 sind die Verhältnisse anders und man schafft den 
1s-Takt so eben. (Timer1 ist nur 8 Bit)

von Chandler B. (chandler)


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.

von spess53 (Gast)


Lesenswert?

Hi

>Und welches ist der 16-bit-timer beim ATtiny45?

Mist ist ja ein ATTiny45. Aber mit Timer1 und Prescaler 16384 reicht es 
trotzdem knapp (OCR= 0xF9) für einen 1s-Takt.

MfG Spess

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

spess53 schrieb:
> Mist ist ja ein ATTiny45. Aber mit Timer1 und Prescaler 16384 reicht es
> trotzdem knapp (OCR= 0xF9) für einen 1s-Takt.

 OCR1A = 0xF3 dürfte hinhauen. Aber da der TO von einem 2 Sekunden Takt
 redet, reicht es immer noch nicht.

von Flodder (Gast)


Lesenswert?

Chandler Bing schrieb:
> @der alte Hanns
> mit Sekundentakt blinken meine ich eine Sekunde an, eine Sekunde aus.

@der alte Hanns & Chandler Bing
Hast recht gehabt Hanns. Leider reicht da der Timer1 doch nicht so wie 
angedacht. Da kriegt man nur ca 0,5s an und 0,5s aus :(

von der alte Hanns (Gast)


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.)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

der alte Hanns schrieb:
> (Und am Wochenende schalten Sie dann per clock-prescaler auf 4 MHz.)

 Hmmmm.
 Montag bis Freitag 8:00 - 16:00 - SystemTakt auf 8MHz, Prescaler = 1.
 Freitag 16:01 - Montag 07:59 - SystemTakt 32768KHz, Prescaler = 16384.
 Und sich nach LED-blinken richten.

von der alte Hanns (Gast)


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'.

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.