Forum: Mikrocontroller und Digitale Elektronik Frage für 8 Bit Timer


von gast (Gast)


Lesenswert?

Hallo,
ich habe eine kleine Frage es geht um ein 8 bit Timer. Nach meiner 
Berechnung, stelle ich fest, dass ich nicht mit einem Clock-Frequenz von 
5MHz, ein Timer, das jedes 1 Sekunde eine Aktion durchführe.
Berechnung: gewälte Prescaler 1024:
5MHz/1024=4882.81
gewünschte Zeit:t= 1s
OCR0A=t*4883.81 =4884 aber das Register ist 8 bit groß.

Ich vermute, dass ich irgendwo einen Fehler mache. Kann jemanden mir 
helfen?

von Juan C. (juan)


Lesenswert?

Morgen,

du braust noch einen Counter für Timer, um das zu zählen, wieviele Mals 
der Timer voll ist.
Also 256 / 4883 = 0,052 d.h. alle 0,052 Sek. sollte der Timer voll sein, 
20 mal ist 1 Sek.


Gruß
Juan

von QuizMaster (Gast)


Lesenswert?

Du hast noch ein 2tes Register!
Der Prescaler verringert NUR die Frequenz! MEHR NICHT
Einheit weiterhin [Hz].

Hier:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Timer.2FCounter_des_AVR

oder die Forensuche, da gibts etliche Beispiele!

Gruß

von Falk B. (falk)


Lesenswert?

@Juan Carlos (juan)

>Also 256 / 4883 = 0,052 d.h. alle 0,052 Sek.

Besser so rechnen

4883/256 = 19,07421875, also rund 19. Wenns genau sein soll, siehe

AVR - Die genaue Sekunde / RTC

MFG
Falk

von fubu1000 (Gast)


Lesenswert?

Hallo,
vielleicht verrätst du erstmal welcher Timer und uC das ist.
Weil wenn CTC Modus möglich ist wird das genau, ansonsten eher nit glaub 
ich.

Gruss

von Juan C. (juan)


Lesenswert?

Falk Brunner wrote:
> @Juan Carlos (juan)
>
>>Also 256 / 4883 = 0,052 d.h. alle 0,052 Sek.
>
> Besser so rechnen
>
> 4883/256 = 19,07421875, also rund 19. Wenns genau sein soll, siehe
>
> AVR - Die genaue Sekunde / RTC
>
> MFG
> Falk

Vielen Dank, hab schon noch etwas gelernt!

Gruß
Juan

von gast (Gast)


Lesenswert?

Hallo Zusammen,
wenn ich gut verstanden habe, soll ich in dem TCNT0-Register der Wert 20 
schreiben. Falls ich jede 1 Sekunde zählen möchte.

von Falk B. (falk)


Lesenswert?

@gast (Gast)

>wenn ich gut verstanden habe, soll ich in dem TCNT0-Register der Wert 20
>schreiben. Falls ich jede 1 Sekunde zählen möchte.

Das hast du falsch verstanden. Du musst 19 Überläufe (Overflow) vom 
Timer 0 zählen, dann ist ~1s vergangen.

Siehe auch AVR-Tutorial: Timer

MFG
Falk

von Juan C. (juan)


Lesenswert?

gast wrote:
> Hallo Zusammen,
> wenn ich gut verstanden habe, soll ich in dem TCNT0-Register der Wert 20
> schreiben. Falls ich jede 1 Sekunde zählen möchte.

Hi,
nur einfach eine Variable z.B. int counter einsetzen. In der 
Interrupt-Routine schreibst du counter++ bis counter = 19 ist 1 s 
vorbei.

Gruß

von QuizMaster (Gast)


Lesenswert?

Wenn nen Timer, wie oben schon gefragt wurde einen
CTC Modus besitzt, kann man sich den softwarezähler sparen, das kann der
Timer auch, und Zeiteffektiver.

Dazu im datenblatt unter den Timermodi CTC nachlesen.
Als Beispiel hier fuer einen Atmega 128:
1
TCCR0 = (1<<CS00) |(1<<CS02) | (1<<WGM01); //prescaler 128, CTC-mode
2
3
TIMSK  |= (1<<OCIE0);  //Enable Timer/Counter0 Compare Match interrupt.
4
ASSR= 0x00; //intern clock (!= from TOSC), synchronous clock
5
OCR0= 124; //timetick = 10ms: (1/(F_CPU/128) x 249 = 1ms)

Gruß

von QuizMaster (Gast)


Lesenswert?

edit:
F_CPU = 16MHz

von spess53 (Gast)


Lesenswert?

Hi

@ QuizMaster:  Und? Er will 1s, nicht 10ms. Und das geht mit einem 
8Bit-Timer und 5MHz nun mal nicht in einem Rutsch.

Ich persönlich würde zwar auch CTC benutzen, mit OCR= F3H/243D. Ergibt 
49,971ms. und dann bis 20 zählen.

MfG Spess

von QuizMaster (Gast)


Lesenswert?

Ups...
das m von ms wurde mal schnell dazugelesen,...

Ein 16Bit timer koennte das, vorrausgesetzt der Contzroller hat sowas...

Sonst doch nen Softwaretimer,...
sorry, Besserung in Aussicht ;-)

Gruß

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.