Hallo Leute, danke fürs Lesen. Ich bin hartnäckig und gebe es nicht auf mit Assembler mich zu beschäftigen. Nun wieder etwas neues aufgetreten. Nach Drücken einer Taste soll eine LED BLINKEN. Im Simulator geht es auch. Aber auf dem Board nicht. Hardwarefehler sind keine vorhanden. Wo ist hier das Problem?? Oder gibt es eine wesentlich elegantere, einfachere Lösung für das Problem? Vielen Dank, Andreas N.
Mahlzeit, bin mir nicht ganz sicher, aber ich denke hier unten ist ein Fehler: ldi ZH,HIGH(65535) ;High-Byte des "16bit-Zählers" mit 65535 laden (Z-Register) ldi ZH,LOW(65535) ;dito low-byte ret das letzte sollte wohl eher ldi ZL, LOW..... heißen. Außerdem wird die Pause wohl nicht ganz ausreichen um es blinken zu sehen. Gruß Thomas
Hallo! Ich denke auch, dass es zu schnell blinkt, denn wenn dein AVR mit 1Mhz läuft und du diesen Takt durch ca. 65000 teilst, dann bist du bei 15 Hz, da ist höchstens ein flimmern zu sehen, wenn überhaupt... grüsse
Hallo, nein es läuft nicht zu schnell, es läuft garnicht. Auch im Simulator läuft es nicht. Ich habe es gestern mal im Studio simuliert und festgestellt, das ZL runtergezählt wird. Aber ZH wird nicht bis auf Null runtergezählt. Irgendwo mittendrinn wird zum Programmstart gesprungen und der ZL und ZH wieder neu geladen. Weiß der Geier warum der das macht. Gruß, Arno
Ich bin zwar nicht der Geier, aber es liegt daran, dass der Stack überläuft, weil das Unterprogramm LED_2_blink: immer wieder mit BRNE verlassen wird und nicht mit RET. Gruß, Frank
"Weiß der Geier warum der das macht." Ich bin zwar kein Geier, aber Du callst zu "LED_2_blink" und springst dann zu main zurück. Klar, daß dann Dein Stack nicht anders kann und überlaufen muß. Alles, was Du über CALL erreichst, darfst Du auch nur über RET verlassen !!! Peter
Hallo, mögliche Fehlerquelle: Von den Befehlen wie cbi, sbi, sbis beginnen manche das MSB bei Null zu zählen, manche bei Eins. Es kann also sein, daß Du ungewollt das falsche Bit abfragst/setzt. Am besten in der Befehlsliste nochmal genau schauen. Zumindest ist mir ein solcher Fall letztens vorgekommen. Beispiel: Um das mit sbis r16, 1 abgefragte Bit zu löschen an anderer Stelle, mußte ich den Befehl cbi r16, 0 verwenden. Gruß
??? Alle vier Befehle cbi, sbi, sbis, sbic haben als Argument 0-7. Wo ist da der Unterschied in der Zählweise? Gruß, Frank Gruß, Frank
Hallo, es hat mir keine Ruhe gelassen, nun hab ich den Fehler gefunden, es war ein Stack-Überlauf. Es wurde in eine Subroutine gesprungen (LED_2_blink:) und dann fehlte der ret Befehl. Ich habe die Stelle mal mit XXXXXX markiert. Nach der Änderung läuft das Programm im Studio4. -------------------------------------------------------------------- ;LED 1 an Bit 1 des PortB, an Bit0 des Port B ein Taster ;LED 2 an Bit 3 des PortB, an Bit2 des Port B ein Taster ;drücken des Tasters 1 schaltet LED 1 ein ;drücken des Tasters 2 läßt LED 2 blinken ; .nolist ;verhindert auflisten .INCLUDE "2313def.inc" ;Include-Datei einbinden .LIST ;Listen wieder einschalten .def stack = r16 ;Name festlegen für r16 ;das war das Vorspiel, ist bei jedem Programm nötig .def exor = r20 .cseg ;legt fest, das hier das Codesegment beginnt .org 0x0000 ;Programmbeginn festlegen bei 0x0000 rjmp start ;.org ACIaddr ;reti start: ldi stack, RAMEND ;Stack initialisieren out SPL, stack ;superwichtig!! sonst funktioniert RCALL und RET nicht ldi r17, 0b00001010 ;lädt den Wert in Register 17 out DDRB, r17 ;Wert aus Register 17 in DataDirectionRegister Port B laden, macht Bit1+3 zu Ausgang ldi r17, 0b00000101 ;Wert laden out PORTB, r17 ;aktiviert Pull-Up-Widerstand an Bit 0 PortB ldi ZH,HIGH(65535) ;High-Byte des "16bit-Zählers" mit 65535 laden (Z-Register) ldi ZL,LOW(65535) ;dito low-byte ldi exor, 0b00001000 ;Maske für Exclusiv-Oder rjmp main ; ;************** Hauptprogramm ***************** ; main: sbic PINB, 0 ;überspringe nächsten Befehl, falls Taster1 gedrückt rcall LED_1_aus ;springe Unterprogramm an sbis PINB, 0 ;überspringe nächsten Befehl, falls Taster1 nicht gedrückt rcall LED_1_an ;springe Unterprogramm an sbic PINB, 2 ;überspringe nächsten Befehl, falls Taster 2 gedrückt rcall LED_2_aus ;springe Unterprogramm an sbis PINB, 2 ;Überspringe nächsten Befehl, falls Taster 2 nicht gedrückt rcall LED_2_blink ;springe Unterprogramm an rjmp main ;endlosschleife ; ; ;************* Unterprogramm LED_1_aus ************* ; LED_1_aus: cbi PORTB, 1 ;Lösche Bit 1 im PORT B ret ; ; ;************* Unterprogramm LED_1_an ************** ; LED_1_an: sbi PORTB, 1 ;Setze Bit 1 im PORT B ret ; ; ;************ Unterprogramm LED_2_aus ************** ; LED_2_aus: cbi PORTB, 3 ;Lösche Bit 3 des PORT B ret ; ; ;************ Unterprogramm LED_2_blink ************ ; LED_2_blink: sbiw ZL, 1 ;Subtrahiere 1 von 16bit Registerpaar (Zähler) brne weiter ;XXXXXXXXXX hier war der Fehler in r18, PINB ;aktueller Wert des Port B wird in Register r18 gelesen eor r18, exor ;maskieren, damit nur Bit 3 geändert wird out PORTB, r18 ;ausgeben an PORT B ldi ZH,HIGH(65535) ;High-Byte des "16bit-Zählers" mit 65535 laden (Z-Register) ldi ZL,LOW(65535) ;dito low-byte weiter: ret
"es hat mir keine Ruhe gelassen, nun hab ich den Fehler gefunden, es war ein Stack-Überlauf." Das haben Dir doch schon oben die zwei "nicht Geier" gesagt. Liest Du denn keine Antworten ? Peter
Aua, tut mir leid, grade diese Antworten hab ich nicht gelesen. Dann hätte ich mir die ganze Simuliererei sparen können. Kommt bestimmt nicht wieder vor. Aber so hab ich wenigstens wieder was gelernt. :-) Gruß, Arno
Vielen Dank für die Hilfe!! Da wäre ich nicht drauf gekommen. Jetzt aber, da ich mir die Unterlagen zum Stack nochmal durchgelesen habe ist es mir klar! Super dieses Forum, ich habe befürchtet, das ich irgend ein dummen Komentar oder so ernte... Andreas
Dumme Kommentare gibt es nur für faule oder dämliche Fragen. Bei Dir kann man sehen, dass Du Dich darum bemühst, etwas zu lernen und auch die Grundlagen einschließt. Da macht es Spaß zu helfen! Gruß, Frank
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.