anfängerfrage zu assemblerbeispielen

Gast #274248
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?
Gast #274249
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.
#274250
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.
Gast #274252
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.