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.
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
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.