www.mikrocontroller.net

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


Autor: Andreas N. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Pfi (Gast)
Datum:

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

Autor: Conlost (Gast)
Datum:

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

Autor: Frank Linde (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Frank Linde (Gast)
Datum:

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

Autor: Conlost (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Conlost (Gast)
Datum:

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

Autor: Andreas N. (Gast)
Datum:

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

Autor: Frank Linde (Gast)
Datum:

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

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.