Hallo allerseits :), void isrtim0() interrupt 1 { TH0=-98; counter++; } das wär meine Frage, wie kommt man dazu, TH0 mit einen negativen Wert zu laden? Und warum entfällt dann TL0? (Timer befindet sich in Betriebsart 1) lg martini
>das wär meine Frage, wie kommt man dazu, TH0 mit einen negativen Wert zu >laden? Das ist für Leute, die nicht wissen, daß ein 8-Bit-Register von 255 (0xFF) auf 256 (0x00) überläuft ;-) Genauso hätte man TH0 mit 158 laden können, der Timer zählt dann 98 Schritte hoch, bis er 256 erreicht. Na ja, läßt sich halt leichter lesen. > Und warum entfällt dann TL0? Wenn beim Interrupt die µs keine Rolle spielen (z.B. Tastenentprellung) braucht man TL0 nicht voreinstellen. TL0 hat dann den Resetwert (0).
hm, nur stellt sich mir die frage wie -98 dargestellt wird dann, mitn taschenrechner hab ichs versucht: 1111111111111111111111111111111111111111111111111111111110011110 da kommt das raus, da es nur ein 8 bit register ist, werden nur die hinteren 8 bit dann verwendet? die vorderen quasi einfach verworfen?? also wärs dann 10011110 und das ist 158...soweit richtig? das mit TL0 versteh ich noch nicht ganz, bis jetzt haben wir eig immer beide Register mit Werten beschrieben, also immer als 16 Bit Timer verwendet. Hier wird ja genauso ein 16 Bit Zähler verwendet, aber nur TH0 verwendet? könnte ich genauso gut TL0 verwenden? und das mit µs, inwiefern keine Rolle spielen? hm da fehlt mir noch einiges ^^ aber danke für deine Antwort. lg
>könnte ich genauso gut TL0 verwenden? Nein. Bei einem Überlauf des Timers sind die Timerregister gleich 0. Wenn du nur TH0 beschreibst, so steht in TL0 immer noch 0. Würdest du aber TL0 beschreiben, ergäbe sich eine andere Ablaufzeit des Timers. Das Phänomen TH0=-98 lässt sich mit negativen Dualzahlen erklären. Schau mal hier rein (Kapitel 3.2 ab Seite 4): http://www.m-if.de/2006-7/IF10/Skript%20IF10%20-%20Das%20Bin%E4rsystem%20-%20Teil1.pdf Ich hoffe, dass hilft dir. Gruß, MC
Zweierkomplement heißt das Zauberwort. Negative Werte werden in Zweierkomplement-Darstellung verarbeitet. Die -98 wird in den entsprechenden Hexadezimalwert 9E (bei 8 Bit Breite, bei 16 Bit wären es entsprechend FF9E, und der Windows-Taschenrechner hat eben einen noch höheren Wertebereich und baut deshalb noch eine ganze Stange Fs ein) umgewandelt.
hey, soweit so gut, is schon wieder ne weile her mit dem zweierkomplement und so ^^, ja das hilft mir sehr, muß mich wieder mehr damit beschäftigen, anscheined verfolgt das einem noch öfters ^^. danke für eure hilfreichen u schnellen antworten lg
>und das mit µs, inwiefern keine Rolle spielen? hm da fehlt mir noch >einiges ^^ Nehmen wir an, der µ läuft mit 12MHz und TH0 enthält 156. Wenn TL0 0 enthält, dann dauert es 100*256 µs = 25,60 ms bis der Timer überläuft und der Interrupt ausgelöst wird. Wenn jetzt TL0 mit 206 geladen wird, dauert es 25,55 ms bis der Timer überläuft, also 50µs weniger (TL0 wird jede µs inkrementiert).
Wenn das Low-Byte des Reloadwertes 0 ergibt oder es nicht so drauf ankommt, reicht es nur TH0 zu laden. Wenn man aber auch TL0 laden will, wird es etwas tricky, da ja ständig Zyklen vergehen (TL0 läuft weiter), aber die Zeit bis zum Interrupteintritt unbestimmt ist. In diesem Fall muß man unbedingt die seit dem Überlauf vergangene Zeit berücksichtigen, d.h. der Reload muß durch Addition zu der bereits vergangenen Zeit erfolgen. Und die Zeit für die Addition selber muß natürlich auch berücksichtigt werden. Hier ein Beispiel: http://home.tiscali.de/peterd/appl/soft/clock/index.htm Peter
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.