Multiplex 7Segment, eine Anzeige flackert, andere leuchtet richtig

OP #2016593
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:
1
//gemeinsame Anode
2

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

6
void delay_ms(uint16_t);
7
void digit (uint8_t, uint8_t);
8
int main (void);
9

10
const int8_t numbers [10] =
11
{
12
//    1gfedcba
13
  0b11000000,    // 0
14
  0b11111001,    // 1
15
  0b10100100,    // 2
16
  0b10110000,    // 3
17
  0b10011001,    // 4
18
  0b10010010,    // 5
19
  0b10000010,    // 6
20
  0b11111000,    // 7
21
  0b10000000,    // 8
22
  0b10010000,    // 9
23
};
24

25
// wartet ms Millisekunden
26
void delay_ms (uint16_t ms)
27
{
28
  for(uint16_t t=0; t<=ms; t++)
29
  _delay_ms(1);
30
}
31

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

40
int main()
41
{
42
  DDRD = 0xFF;                    // PortB alles als Ausgang
43
  DDRC |= (1 << DDC0) | (1 << DDC1);          // PortC 0..1 als Ausgang
44
  
45
  while (1)  // Endlos
46
  {
47
    digit (0, PC0);
48
    digit (0, PC1);
49
    _delay_ms(2000);
50
    
51
    digit (0, PC0);
52
    digit (1, PC1);
53
    _delay_ms(2000);
54
    
55
    digit (0, PC0);
56
    digit (2, PC1);
57
    _delay_ms(2000);
58

59
    digit (0, PC0);
60
    digit (3, PC1);
61
    _delay_ms(2000);
62
  }
63
  return 0;
64
}
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.