Hallo! Ich soll eine Software Lösung für eine Zeitschleife mit einer Verzögerungszeit von 160us entwerfen. Der MC hat eine TF von 8MHz Wie sieht dazu die Lösung auf? Ich habe da schon die Taktrate berechnet, die ist 1280, aber ich weiss einfach nicht wie ich den Assembler schreiben soll... Gruß und Danke im Vorraus! Dominik
hm, naja scheint ja doch nicht so wichtig zu sein... also hier mal ein beispiel für ne simple warteroutine ;-------------------------------------------------------------------- ; Prozessor : ATmega16 ; Takt : 8000000 Hz ; Datum : 19.11.2006 ;-------------------------------------------------------------------- ; created by myAVR-CodeWizard ;-------------------------------------------------------------------- ; Warte-Routine für 16 µs ; die Routine wartet inclusive Aufruf 15,88 µs ;-------------------------------------------------------------------- myWait_16us: push r16 ldi r16,1 myWait_16us_3: push r16 ldi r16,1 myWait_16us_2: push r16 ldi r16,34 myWait_16us_1: dec r16 brne myWait_16us_1 pop r16 dec r16 brne myWait_16us_2 pop r16 dec r16 brne myWait_16us_3 pop r16 ret ;-------------------------------------------------------------------- cu BT
Das schöne am AVR ist,das sogut wie jeder Befehl genau einen Takt zur Ausführung benötigt.Das ist bei etlichen anderen Mikrocontrollern nicht so.Da würde dann z.B. der Comparebefehl 2 Takte benötigen während ein Speicherzugriff 3 Takte benötigt.Das macht es schwer,die genaue Dauer einer Befehlssequenz vorher zu berechnen. Um nun die Warteschleife zu schreiben,benötigt man nun also folgende Dinge: - 2 Allzweckregister (8 Bit besitzen nur einen Wertebereich von 0..255): R16 und R17 - den Inkrementbefehl inc (inc R16 bedeutet R16 = R16+1) - einen Befehl um unseren Allzweckregisterinhalt mit einem konstanten Wert zu vergleichen: cpi - und zuguter letzte einen bedingten Sprung: breq (branch equal,springe wenn gleich) Damit lassen sich dann 2 inneinander verschachtelte Schleifen erzeugen: R16 = 0 äussere Schleife: R17 = 0 innere schleife : R17 = R17+1 Ist R17 < Konstante1? wenn ja -> springe innere Schleife R16 = R16+1 ist R16 < Konstante2? wenn ja -> springe äussere Schleife Die Konstante berechnen und das ganze aus dem Pseudocode in Assembly überführen musst du schon selber.Mit hoher Wahrscheinlichkeit wirst du keine 2 Konstanten finden,die genau zu 1280 Takten führen.Da nimmt man dann den nächst kleinere Wert und schreibt füllt unter der Schleife den Code mit 'nop'-Befehlen auf.Die dauern exakt einen Takt und tun exakt garnichts. Einfacher ist diese Warteschleife übrigens mit einem Timer zu realisieren.Den initialisiert man einmal und kann eine sehr exakte Warteschleife durch das pollen (periodisches abfragen) eines Flags realisieren.
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.