Wieso funktioniert mein Programm nicht? (Led ein-/aus -schalten)

Gast #5669560
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
...
Beitrag #5669605 wurde von einem Moderator gelöscht.
Gast #5669752
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
Gast #5669755
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.
Gast #5669815
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.
(Firma: Funkenflug Industries) #5669881
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.
Gast #5669905
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren