Forum: Mikrocontroller und Digitale Elektronik 7 Segment Anzeige: Counter in Schleife/ Variabel oder Arrey zusammenfassen


von Sebastian (Gast)


Lesenswert?

Guten Abend liebe Community

Ich habe grade erfolgreich einen einfachen Counter auf einer 7 Segment 
Anzeige programmiert.

#include <avr/io.h>
#include <util/delay.h>

int main(void)

 {
    DDRD = 0xFF;

while(1) {

  PORTD = 0b00000001;

  _delay_ms(2500);

  PORTD = 0b00000010;

  _delay_ms(2000);

  PORTD = 0b00000011;

  _delay_ms(2000);

  PORTD = 0b00001000;

  _delay_ms(2000);

  PORTD = 0b00001001;

  _delay_ms(2000);

  PORTD = 0b00001010;

  _delay_ms(2000);

  PORTD = 0b00001011;

  _delay_ms(2000);

  PORTD = 0b00000100;

  _delay_ms(2000);

  PORTD = 0b00000101;

  _delay_ms(2000);
   }

return 0;

}

Das Programm ist ziemlich lang und ich möchte es jetzt gerne mithilfe 
von einer Schleife einer Variabel oder eines Arrays zusammenfassen.

Ich danke schonmal im Voraus!

von Karl H. (kbuchegg)


Lesenswert?

?
1
int main(void)
2
{
3
  uint8_t Counter = 0,
4
5
  DDRD = 0xFF;
6
7
  while(1) {
8
    PORTD = Counter;
9
    _delay_ms(2500);
10
11
    Counter++;
12
    if( Counter == 10 )
13
      Counter = 0;
14
  }
15
}

von Karl H. (kbuchegg)


Lesenswert?

Ach du Schande. Jetzt seh ichs erst.

Was hast du denn da gemacht?
1
PORTD = 0b00000001;
2
_delay_ms(2500);
3
PORTD = 0b00000010;
4
_delay_ms(2000);
5
PORTD = 0b00000011;
6
_delay_ms(2000);
7
PORTD = 0b00001000;

Warum hast du denn die Datenleitungen nicht vernünftig zu deinem Dekoder 
gezogen sondern die Bits 2 und 3 vertauscht?
Das war keine gute Idee! Damit verschenkst du dir die Möglichkeit, 
einstellige Zahlen einfach auf den Port ausgeben zu können.

Dann muss das jetzt eben ein bischen anders gemacht werden
1
uint8_t digits[] = { 0b00000000,
2
                     0b00000001,
3
                     0b00000010,
4
                     0b00000011,
5
                     0b00001000,
6
                     0b00001001,
7
                     0b00001010,
8
                     0b00001011,
9
                     0b00000100,
10
                     0b00000101,
11
                   };
12
13
14
int main(void)
15
{
16
  uint8_t Counter = 0,
17
18
  DDRD = 0xFF;
19
20
  while(1) {
21
    PORTD = digits[ Counter ];
22
    _delay_ms(2500);
23
24
    Counter++;
25
    if( Counter == 10 )
26
      Counter = 0;
27
  }
28
}

Dieses Umkodieren hättest du dir sparen können, wenn du dafür gesorgt 
hättest, das alle Ziffern bit-richtig an den Dekoder angelegt werden. 
Dann hätte das Bitmuster einer einstelligen Dezimalzahl schon gepasst. 
So hast du diese Chance vertan und im Grunde muss man sagen: ausser das 
du nur 4 Leitungen anstelle von 8 benötigst, hast du keinen Vorteil mehr 
vom Dekoder. Das Umsetzen der Ziffer in ein Muster, welche von 8 LED 
leuchten sollen (eben genau das, was der Dekoder macht), hättest du 
genausogut auch mit diesem Array machen können und dir den ganzen 
Dekoder sparen können. Dann könntest du zb selbst entscheiden, wie eine 
'6' oder eine '9' dargestellt wird, könntest auch Hex-Ziffern hinmalen, 
bzw. könntest überhaupt jedes beliebige Muster auf der 7-Segmentanzeige 
darstellen. Wie machst du denn bei einer mehrstelligen Anzeige zb die 
Ausgabe von negativen Zahlen? Dazu brauchst du ein '-', das du aber vom 
Dekoder nicht kriegst.

: Bearbeitet durch User
von oldmax (Gast)


Lesenswert?

Hi
Nun, bei einem Controller ist ein Decoder nicht unbedingt erforderlich. 
Den Zähler incrementierst du in einer Schleife oder noch besser im 
Timer-Interrupt. Dazu gibt es zig Beispiele. Im Programm hinterlegst du 
dir ein Array mit dem Code der 7 Segmentanzeige, also 0 bis 9 Bitmuster. 
Um die Anzeige anzusteuern, setzt du einen Pointer auf die Adresse mit 
dem Code für die 0 und addierst den Zähler hinzu. Dieses Wert gibst du 
am Port aus. Fertig.
Übrigends, gewöhn dir an, beim Zählen immer mit 0 anzufangen. Der 
Zahlenbereich ist nicht von 1 nach 10, sondern von 0 nach 9. Die 10 hat 
bereits schon einen Übertrag zur nächsten Stelle.
Aus dem Grund haben wir auch nur 9 Finger :)
Wenn ich C könnte, würd ich dir auch ein wenig Code liefern, aber es ist 
für dich eine gute Übung mit einer Code-Tabelle und einer Variablen zu 
arbeiten.
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.