Hallo,
ich möchte mit einem Drehgeber einen Wert Inc- bzw. Dekrementieren und
den Wert auf eine 4 stellige gemultiplexte 7-Segment LED-Anzeige
ausgeben. Hier im Forum habe ich eine Routine zum Erfassen der
Drehimpulse gefunden welche bei mir 100% funktioniert.
Zur Programmierung habe ich mir folgendes gedacht: Der Drehgeber wird in
ja in einer Interuptroutine abgefragt, in diese Interuptroutine baue ich
auch das Multiplexen der LED-Anzeige ein, aber es funktionier nicht. Die
Hard- und Software für den Drehgeber ist ok, denn ich kann den Wert des
Drehgebers ohne Probleme auf ein LCD-Modul ausgeben. Das Multiplexen der
LED-Anzeige funktioniert auch bestens - aber eben nicht beides zusammen.
Wenn ich den Drehgeber betätige dann ändert sich ab und zu das letzte
digit, sonst passiert nichts.
Vielleicht ist jemand so nett mal einen Blick auf den Beispielcode zu
werfen. Meine Idee ist den Programmablauf über Interrupts zu steuern, da
ich auch noch vorhabe zusätzlich Taster abzufragen. Ich kenne mich auch
nicht so gut mit Interruptroutinen aus, oder mache ich da einfach einen
Denkfehler.
Vielen Dank
@ Sven (Gast)
>nicht so gut mit Interruptroutinen aus, oder mache ich da einfach einen>Denkfehler.
Der zugriff auf das SREG ist in C eine heikle Sache und sollte SEHR
sparsam um mit Bedacht erfolgen. Du machst es praktisch überall, ->
SCHLECHT.
Deine Formatierung ist nicht so gut, die Klammern für IF sind nicht
richtig.
Ich hab mal versucht das ein wenig zu korrigieren, siehe Anhang.
MFG
Falk
Welchen Controller benutzt du denn? Hat der vll. einen Pin Change
Interrupt. Ich habe genau das was du beschrieben hast per Statemachine
(im Pin Change Zustand des Drehgebers abfragen) und Timer
(Multiplexbetrieb) realisiert.
@ Falk
Vielen Dank für das durchsehen des Codes, sieh jetzt wirklich besser
aus. Besonders das aus der lcd_int routine ein dreizeiler geworden ist.
Ich weiss das mein Code immer etwas "Basic-lastig" aussieht, hat
historische Gründe.
Übrigens das Programm läuft jetzt einwandfrei, aber ich kann mir nicht
so recht erklären warum, es sei denn in bin ziemlich lange von falschen
Vorraussetzungen ausgegangen.
Ich habe den Arrayindex in den Zeilen um eins erhöht.
Vorher:
volatile uint8_t num[10]= {192, 249, 164, 176, 153, 146, 130, 248, 128,
144};
volatile uint8_t dig[3];
Nachher: (damit geht's)
volatile uint8_t num[11]= {192, 249, 164, 176, 153, 146, 130, 248, 128,
144};
volatile uint8_t dig[4];
Aber ist es denn nicht so, dass wenn man ein Array mit 10 Elementen
definiert man den Index auf 10 setzen muss, für die Elemente 0 bis 9 ?
Bei anderen Programmen habe ich das immer so gemacht und es ging.
@ Sven (Gast)
>Ich weiss das mein Code immer etwas "Basic-lastig" aussieht, hat>historische Gründe.
;-)
>Übrigens das Programm läuft jetzt einwandfrei, aber ich kann mir nicht
Schön zu hören.
>Vorher:>volatile uint8_t num[10]= {192, 249, 164, 176, 153, 146, 130, 248, 128,
Das muss nicht volatile sein. Siehe Interrupt.
>144};>volatile uint8_t dig[3];>Nachher: (damit geht's)>volatile uint8_t num[11]= {192, 249, 164, 176, 153, 146, 130, 248, 128,>144};>volatile uint8_t dig[4];>Aber ist es denn nicht so, dass wenn man ein Array mit 10 Elementen>definiert man den Index auf 10 setzen muss, für die Elemente 0 bis 9 ?
Vorsicht mit der For mulierung. Die DEFINITION eines Arrays ist
VERSCHIEDEN von der Nutzung/Zugriff auf das Array.
Definiert ein Array mit 11 Elementen. Diese können über den Index 0..9
adressiert werden.
>Bei anderen Programmen habe ich das immer so gemacht und es ging.
Geht bei C auch.
MFG
Falk