Forum: Mikrocontroller und Digitale Elektronik Weckzeit bei ATmega einstellen, seltsamer Fehler !


von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

Hallo

Die angefügte Datei soll nur dazu dienen per Tastendruck die Weckzeit 
einer
Uhr zu stellen.

Hier ein paar Rahmenbedingungen:

Tasterport 7 6 5 4 3 2 1 0
                     1 1   --> z.B. Tasten 2 und 3 wurden gedrückt

Die zu letzt gedrückten Tasten sind in "temp4" gespeichert

Die Subroutine wird nur ausgeführt, wenn die Weckzeit auch ausgegeben 
wird!
Das wird durch Bit 6 in "ind_flag" angezeigt.


Jetzt zum Eigentlichen:

wenn also die Weckzeitausgegeben wird,
soll über Taster 2 eine Auswahl getroffen werden können,
was an der Weckzeit verändert werden soll (momentan entweder
Minuten oder Stunden)

1.Mal Drücken Taste 2  -->Wert 4
2.Mal Drücken Taste 2  -->Wert 2


Wenn man dann Taster 3 betätigt wird die jeweilige Größe (Minuten oder 
Stunden) inkrementiert

Vorherige Auswahl von Taster 2 mit Taster 3 verknüpfen:

also entweder Wert 4 + 1
oder Wert 2 + 1

Diese beiden Werte dienen nun als Entscheidungshilfe für den 
auszuführenden Programmteil


das klappt soweit auch,


???--> allerdings wird, wenn ich jetzt Taster 2 ein drittes und viertes 
Mal drücke nicht auf die erste Stellgröße (Minuten einstellen) 
zurückgesprungen, sondern erst beim fünften Mal.

Wodran mag das liegen?

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

Der Code war noch etwas durch Tabs gestört.
also hier nochmal übersichtlicher.

von spess53 (Gast)


Lesenswert?

Hi

>alert_select:
>           lsr   r16
>           dec   r16

>           brne  alert_select_01
>           ldi   r16, 2                 <- r16 = 2
>           lsl   r16                    <- r16 = 4
>           sts   dt_alert_select, r16
>alert_select_01:
>           lsl   r16                    <- r16 = 8
>           sts   dt_alert_select, r16
....
>           add   r17, r16


Bist du sicher, das das so gedacht ist?

MfG Spess

von Peter D. (peda)


Lesenswert?

Du solltest Dein Programm einfach halten. Gerade in Assembler sind 
Tricksereien undurchschaubar und Du stellst Dir nur selber ein Bein.

Laß diese Schiebeorgien sein. Ich seh da jedenfalls nicht durch.

Ein Zustandszähler zählt immer von 0 ... n-1 und bei n setzt Du ihn 
wieder auf 0.
Bei n = 2, 4, 8 ... kannst Du auch maskieren:
if( taste gedrückt )  state = (state + 1) and 1


Peter

von Olli R. (downunderthunder42)


Lesenswert?

spess53 schrieb:
> Bist du sicher, das das so gedacht ist?

Oh Mann ja klar das ist natürlich nicht so gemeint.
Manchmal sieht man den Wald vor lauter Bäumen nicht.
Es war aber auch schon ziemlich spät. ;)
Deswegen hat ich dann auch als ich für r16 einfach mal weitaus höhere 
Werte
verwendet habe, eine Bereichsverletztung!

Peter Dannegger schrieb:
> Ein Zustandszähler zählt immer von 0 ... n-1 und bei n setzt Du ihn
> wieder auf 0.
> Bei n = 2, 4, 8 ... kannst Du auch maskieren:
> if( taste gedrückt )  state = (state + 1) and 1

Ok das ist aber doch eher etwas für ein C-Programm?

Dieses "if taste gedrückt" wollte ich ja mit dem aktuellen Zustand + dem 
Wert für die Taste(2, 4 oder 6 z.B. + Taste gedrückt also 1, Taste 2 hat 
natürlich den Wert 4 deswegen 2mal shift right)

Wie "inetwa" könnte eine alternative Methode aussehen?

zum Zustandszähler:

ich hatte gedacht, dass es eher von Vorteil ist ihn zu dekrementieren, 
da ich dann keine dezidierte "cp/cpi"-Anweisung benötige?

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.