hallo
in assemblerbeispielen finde ich öfter so was:
;Pause nach jeder Übertragung
delay50us: ;50us Pause
ldi temp1, $42
delay50us_:dec temp1
brne delay50us_
ret ;wieder zurück
was bedeuten diese $42 sachen? weil wenn ich 42 von hex nach dez
umrechne kommt 66 raus, also ich peil nicht was dass heißt.
allgemein: ich peil den kompletten teil quelltext nicht.
diese "wartezeit" wird doch mitnem timer erreicht oder? also timer so
lang zählen bis gegebener wert ereeicht, oder?
nein, kein timer, sondern eine rechenpower-vernichtungsmaschine. das
register temp1 wird mit einer zahl (hier halt $42 oder 66 dezimal)
geladen. dann wird 1 abgezogen (dec temp1).wenn das ergebnis dieser
operation ungleich null ("brne...") ist, wird erneut an die stelle
gesprungen, an der 1 abgezogen wird ("...delay50us") . dies geschieht
also solange, bis das ergebnis gleich null ist, dann wird über ret das
unterprogramm verlassen. hier wird die schleife also 66mal
durchlaufen.
der vorteil dieser methode ist, sie ist leicht zu implementieren. der
nachteil ist, sie blockiert solange alle anderen aufgaben des
controllers.
brne bedeutet "branch if not equal" und heißt "springe, wenn das
null-flag nicht gesetzt wurde". so wird das resultat der dec-operation
auf null geprüft.
die 42 kannste durch jede andere zahl ersetzen, abhängig davon wird die
abarbeitungszeit kürzer oder länger.
Aeh. Nein. Das da oben ist kein Timer. Das ist ganz einfach eine Zaehlschleife. Im Grunde dasselbe was auch die Kinder benutzen wenn sie 'Verstecken' spielen (... , 99, 100, Ich koooooommmmmeeeee) Der µC zaehlt in einer Schleife von einem bestimmten Wert runter auf 0. Je nach Prozessortakt braucht er dafuer mehr oder weniger Zeit. Man muss also wissen wie schnell (MHz) der Prozessor getaktet wird, weiters muss man wissen wieviele Takte in der Zaehlschleife insgesammt verbraucht werden und schon kann man berechnen wie lange das dauert. Im konkreten Fall werden halt 66 Durchlaeufe durch die Schleife benoetigt, damit in Summe 50us vergehen.
merci für die infos! aber wie kann ich den prozessor warten lassen, ohne power zu verbrauchen und ohne dass er nebenbei nix mehr anderes macht?
Das geht nur über einen Timer. Den stellst du dir ein, wie du ihn brauchst. Dann setzt du den Controller in den Sleep-Modus. Ein Timer-Interrupt weckt den Controller aus dem Sleep-Modus. Der Interrupt muss dazu aber auch freigeschalten werden, das blosse Einstellen des Timers reicht nicht... Ralf
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.