Forum: Mikrocontroller und Digitale Elektronik Segment anzeige Anfänger frage


von Christoph R. (derbro)


Lesenswert?

Moin, ich möchte an einem arduino mega mit 10 gemultiplexen 7 segment 
anzeigen eine variable ausgeben weiss nur leider nicht wie ich die 
ausgeben soll. Als Beispiel
Die variable die ich auf den segment anzeigen ausgeben will→

Int BeispielvariablePin = 0;
Long Punkte = 0;
Bei einen eingangssignal so hab ich das gemacht →
If (DigitalRead(beispielvariablePin) == HIGH)
{
Punkte = Punkte + 35000
}

Kann mir jemand erklären wie ich die variable Punkte auf die segment 
anzeige drauf bekomme. Vielleicht auch nen kleinen beispiel code wäre 
nett :). Zahlenvariablen also von 0-9 für die segment anzrige hab ich 
schon.


Gruß Christoph

von Karl H. (kbuchegg)


Lesenswert?

Christoph Rohloff schrieb:
> Moin, ich möchte an einem arduino mega mit 10 gemultiplexen 7 segment
> anzeigen eine variable ausgeben weiss nur leider nicht wie ich die
> ausgeben soll.

Die wichtigste Erkentnis ist, dass du die Anzeige der 7-Segment-Anzeigen 
und dessen, was da dargestellt wird voneinander trennen musst.

Die 7-Segment Anzeigen werden mit einem Timer gemultiplext und greifen 
dabei auf 10-Stück uint8_t Variablen zu, die der Multiplex-Routine 
mitteilen, welche konkreten LED an welcher Anzeige zu leuchten haben und 
welche nicht.

Damit ist dann schon mal der Teil erledigt: wie kommt die physikalische 
Anzeige zu stande. Das Leuchtmuster der LED ist in diese 10 Stück 
uint8_t Variablen zu schreiben (die man innigerweise wahrscheinlich als 
Array auslegen wird).

Dann braucht man noch eine Funktion, die genau diese Leuchtmuster für 
eine konkrete Zahl bestimmt, was ja eigentlich recht einfach ist, dann 
für eine bestimmte Ziffer ist ja das auszugebende Muster immer dasselbe. 
Es muss nur ja nach auszugebender Stelle in eine andere der 10 uint8_t 
Mustervariablen geschrieben werden.

Mit dieser Funktion ist dann auch das Ausgeben einer Variablen nicht 
mehr schwer: einfach aufrufen, die Funktion bestimmt die LED-Muster für 
jede Stelle und die ständig laufende Timer-Interrupt Funktion schaufelt 
die dann auf die physikalischen 7_Segment Anzeigen.

> anzeige drauf bekomme. Vielleicht auch nen kleinen beispiel code wäre
> nett :). Zahlenvariablen also von 0-9 für die segment anzrige hab ich
> schon.

Aber wahrscheinlich gibst du die direkt aus. So kommst du aber nicht 
weiter. Der WEg führt über einen Timer, eine Interrupt-Funktion und 
einem Satz von globalen Variablen, in denen die Leuchtmuster der LED 
jeder einzelnen der 10 7_Segment Anzeigen stehen.

Ergo: lass die Zahlen mal Zahlen sein, leg sie beiseite und beschäftige 
dich damit wie Timer funktionieren, wie du eine ISR hinkriegst und wie 
du in
1
volatile uint8_t digits7[10];
2
uint8_t digitCnt;
3
4
ISR( ... )
5
{
6
  // die Stelle die gerade leuchtet abschalten
7
  //
8
9
  // welches ist die nächste Stelle
10
  digitCnt++;
11
  if( digitCnt == 10 )
12
    digitCnt = 0;
13
14
  // und digits7[digitCnt] an die 7_Segment Stelle digitCnt ausgeben
15
}
das reihum-weise Ausgeben der Leuchtmuster aus digits7 hinkriegst.

Das ist dein erster Meilenstein.
Ob in den digits7 dann die entsprechenden Muster für Ziffern stehen, 
oder ob da Muster für irgendwelche 'Graphiken' drinnen sind, 
interessiert die Multiplexroutine nicht. Die schaufelt die einfach nur 
an die Anzeigen raus.

: Bearbeitet durch User
von Christoph R. (derbro)


Lesenswert?

Danke dir für die schnelle antwort... bin dadurch schon mal schlauer 
geworden :). Dann werd ich die Sache gleich mal angehen

von MaWin (Gast)


Lesenswert?

> Kann mir jemand erklären wie ich die variable Punkte auf die segment
> anzeige drauf bekomme

Karl-Heiz hat ja schon erwähnt: Mit einer Timer-Interrupt-Routine,
die z.B. jede Millisekunde ausgeführt wird

Angenommen die Segmente hängen an Port B (Segment A=PB0 und leuchtet 
wenn PB0 ein HIGH ist) und die Stellen an Port C (PC0..PC3 bcd codiert)

Scheint ja mal wieder um Arduino zu gehen
1
int stelle;
2
BYTE ziffer[10];
3
BYTE segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7D,0x07,0x7F,0x6F};
4
void blink() 
5
{
6
   PORTB=0;
7
   PORTC=stelle;
8
   PORTB=segment[ziffer[stelle]];
9
   stelle=(stelle+1)%10;
10
}
11
void setup()   
12
{
13
   DDRB=0xFF; // alles Ausgänge
14
   DDRC=0x0F; // einige Ausgänge
15
   Timer1.attachInterrupt(blink);
16
   Timer1.initialize(1000);
17
}
18
void zahlinziffern(long zahl)
19
{
20
  int i;
21
  for(i=0;i<10;i++) 
22
  {
23
    ziffer[i]=zahl%10;
24
    zahl/=10;
25
  }
26
}
27
void loop()
28
{
29
  .. irgendwas was deine Punke ändert
30
  Punkte = Punkte + 35000
31
  zahlinziffern(Punkte);
32
}

Wenn ich so was hingegen lese, wird mir schlecht:
http://www.macherzin.net/article25-Arduino-7-Segment-Anzeige

: Bearbeitet durch User
von Christoph R. (derbro)


Lesenswert?

Dankeschön MaVin. Das hilft mir gut weiter :)

von Stephan (Gast)


Lesenswert?

MaWin schrieb:
> Wenn ich so was hingegen lese, wird mir schlecht:

Na da warten wir doch mal auf das Servicepack 2.
Timer werden doch erst in 5 Jahren erfunden.

von Martin V. (oldmax)


Lesenswert?

Hi
Vielleicht solltest du dir mal den Post "15x7 Segmentanzeige mit 
durchlesen". Sollte dir auch nützlich sein.
Gruß oldmax

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.