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


von -sub- (Gast)


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?
1
;**********************************************************
2
.include "m8def.inc"    ; Definitionen für M8
3
  rjmp RESET     ; Reset Handle
4
;**********************************************************
5
6
RESET:
7
8
.def temp  = r16        ; temp als Universalregister definieren
9
.def temp1 = r17      ; temp als Universalregister definieren
10
.def temp2 = r18      ; temp als Universalregister definieren
11
.def temp3 = r19      ; temp als Universalregister definieren
12
.def temp4 = r20      ; temp als Universalregister definieren
13
.def temp5 = r21      ; temp als Universalregister definieren
14
15
  ldi temp,low(RAMEND)  ; Stackpointer initialisieren
16
  out SPL,temp
17
18
anf:
19
  ldi temp,0b11110011  ; 2 Eingang 6 Ausgänge 
20
  out DDRD,temp    ; Datenrichtungsregister für Port D
21
  
22
an:
23
  
24
  in temp2,PIND    ; PortD einlesen
25
  ldi temp3,4      ; Eingang nach temp laden
26
  cp temp2,temp3      ; beide gleich ?
27
  brne an           ; nein!
28
29
  ldi temp,0b11000000
30
  out PORTD,temp
31
32
aus:
33
  
34
  in temp4,PIND    ; PortD einlesen
35
  ldi temp5,8      ; Eingang nach temp laden
36
  cp temp4,temp5      ; beide gleich ?
37
  brne aus      ; nein!
38
39
  ldi temp,0b00000000
40
  out PORTD,temp
41
42
ende:    rjmp an

Die Register sind nur zum spielen ...

Vielen Dank für eure Hilfe

Grüße

von Stefan W. (wswbln)


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)

von Jochen S. (schiffner)


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

von Spess53 (Gast)


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

von -sub- (Gast)


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

von -sub- (Gast)


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

von Spess53 (Gast)


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

von Björn W. (bwieck)


Lesenswert?

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

Wo ist SPH ?

Grüße
Björn

von -sub- (Gast)


Lesenswert?

Hallo,

@Spess53

Vielen Dank jetzt habe ich es verstanden

Grüße

-sub-

von -sub- (Gast)


Lesenswert?

@Björn

SPH ist noch in Arbeit .. :D

ne habe ich einfach vergessen

Grüße

von Spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von -sub- (Gast)


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

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.