Warteschleife in Assembler

Gast #75734
Hallo,
Ich bin noch ungeübt mit Assembler und habe eine Frage, wie kann ich
das Programm dazu bringen eine halbe Sekunde zu warten?


.NOLIST
.INCLUDE "8535def.inc"
.LIST

.DEF temp = R16

  RJMP anfang

anfang:
  LDI temp, 0xFF
  OUT DDRA, temp
  OUT DDRB, temp
  OUT DDRC, temp
  LDI temp, 0x00
  OUT DDRD, temp
  LDI temp, 0x0F
  OUT PORTB, temp
  LDI temp, 0xF8
  OUT PORTC, temp
  NOP
  NOP
  RCALL warten
  RCALL warten
  LDI temp, 0x00
  OUT PORTB, temp
  NOP
  NOP
  RCALL warten
  LDI temp, 0x10
  OUT PORTB, temp
  NOP
  NOP
  RCALL warten
  LDI temp, 0x00
  OUT PORTB, temp
  NOP
  NOP
  RCALL warten
  LDI temp, 0x10
  OUT PORTB, temp
  NOP
  NOP
  RCALL warten

warten:
  RET

Ich weiß nicht wie ich es anstellen soll, wer kann mir das Codestück
für die warten Funktion schreiben?
Ich danke jetzt schon.
Gruß, Lars
Gast #75736
Also entweder, wie gesagt, per Timer. d.h. Vorteiler und Zählschritte
mit der Taktfrequenz so hintüddeln, daß er die Gewünschte Zeit läuft.

Oder mit einrr verschachtelten Schleife. Das erfordert bißchen Rechnen,
denn du musst dir überlegen, wie viele Takte die Schleifen jeweils
brauchen incl. Zählstand verändern, vergleichen und springen.

Habe auch mal für dich gegoogelt und einige Anfänger-Hilfen
rausgesucht. Irgendwie sieht der zweite Link aber komisch aus....

http://www.avr-asm-tutorial.net/avr_de/
http://www.elektronik-projekt.de/include.php?path=content/articles.php&contentid=75&PHPKITSID=ae47b49717e954b4c35feeb077787095
Gast #75737
Falls Du tatsächlich noch nicht so firm bist, ein kleiner Einwand von
mir:

"... mit einrr verschachtelten Schleife. Das erfordert bißchen
Rechnen, denn du musst dir überlegen, wie viele Takte die Schleifen
jeweils brauchen incl. Zählstand verändern, vergleichen und
springen."

DIES KLAPPT ALLES NUR BEI LINEAREN PRGRAMMEN! - also ohne multi
threadinung und speziell das ausloten des Zählers haut nur hin, wenn Du
die Interrupte überwachst und mitzählst (oder keine hast!!).

Korrekt läuft sowas immer über einen Hardwarezähler (oder ein in Form
eines zuverlässigen Interrupts als solcher agierender Softwarezähler),
der am Ende einer Bedarfsroutine auf einen defnierten Stand gebracht
wird, der exakt der gwünschten Wartezeit abzüglich der aktuell
benötigten Durchlaufzeit der zurückgelegten Routine entspricht.
Letztere ist nämlich empirisch messbar und im Falle einer eindeutigen
Interrupthierachie auch deterministisch festlegbar (also rechenbar).
Der Timer hat dann also immer einen idealen Wert, den er runter zählt.
Nun muss nur auf Null geprüft werden oder noch besser, der Timer löst
einen Interrupt aus. Der Trick dabei ist der, daß diese Vorkompensation
jegliche Laufzeit des Programmes eliminiert.

Ideal ist natürlich ein programmierbarer Interrupt: Man sollte immer
zusehen, daß man soetwas wenigstens einmal im Prozzi hat, und vor doert
aus sich eine Systemzeit ableitet. Alle anderen Funktionen können dann
in Software realisiert werden, also z.B. die aktuelle Systemzeit
merken, die Zeitdauer dazuaddieren, in einer Endvariablen speichern und
in der gewünschten Zielroutine einfach diese Endvariable auf Erreichen
des Timerwertes prüfen.

Ich habe mal vor Jahren ein komplettes Echtzeitsystem auf die Art
geschrieben: Alles reines Software, es gab nur einen externen Timer.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.