Forum: Mikrocontroller und Digitale Elektronik Wieso funktioniert mein Programm nicht? (Led ein-/aus -schalten)


von Leie Jonas (Gast)


Lesenswert?

Ich möchte eine Led mittels Taster ein bzw. ausschalten.
Diese Fehler sind zu beobachten: Die Led leuchtet nicht, auch nicht nach 
den Knopfdruck. An der Delay5ms Funktion liegt es nicht!
1
.equ XTAL = 16000000 ;16 mHz
2
3
.equ BTN  = 2 ;Pinnumber of PORT_D
4
.equ LED  = 3 ;Pinnumber of PORT_D
5
6
.def temp1 = r16
7
.def temp2 = r17
8
9
  ;Init stackpointer
10
  ldi temp1, HIGH(RAMEND)
11
  out SPH,   temp1
12
  ldi temp1, LOW(RAMEND)
13
  out SPL,   temp1
14
15
  ;Set led pin to output
16
  ldi temp1, (1 << LED)
17
  out DDRD, temp1
18
19
loop:
20
  in    temp1, PIND
21
  sbrc  temp1, (1 << BTN) ;Check if button is pressed
22
  rcall led_toggle
23
  rjmp  loop
24
25
led_toggle:
26
  ldi   temp2, (1 << LED)  
27
  eor   temp1, temp2 ;xor the led pin
28
  out   PORTD, temp1
29
  ldi   temp2, 0x64  ;Delay 5ms * 100
30
led_toggle_0:
31
  dec   temp2
32
  rcall delay5ms
33
  brcc  led_toggle_0
34
  ret
35
...

von Tipp (Gast)


Lesenswert?

Warum asm? Schreibs in C.

von Felix (Gast)


Lesenswert?

Kein Pullup? Im Programm wird der interne Pullup nicht genutzt.

Beitrag #5669605 wurde vom Autor gelöscht.
von M.K. B. (mkbit)


Lesenswert?

Es kann an der falschen Beschaltung oder Programmierung des Tasters oder 
der LED liegen. Versuch doch erstmal, ob die LED ohne Taster direkt 
leuchten kann.

von S. Landolt (Gast)


Lesenswert?

> An der Delay5ms Funktion liegt es nicht!

Ich würde trotzdem gerne sehen, dass in ihr tatsächlich SREG 
gesichert&wiederhergestellt wird.

von S. Landolt (Gast)


Lesenswert?

PS:
Die Befehlsreihenfolge nach §led_toggle_0 ist nämlich absolut unüblich; 
und ich vergaß: dec setzt ohnehin das Carry nicht.

von S. Landolt (Gast)


Lesenswert?

PPS:
>   sbrc  temp1, (1 << BTN) ;Check if button is pressed
ist auch falsch:
  sbrc  temp1, BTN ;Check if button is pressed

von Sascha W. (sascha-w)


Lesenswert?

S. Landolt schrieb:
> PS:
> Die Befehlsreihenfolge nach §led_toggle_0 ist nämlich absolut unüblich;
> und ich vergaß: dec setzt ohnehin das Carry nicht.
Und mit Sicherheit wird Delay5ms die Flags auch ändern

@ Leie Jonas
also wenn dann so ...
1
led_toggle_0:
2
  rcall delay5ms
3
  dec   temp2
4
  brne  led_toggle_0

Sascha

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Warum asm? Schreibs in C.
Warum nutzt Du C? Schreib doch alles in Assembler.
Oder noch besser: Bau es in Hardware!

Edit:

Schalte den Taster vom AVR-Pin nach GND und aktive den Pullup:
- Bit im DDR-Register auf Eingang
- Bit PORT-Register auf 1.

: Bearbeitet durch User
von Leie Jonas (Gast)


Lesenswert?

S. Landolt schrieb:
> PPS:
>>   sbrc  temp1, (1 << BTN) ;Check if button is pressed
> ist auch falsch:
>   sbrc  temp1, BTN ;Check if button is pressed

