Forum: Mikrocontroller und Digitale Elektronik Simple frage zu Maschinenzyklus


von Tony Stark (Gast)


Lesenswert?

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ß

von .blackhat .. (blackhat-blade)


Lesenswert?

>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

von Ralf (Gast)


Lesenswert?

> 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

von .blackhat .. (blackhat-blade)


Lesenswert?

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

von Andreas F. (aferber)


Lesenswert?

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
Noch kein Account? Hier anmelden.