Forum: Mikrocontroller und Digitale Elektronik anfängerfrage zu assemblerbeispielen


von the beginner (Gast)


Lesenswert?

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?

von Klaus Bröntgen (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von the beginner (Gast)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

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