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?
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
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ß
@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
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
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
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.
@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
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ß
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ß
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.