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
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.
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 ...
> 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.
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
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.
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
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.
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.
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
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!
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 ;-).