Hallo Zusammen, meine Frage: Wieviele Takte (Perioden, "T") hat ein Maschinenzyklus beim AVR. Zum Verständnis: Ich programmiere gerade an einem C515c. Hier sieht es so aus das ein MZ 6 Takte lang ist. Was dazu führt das ich 1/f * 6 rechne um auf die Zeit in Sekunden zu kommen die ein MZ benötigt. Das ist mir deshalb wichtig weil der C515c Timer das Zählregister pro MZ um 1 inkrementiert. Weis ich jetzt wieviel Takte ein MZ hat, kann ich mir mit der Frequenz die Zeit in Sekunden umrechnen und weiss wie oft ich inkrementieren müsste damit ich bsp auf eine Sekunde komme, mal unabhängig davon wie weit ich überhaupt zählen kann. Jetzt müsste ich wissen wie das beim AVR aussieht. Im Datenblatt steht bei bsp inc das der n clock von 1 braucht. Meinen die mit clock wirklich Takt also das was ich bekomme wenn ich 1/f rechne, eine Periode T. Wenn das so wäre würde ich nicht verstehen wiso es dann leichte Probleme gibt ein genaues 1Hz Signal zu erhalten. Angenommen der Timer inkrementiert ein Register jeden Takt um 1. Und ich betreibe den MC mit externem 2MHz Quarz und stelle den Timer so ein, dass der mir auf 200 Zählt hätte ich ja das Überlaufflag vom Timer auf ziemlich genau 10KHz. Prog ich den zweiten Timer als Counter und steuer mit dem Überlaufflag vom ersten Timer den Eingang des Zweiten Timers an und lass den zweiten Timer, übrigens 16 Bit, auf 10000 Zählen müsste ich doch ein Überlaufflag am zweiten Timer von genau 1Hz haben. Also 200 mal auf 10000 Zählen ergibt 2000000 Takte. Pro Takt 500ns also 2000000 * 500ns = 1s. Bitte der Grammatik keine Beachtung schenken. Gruß
>meine Frage: Wieviele Takte (Perioden, "T") hat ein Maschinenzyklus beim >AVR. 1. >Meinen die mit clock wirklich >Takt also das was ich bekomme wenn ich 1/f rechne, eine Periode T. Ja. >Angenommen der Timer inkrementiert >ein Register jeden Takt um 1. Und ich betreibe den MC mit externem 2MHz >Quarz und stelle den Timer so ein, dass der mir auf 200 Zählt hätte ich >ja das Überlaufflag vom Timer auf ziemlich genau 10KHz. Du kannst keinen Timer Programmieren dass er auf 200 überläuft. Entweder er zählt bis er überläuft also bis 2**bitbreite-1 oder lässt den Timer kontinuierlich mit einem Wert vergleichen und dann einen Compare-Match Interrupt auslösen*). >Wenn das so wäre würde ich nicht verstehen wiso es dann leichte Probleme gibt Was für Probleme hast du denn dabei? *oder auch nur das Flag im passenden Register setzen
> Du kannst keinen Timer Programmieren dass er auf 200 überläuft. Wieso nicht? Wenn der Timer interruptgesteuert läuft, geht das. 2^n - 200 ist der Zählwert, den er in jedem Interrupt neu setzt. Um exakt 200 zu zählen, muss er dann noch den Einsprung in den Interrupt und das eventuelle Register-Pushen auf den Stack miteinberechnen. Peter Danneger hat auf seiner Website ein Beispiel für einen 805x, das sollte sich leicht auf einen AVR anpassen lassen. Ich kann's leider nicht posten, da ich mit AVRs noch nicht gearbeitet hab, aber bei meinen 805x-ern tut's einwandfrei :) Ralf
>2^n - 200 ist der Zählwert Yo. Und was für ein Wert steht dann beim Überlauf im Timer Register? >Um exakt 200 zu zählen, muss er dann noch den Einsprung in den Interrupt >und das >eventuelle Register-Pushen auf den Stack miteinberechnen. Damit hast du Recht, und da fängt es dann auch unter Umständen an komplizierter zu werden.
Ralf schrieb: >> Du kannst keinen Timer Programmieren dass er auf 200 überläuft. > Wieso nicht? Wenn der Timer interruptgesteuert läuft, geht das. 2^n - > 200 ist der Zählwert, den er in jedem Interrupt neu setzt. Um exakt 200 > zu zählen, muss er dann noch den Einsprung in den Interrupt und das > eventuelle Register-Pushen auf den Stack miteinberechnen. Und verzählt sich dann, weil er nicht weiss, ob der Interrupt vielleicht auftrat, während ein Befehl mit 2, 3 oder 4 Takten Dauer lief (der aktuelle Befehl wird immer erst zuende ausgeführt!). Mit Prescale-Faktor 64 (das geht bei glatten MHz-Frequenzen noch auf, 256 ginge bei Vielfachen von 4MHz) kann man 1Hz mit einem Jitter von max. 3 CPU-Takten hinbekommen. Damit hat man dann aber bereits einen nicht unerheblichen Teil der Rechenzeit nur für ein bisschen Timekeeping verbraten, Interrupts (ausser dem einen Timer natürlich) darf man auch nicht mehr benutzen, cli() und sei() sind Tabu etc. Vielleicht ist ein 32768Hz-Quarz oder externe RTC doch einfacher... Andreas
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.