Hallo Leute,
Kurze dringende Frage, sonst drehe ich durch ;-)
Mein Programm für meinen Gefrierschrankeiswürfelauswurf funktioniert bis
jetzt perfekt, bis auf diese eine Schleife:
Eis:
ldi R19,1 // Bit 0 von R19 bedeutet Licht ein!
// rcall Wait
// rcall Wait
sbic PIND,4
ret
Eisloop:
; =============================
; Warteschleifen-Generator
; 2000000 Zyklen:
; -----------------------------
; warte 1999998 Zyklen:
ldi R23, $12
WGLOOP0: ldi R24, $BC
WGLOOP1: ldi R25, $C4
WGLOOP2: dec R25
brne WGLOOP2
dec R24
brne WGLOOP1
dec R23
brne WGLOOP0
; -----------------------------
; warte 2 Zyklen:
nop
nop
; =============================
// sbis PIND,4
sbi PORTC,1
sbis PIND,4
brne Eisloop
ldi R19,0
ret
Ich verstehe einfach nicht, warum alles funktioniert, wenn die
Warteschleife nicht drin ist, dann bleibt er schön in der
Eisloop-Schleife.
sobalt ich die Warteschleife einbinde funktioniert es nicht mehr... er
läuft einfach wieder aus dem unterprogramm raus, obwohl mein Taster an
PIND gedrückt ist...
Kann mir das jemand erklären ?
DANKE schonmal im Vorraus!
Gruß Matthias
Matthias schrieb:> Ich verstehe einfach nicht, warum alles funktioniert, wenn die> Warteschleife nicht drin ist, dann bleibt er schön in der> Eisloop-Schleife.>> sobalt ich die Warteschleife einbinde funktioniert es nicht mehr... er> läuft einfach wieder aus dem unterprogramm raus, obwohl mein Taster an> PIND gedrückt ist...>> Kann mir das jemand erklären ?
Weil du ein brne benutzt hast, wo wohl eigentlich ein rjmp stehen
sollte.
Matthias schrieb:> Ich habe alle relevanten brne ausgetauscht...
Nein, hast du nicht. Du hast durch blindes Austauschen ohne
nachzudenken, was du willst und was der Befehl macht, eine erstklassige
Endlosschleife gebaut. Du gehst also zurück an den Anfang und denkst
ganz genau nach, welches brne du durch ein rjmp ersetzen willst, und
warum.
Hallo,
Also Danke nochmal!!
Daran lags ;-)
Ich dachte irgendwie, dass brne das gleiche bewirkt wie jmp, da es das
beim Atmega8 ja nicht gibt....
naja, jetz kenn ich mich aus ;-)
Dankeschön!
gruß Matthias
Matthias schrieb:> Ich dachte irgendwie, dass brne das gleiche bewirkt wie jmp, da es das>> beim Atmega8 ja nicht gibt....
Der Sprungbefehl bei den 'Kleinen' heisst RJMP, und den gibt es bei
allen.
herrmueller
schon klar, aber ich habe bisher nur mit nem Siemens Controller in der
FH gearbeitet, und der konnte mit jmp umgehen, soweit ich mich entsinnen
kann...
Matthias schrieb:> aber ich habe bisher nur mit nem Siemens Controller in der> FH gearbeitet, und der konnte mit jmp umgehen, soweit ich mich entsinnen> kann...
ja nee, is klar ;)
Oliver
Matthias schrieb:> schon klar, aber ich habe bisher nur mit nem Siemens Controller in der> FH gearbeitet, und der konnte mit jmp umgehen, soweit ich mich entsinnen> kann...
2 Dinge
a) jeder Prozessor, jede Prozessorfamilie ist auf Assemblerebene anders,
kann andere Befehle, hat andere Register, andere Möglichkeiten.
Hier haben wir Atmel, dort Siemens. Das sind 2 verschiedene Firmen.
Noch unterschiedlicher geht gar nicht.
(OK, ein µC aus einem Alienraumschiff wäre noch schlimmer)
b) Wenn du Assembler programmierst, haben für dich 2 Dokumente
Bibel-Charakter:
Das eine ist das Datenblatt
Das andere ist die Instruction-Set Beschreibung.
Ersteres gibts in PDF Form. Letzters gibt es auch in PDF Form, aber da
man sie so häufig braucht, ist sie auch im AVR-Studio in der Hilfe
integriert. Dort sind ALLE Befehle enthalten, die dein µC kennt. Wenn du
dich nicht durch die Hilfe bis zur Instruction Set Beschreibung
durchklicken willst, stell den Cursor auf irgendeinen anderen Befehl und
drück F1. Dann kommt die Hilfe für diesen Befehl hoch und in der linken
Index-Spalte der Hilfe sind alle Assembler-Befehle auswählbar.
Matthias schrieb:> Ich dachte irgendwie, dass brne das gleiche bewirkt wie jmp
Wie kommst du zu dieser Annahme? Meinst du nicht, dass es sinnvoll wäre,
sich mal den Befehlssatz des Prozessors zu Gemüte zu führen, den man
programmieren will? Einfach irgendwas zu schreiben klappt nämlich recht
selten.
Matthias schrieb:> schon klar, aber ich habe bisher nur mit nem Siemens Controller in der> FH gearbeitet, und der konnte mit jmp umgehen, soweit ich mich entsinnen> kann...
Dir ist klar, dass jede Prozessorarchitektur ihren eigenen Befehlssatz
hat, auch wenn sie sich durchaus ähneln?