www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik µC-Prog funktioniert nicht richtig


Autor: -sub- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich bin noch ein blutiger Anfänger was µC angeht und versuche gerade mit 
einem Taster 2 Leds anzuschalten und mit einem Taster sie wieder 
auszuschalten.
Das Einschalten funktioniert einwandfrei nur das Ausschalten nicht.
Kann mir jemand sagen was ich falsch gemacht habe?
;**********************************************************
.include "m8def.inc"    ; Definitionen für M8
  rjmp RESET     ; Reset Handle
;**********************************************************

RESET:

.def temp  = r16        ; temp als Universalregister definieren
.def temp1 = r17      ; temp als Universalregister definieren
.def temp2 = r18      ; temp als Universalregister definieren
.def temp3 = r19      ; temp als Universalregister definieren
.def temp4 = r20      ; temp als Universalregister definieren
.def temp5 = r21      ; temp als Universalregister definieren

  ldi temp,low(RAMEND)  ; Stackpointer initialisieren
  out SPL,temp

anf:
  ldi temp,0b11110011  ; 2 Eingang 6 Ausgänge 
  out DDRD,temp    ; Datenrichtungsregister für Port D
  
an:
  
  in temp2,PIND    ; PortD einlesen
  ldi temp3,4      ; Eingang nach temp laden
  cp temp2,temp3      ; beide gleich ?
  brne an           ; nein!

  ldi temp,0b11000000
  out PORTD,temp

aus:
  
  in temp4,PIND    ; PortD einlesen
  ldi temp5,8      ; Eingang nach temp laden
  cp temp4,temp5      ; beide gleich ?
  brne aus      ; nein!

  ldi temp,0b00000000
  out PORTD,temp

ende:    rjmp an

Die Register sind nur zum spielen ...

Vielen Dank für eure Hilfe

Grüße

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfen zur Selbsthilfe:

- was passiert, wenn die Taste "an" nicht gedrückt ist (Programmablauf)?
- wann gelangt der Prozessor in den Programmteil, wo die "aus"-Taste 
abgefragt wird?
- Stichwort "maskieren"

PS: mit Zeilennummern könnte man auch gleich noch leichter einen Hint 
auf das Fehlerchen posten (Z26/27+Z36/37, wenn ich mich nicht verzählt 
habe)

Autor: Jochen S. (schiffner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann sein das du beim Einlesen von PIND in aus: 0b11001000 bekommst, 
weil die LEDs an sind und du das mit 0b00001000 (->8) vergleichst. bin 
mir aber nicht sicher

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Deine 'aus'-Schleife wird nur einmal nach der 'an'-Schleife ausgeführt.

Bemerkungen:

- es gibt den Befehl 'cpi' -> cpi r16,4

- mit in xx,PIND liest du auch den Status der anderen Portleitungen ein.
  Um eine Abfrage zu machen musst du die Eingänge die dich interessieren
  maskieren:

        in r16,PIND
        andi r16,0b00001100
        cpi r16,4
        ...

- Woher kommt eigentlich dieses .def tmpxxx= rYY? Es macht weder das 
Programm
  übersichtlicher noch verhindert es ein versehentliches Überschreiben 
dieser
  Register. Wahrscheinlich diese C-Programmierer.

MfG Spess

Autor: -sub- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versteh zwar nicht genau was du mir sagen willst, aber ich 
beantworte einfach mal deine Punkte soweit ich kann:

Wenn die Taste an nicht gedrückt wird bleibt das Prog in der 
An-Schleife.
Wenn die Taste an gedrückt wurde gehen die LEDs an und das Prog hängt in 
der Aus-Schleife.
Wenn die Taste aus gedrückt wurde sollen die LEDs ausgehen und das Prog 
soll wieder in die An-Schleife gehen.

Wenn ich das Prog mit AVR-Studio simuliere funktioniert das auch so nur 
nicht in realitas

Mit Z27 und Z37 meinst du doch die brne Befehle.
mit cp vergleiche ich doch die beiden Register (subtraktion), wenn beide 
gleich sind wird Z-Flag=1 wenn nicht ist das Z-Flag=0. Wenn jetzt die 
Taste nicht gedrückt wird, dann ist auch Z=0 und ich spring mit brne 
zurück zu an bzw. aus, oder nicht ?

Also mit breq geht es gar nicht .


Grüße

Autor: -sub- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@ Spess53

die .def Zeilen habe ich aus dem I-Net geklaut woher die ursprünglich 
stammen kann ich dir leider nciht sagen

Grüße

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Streich mal meine erste Zeile(nach Hi)

Aber, wenn du auf PORTD 0b11000000 ausgegeben hast, wirst du mit 'in 
PIND' auch 0b1100xx00 einlesen. Wobei xx der Status deiner Tasten ist. 
Und das ist auf jeden Fall >8. Selbst bei nicht gedrückter Taste. 
Deshalb ist das 'andi ...' notwendig.

MfG Spess

Autor: Björn Wieck (bwieck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-sub- wrote:
> Hallo,
>
>   ldi temp,low(RAMEND)  ; Stackpointer initialisieren
>   out SPL,temp

Wo ist SPH ?

Grüße
Björn

Autor: -sub- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Spess53

Vielen Dank jetzt habe ich es verstanden

Grüße

-sub-

Autor: -sub- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Björn

SPH ist noch in Arbeit .. :D

ne habe ich einfach vergessen

Grüße

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

In dem Programm spielt SPH(und SPL keine Rolle). Sollte aber trotzdem 
zur Gewohnheit werden.

MfG Spess

Autor: -sub- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ja ich weiß das noch aus der µC-Vorlesung daß das wichtig sit mit SPH 
und SPL
habe das auch immer standartmäßig dabei nur diemal habe ich wohl SPH 
vergessen zu kopieren.

Grüße

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.