Software Lösung für eine Zeitschleife

OP #443449
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
Gast #443570
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
Gast #443637
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.

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.