Segment anzeige Anfänger frage

OP #3365137
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
#3365154
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.
Gast #3365182
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren