Forum: Mikrocontroller und Digitale Elektronik Hilfe zu Timer0 (Attiny13)


von Uwe W. (uwel)


Lesenswert?

Bitte um Hilfe
beim Timer0 und einem Prescaler von 1024 beträgt die maximale Zeit 
1200khz/1024 = 0,8504ms und somit bei einem Interrupt bei 256 (256x 
0,8504ms=217ms

Für eine Schaltzeit von zB 1500ms bräuchte man 1500/217ms = 6,9 x mehr
Frage wie macht man das ?

Gruß Uwe

NS- ja .. mit einem Timer1 wäre das einfacher, doch der Attiny13 hat nun 
eben nur einen Timer0 (8Bit)

Bisheriges Programm

...

Config PortB.0=Output
Config Timer0=Timer, Prescale=1024
Enable Timer0
Do
if timer=> 255 then
PortB.= 1
Else
PortB.0 =0

End If
Loop
End

von Karl H. (kbuchegg)


Lesenswert?

Uwe W. schrieb:
> Bitte um Hilfe
> beim Timer0 und einem Prescaler von 1024 beträgt die maximale Zeit
> 1200khz/1024 = 0,8504ms und somit bei einem Interrupt bei 256 (256x
> 0,8504ms=217ms
>
> Für eine Schaltzeit von zB 1500ms bräuchte man 1500/217ms = 6,9 x mehr
> Frage wie macht man das ?

Hat der Tiny13 beim Timer einen CTC Modus?

Wenn ja, dann lass ihn eben nicht bis 255 laufen, sondern rechne dir 
aus, bis zu welcher Zahl er zählen muss, damit du wieder einen 
ganzzahligen Teiler bekommst.

von Karl H. (kbuchegg)


Lesenswert?

Uwe W. schrieb:

> Bisheriges Programm
>
> ...
>
> Config PortB.0=Output
> Config Timer0=Timer, Prescale=1024
> Enable Timer0
> Do
> if timer=> 255 then
> PortB.= 1
> Else
> PortB.0 =0
>
> End If
> Loop
> End

Das bringt dich nicht weiter.
Du musst dir vom Timer einen Interrupt auslösen lassen, wenn er 
'überläuft'. Und im Interrupt zählst du dann eine weitere Variable bis 
6.9
Da du aber nicht bis 6.9 zählen kannst, musst du den Timer so 
hinkriegen, dass er eben nicht bei 255 den Überlauf auslöst sondern 
schon früher. Eben so weit, dass du in der Interrupt Routine wieder eine 
ganze Zahl hast.
Wenn der Timer keinen CTC kann, dann muss man eben das Timer Register 
mit einem Wert vorladen, so dass er dann die ausgerechnete Anzahl 
SChritte braucht um wieder bei 255 einen Überlauf auszulösen.
Aber CTC ist besser.

von ziegenpeter (Gast)


Lesenswert?

Wenn's nicht auf die Millisekunde genau sein soll, könntest du im 
Overflow-Interrupthandler ein Variable (mind. 16bit) hochzählen (um 
217), wenn der Wert der Variable größer als 1500 ist, ist deine 
Schaltzeit vorbei bzw. dann musst du schalten und du ziehst von der 
Variable 1500 ab, und wartest wieder bis größer als 1500.

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.