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.
Danke für die schnelle Antwort, aber irgendwie gehts immer nochnicht.. Ich habe alle relevanten brne ausgetauscht... Ich rufe jetz, so wie es eigentlich von anfang an geplant war ein Wait-Programm auf, aber sobald ich dieses aufrufe funktioniert nichts mehr... Ich kopier jetzt einfach mal den ganzen Quelltext hier rein, hoffe ihr könnt mir helfen! DANKE! // Gaggenau Gefrierschranksteuerung V1.0 .include "m8def.inc" //Definitionsdatei für den Prozessortyp einbinden LDI r16,LOW(RAMEND) //Initialisierung Stackpointer OUT SPL,r16 //Ist notwendig um Unterprogramme nutzen zu können!! LDI r16,HIGH(RAMEND) OUT SPH,r16 ldi r16, 0 out DDRD, r16 // Port D als Eingang initialisieren ldi r16, 0xFF out DDRC, r16 // Port B als Ausgang initialisieren ldi r16, 3 out PORTD, r16 // interne Pullup-Wiederstände aktivieren mainloop: cbi PORTC, 0 cbi PORTC, 1 cbi PORTC, 2 sbis PIND,5 // skip if Bit cleared rcall Wasser sbis PIND,4 rcall Eis sbis PIND,3 rcall Crushed //sbic PIND, 2 //rcall Rotate sbis PIND, 1 rjmp Lock // kann nur mit wait funktionieren... genauso wie licht und Rotate //sbic PIND, 0 //rcall Light rjmp mainloop lockloop: sbis PIND, 1 // rcall wait1 sbis PIND, 1 brne Unlock brne lockloop //---------------------Lock-------------------/ Lock: // rcall wait1 sbis PIND, 1 sbi PORTC, 4 sbis PIND, 1 brne lockloop brne mainloop //---------------------Unlock-------------------/ Unlock: cbi PORTC, 4 brne mainloop // Unterprogramm Wasser -------------------------------------------------------------- Wasser: ldi R19,1 // Bit 0 von R19 bedeutet Licht ein! sbis PIND,5 // rcall Wait sbis PIND,5 rcall Wait //<----------- Sobalad irgendein Wait drin ist geht nichts mehr... sbic PIND,5 ret wasserloop: // rcall Wait sbis PIND,5 sbi PORTC,0 sbis PIND,5 rjmp wasserloop ldi R19,0 ret // Unterprogramm Eis -------------------------------------------------------------- Eis: ldi R19,1 // Bit 0 von R19 bedeutet Licht ein! // rcall Wait // rcall Wait sbic PIND,4 ret Eisloop: // rcall Wait sbis PIND,4 sbi PORTC,1 sbis PIND,4 rjmp Eisloop ldi R19,0 ret // Unterprogramm Crushed -------------------------------------------------------------- Crushed: ldi R19,1 // Bit 0 von R19 bedeutet Licht ein! // rcall wait // rcall wait sbic PIND,3 ret crushedloop: // rcall wait sbis PIND,3 sbi PORTC,2 sbis PIND,3 brne crushedloop ldi R19,0 ldi R19, 0 ret // Unterprogramm Rotate -------------------------------------------------------------- Rotate: // rcall wait1 // rcall wait1 sbic PIND,2 ret sbi PORTC,3 ret // Unterprogramm Wait -------------------------------------------------------------------- Wait: ; ============================= ; Warteschleifen-Generator ; 2000000 Zyklen: ; ----------------------------- ; warte 1999998 Zyklen: ldi R23, $12 WGLOOP0: ldi R24, $BC WGLOOP1: ldi R25, $C4 WGLOOP2: dec R25 rjmp WGLOOP2 dec R24 rjmp WGLOOP1 dec R23 rjmp WGLOOP0 ; ----------------------------- ; warte 2 Zyklen: nop nop ; ============================= ret
Matthias schrieb: > Ich habe alle relevanten brne ausgetauscht... Der Unterschied zwischen brne und rjmp ist dir klar?
Debuggen ... beginnt mit dem Simulator des AVR Studios. Da kann man jeden Befehl einzeln ausfuehren. Nennt sich Single-Step
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.