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


von Benjamin S. (benjamin_s)


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:
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
}

von Peter D. (peda)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Benjamin S. (benjamin_s)


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?

von Peter D. (peda)


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

von Benjamin S. (benjamin_s)


Lesenswert?

Danke für den Rat! Ich werd mal das mit den Timern probieren.

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.