Forum: Mikrocontroller und Digitale Elektronik Anfängerproblem: Blinkende LED und Taster


von Andreas N. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Thomas (Gast)


Lesenswert?

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

von Pfi (Gast)


Lesenswert?

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

von Conlost (Gast)


Lesenswert?

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

von Frank Linde (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

"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

von Chris (Gast)


Lesenswert?

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ß

von Frank Linde (Gast)


Lesenswert?

???

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

von Conlost (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

"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

von Conlost (Gast)


Lesenswert?

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

von Andreas N. (Gast)


Lesenswert?

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

von Frank Linde (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.