mikrocontroller.net

Forum: Compiler & IDEs Warteschleife in Assembler


Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Marcel Meyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: chrissy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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=...

Autor: Jürgen Schuhmacher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: egal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist: gcc-Forum (hier)
besser: µC/Elektronik-Forum (nicht hier)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.