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
Gast
#443461
für welchen controller? für einen AVR könnte ich mal meinen Codewizard im Workpad bemühen ;-)
Gast
#443570
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
Gast
#443637
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.