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.