mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Multiplex 7Segment, eine Anzeige flackert, andere leuchtet richtig


Autor: Benjamin S. (benjamin_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte gern zwei 7-Segment-Anzeigen per Multiplex ansteuern.
Dabei soll eine Anzeige eine Null ausgeben, während die andere von 0 bis 
9 hochzählt.
Das Problem ist aber nun, dass die eine Anzeige (die gibt null aus) 
während des weiterschalten immer stark flackert. D.h. es kommt keine 
konstant leuchtende Anzeige zum vorschein.

Die letzte While-Schleife scheint da das problem zu sein.

Vieleicht könnt ihr mir helfen?

Danke schon im voraus

Hier der C-Code:
//gemeinsame Anode

#include <avr/io.h>
#include <util/delay.h>    // definiert _delay_ms() 

void delay_ms(uint16_t);
void digit (uint8_t, uint8_t);
int main (void);

const int8_t numbers [10] =
{
//    1gfedcba
  0b11000000,    // 0
  0b11111001,    // 1
  0b10100100,    // 2
  0b10110000,    // 3
  0b10011001,    // 4
  0b10010010,    // 5
  0b10000010,    // 6
  0b11111000,    // 7
  0b10000000,    // 8
  0b10010000,    // 9
};

// wartet ms Millisekunden
void delay_ms (uint16_t ms)
{
  for(uint16_t t=0; t<=ms; t++)
  _delay_ms(1);
}

void digit (uint8_t wert, uint8_t pin)
{
  PORTC |= (1 << PC0) | (1 << PC1);          // 0..1 High = Digits aus
  PORTD = numbers[wert];                // Zahl ausgeben
  PORTC &= ~(1 << pin);                // Low = entsprechendes Digit an
  _delay_ms (5);                    // Multiplex-Zeit
}

int main()
{
  DDRD = 0xFF;                    // PortB alles als Ausgang
  DDRC |= (1 << DDC0) | (1 << DDC1);          // PortC 0..1 als Ausgang
  
  while (1)  // Endlos
  {
    digit (0, PC0);
    digit (0, PC1);
    _delay_ms(2000);
    
    digit (0, PC0);
    digit (1, PC1);
    _delay_ms(2000);
    
    digit (0, PC0);
    digit (2, PC1);
    _delay_ms(2000);

    digit (0, PC0);
    digit (3, PC1);
    _delay_ms(2000);
  }
  return 0;
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das eine Digit wird 5ms angezeigt, das andere 2005ms.
Logisch, daß das erste nur kurz flackert.

Mit Delay machst Du Dich nur selber verrückt (ist ernst zu nehmen).
Lerne erstmal Timerinterrupt, dann kannst Du nämlich richtig 
Multiplexen.


Peter

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei diesem Code kannst du nicht von "Flackern" sprechen, das dürfte eher 
ein "Aufblitzen" im 2-Sekunden-Takt sein...

Benjamin S. schrieb:
> Die letzte While-Schleife scheint da das problem zu sein.
Nein, dein Programmkozept ist das Problem.

Autor: Benjamin S. (benjamin_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aufblitzen beschreibt die Sache schon eher.
Ich wollt es erstmal mit dem _delay_ms lernen, bevor ich die 
Timerinterrupts angehe.

Was könnte man den noch optimieren oder alles über den Haufen werfen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benjamin S. schrieb:
> Ich wollt es erstmal mit dem _delay_ms lernen

Niemand verbietet Dir, den komplizierten Weg zu gehen.


Benjamin S. schrieb:
> oder alles über den Haufen werfen?

Das mußt Du eh. Also lieber sofort, bevor Du noch mehr Arbeit investiert 
hast.


Peter

Autor: Benjamin S. (benjamin_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Rat! Ich werd mal das mit den Timern probieren.

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.