Forum: Mikrocontroller und Digitale Elektronik Software Lösung für eine Zeitschleife


von Dominik F. (dominik1202)


Lesenswert?

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

von BT (Gast)


Lesenswert?

für welchen controller?
für einen AVR könnte ich mal meinen Codewizard im Workpad bemühen ;-)

von BT (Gast)


Lesenswert?

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

von Ronny (Gast)


Lesenswert?

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