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

Gast #5669560
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.
(Firma: Funkenflug Industries)
> 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.
Gast
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
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
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)
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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.