Forum: Compiler & IDEs Drehgeber und LED-Multiplexanzeige


von Sven (Gast)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@ 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

von Neffets (Gast)


Lesenswert?

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.

von Sven (Gast)


Lesenswert?

@ 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.

von Falk B. (falk)


Lesenswert?

@ 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.

1
volatile uint8_t num[11]= {192, 249, 164, 176, 153, 146, 130, 248, 128,
2
144};

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

von Stefan E. (sternst)


Lesenswert?

Falk Brunner wrote:

>
1
> volatile uint8_t num[11]= {192, 249, 164, 176, 153, 146, 130, 248, 128,
2
> 144};
3
>
>
> Definiert ein Array mit 11 Elementen. Diese können über den Index 0..9
> adressiert werden.

0..10 ;-)

von Falk B. (falk)


Lesenswert?

Ja, is schon spät :-0

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.