www.mikrocontroller.net

Forum: Compiler & IDEs Drehgeber und LED-Multiplexanzeige


Autor: Sven (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Neffets (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

volatile uint8_t num[11]= {192, 249, 164, 176, 153, 146, 130, 248, 128,
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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

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

0..10 ;-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, is schon spät :-0

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.