Habe dein Beitrag leider zu schnell überflogen.
Mir ist es erst hinterher beim mehrfachem Debuggen aufgefallen, dass man 
keine Bitmaske übergibt.
Trotzdem danke, dass war halt das einzige Problem.

Ben B. schrieb:
> Oder noch besser: Bau es in Hardware!

hahaha ich kann nicht mehr, immer diese Trolls

von Leie Jonas (Gast)


Lesenswert?

Nachtrag:
Auch wenn das Programm jetzt fehlerfrei ist, so richtig scheint das dann 
doch nicht zu funktionieren.
Etwa bei jedem 3 Drücken der Taste schaltet die Led viel zu schnell.
Ich habe es auch mit längeren Delays probiert aber, hilft nur teilweise.
Egal wie kurz ich auf den Taster drücke, es ändert nichts an dem 
Problem.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Kannst Du bitte das Programm nochmal posten wie Du es jetzt hast?

Ist der Fehler immer periodisch, also immer beim 3. mal aktivieren?

von Leie Jonas (Gast)


Lesenswert?

Ben B. schrieb:
> Kannst Du bitte das Programm nochmal posten wie Du es jetzt hast?
>
> Ist der Fehler immer periodisch, also immer beim 3. mal aktivieren?

Ja gerne.
https://pastebin.com/yJTW9LSx

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Zeile 32 und 33 vertauschen

: Bearbeitet durch User
von Heinz R. (Gast)


Lesenswert?

S. Landolt schrieb:
> An der Delay5ms Funktion liegt es nicht!

>>Ich würde trotzdem gerne sehen, dass in ihr tatsächlich SREG
gesichert&wiederhergestellt wird.

Denk auch darüber nochmal nach.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

In den meisten Funktionen macht es keinen Sinn, SREG zu sichern. Man 
führt eigentlich keine Funktionen zwischen Vergleich und Sprungbefehl 
oder wo immer man die Flags braucht aus.

Wo das aber zwingend erforderlich ist, sind Interruptfunktionen. Die 
können zu jeder Zeit aufgerufen werden ohne daß man weiß wo, also auch 
mitten in Vergleichen oder Rechen-/BitShift-Operationen mit Carry-Flag. 
Das führt dann zu sehr komischen Fehlern.

von Leie Jonas (Gast)


Lesenswert?

Ben B. schrieb:
> Zeile 32 und 33 vertauschen

Thats it
Die SREG abzusichern, darauf wäre ich nie gekommen.
Zum Glück bin ich diesem Fehler heute begegnet.

Heinz R. schrieb:
> S. Landolt schrieb:
>> An der Delay5ms Funktion liegt es nicht!
>
>>>Ich würde trotzdem gerne sehen, dass in ihr tatsächlich SREG
> gesichert&wiederhergestellt wird.
>
> Denk auch darüber nochmal nach.

Als ich SREG las, dachte ich mir erstmal nichts dabei, weil ich es für 
einen normalen GP-Register gehalten habe. Danke dass du mich darauf 
aufmerksam gemacht hast

Ben B. schrieb:
> Wo das aber zwingend erforderlich ist, sind Interruptfunktionen.

Werde ich mir merken

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

So schwer ist's aber nicht

push r16
in r16, SREG
push r16
[...]
pop r16
out SREG,r16
pop r16
ret oder reti

von Tipp (Gast)


Lesenswert?

Ben B. schrieb:
> Warum nutzt Du C? Schreib doch alles in Assembler.
> Oder noch besser: Bau es in Hardware!

Fährst du wie fred Feuerstein Auto? Die Erde dreht sich weiter, auch 
wenn du es nicht merkst!

von J. T. (chaoskind)


Lesenswert?

Tipp schrieb:
> Ben B. schrieb:
>> Warum nutzt Du C? Schreib doch alles in Assembler.
>> Oder noch besser: Bau es in Hardware!
>
> Fährst du wie fred Feuerstein Auto? Die Erde dreht sich weiter, auch
> wenn du es nicht merkst

Wer asm kann, kennt seinen Controller vernünftig ;-).

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.