Forum: Projekte & Code 16 Segment LED Display "Treiber"


von JuliaEllie (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe vor Kurzem begonnen Mikrocontroller zu programmieren (ATMega 
32-16PU) und hab die letzten Tage damit verbracht einen "Treiber" für 
KnightBright 16 Segment LED Anzeigen zu basteln. Mein Ansatz war alles 
möglichst einfach zu halten um eine große Flexibilität zu erreichen. 
Ausserdem habe ich einen Mikrocontroller das letzte Mal im Studium 
gesehen geschweige denn angefasst :D

Mein Programm erlaubt 3 verschiedene Verwendungen:

Man kann im Quellcode per say(char[]) einen oder mehrere strings 
festlegen die dann mit beliebiger Geschwindigkeit angezeigt werden.
Man kann aber auch den ATMega auf Port A (Active High - mit 10kOhm 
pull-down) mit so gut wie Allem was 5V gibt ansteuern. Zur Not auch mit 
ein paar Kabelresten zwischen VCC und den Pins.
Wenn man an Port A ein ASCII-Zeichen in Binär anlegt wird es auf der 
Segmentanzeige angezeigt. Im Moment allerdings nur A-Z und 0-9 sowie @ 
und * - allerdings kann man Groß- und Kleinbuchstaben anlegen sie werden 
aber beide als Großbuchstaben angezeigt. Das bringt schon mal die Anzahl 
der benötigten Pins von 16 auf 7 und man könnte mit einem anderen 
ATMega32 oder einem Arduino oder sonst etwas mehrere Displays steuern.
Möchte/kann man noch weniger Pins nutzen oder man mag eigene Zeichen 
nutzen können auch die Segmente einzeln angesteuert werden indem man PA7 
eine 1 anlegt und mit PA0-PA3 in Binär die Segmentnummer anlegt wobei 
Segment A 0000, Segment B 0001, usw darstellt.
Das sind dann 5 anstatt 16 Pins - wenn man auch noch auf das 
"Leerzeichen" verzichten kann und PA7 mit einem Jumper nach VCC 
überbrückt braucht man nur noch 4 Pins.

Ich habe den Quellcode übrigens so gehalten dass man die Ausgangspins zu 
den verschiedenen Segmenten des Displays leicht ändern kann falls man 
eine andere Pinbelegung möchte. In meinem Aufbau habe ich einfach Port B 
an die ersten 8 und Port D an die anderen 8 Pins des Displays gehängt. 
Zur allgemeinen Belustigung habe ich noch ein Foto meines Aufbaus und 
eine schematische Zeichnung der Schaltung angehängt.

Vielleicht ist das ja irgendwie für andere Anfänger nützlich - selbst 
wenn es nur als schlechtes Beispiel taugt :D

Fragen beantworte ich gerne. Ich habe versucht den Code zu kommentieren 
ich hoffe das hilft ein wenig. Konstruktive Kritik sehr willkommen.

von JuliaEllie (Gast)


Angehängte Dateien:

Lesenswert?

Hallöchen,

aus meinem Steckbrett Dings-Da wurde in den letzten Tagen eine Platine 
mit dem Steuerchip, der Anzeige, 8 Active High Eingängen und jeweils 
einer Buchse für VCC und GND.

Die Schaltung und die Software haben sich nur in der Pinbelegung 
geändert für eine bessere Führung der Leiterbahnen damit ich keine 
Kreuzungen habe.
Die Funktion ist noch wie im Originalpost beschrieben - eine Überlegung 
wert wäre auch noch einen Programmierheader unterzubringen damit man den 
Chip für die Programmierung der Anzeige nicht aus dem Sockel nehmen 
muss.

Gruß Julia

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nur ist eine einelne Anzeige noch etwas langweilig.
Jetz also noch Multiplexen für mehr Zeichen ;)

von timertick_t (Gast)


Lesenswert?

>Jetz also noch Multiplexen für mehr Zeichen ;)
Genau. Und dann eine Back-to-the-future Uhr nachbasteln. Am besten eine, 
die als Dreingabe auch die Lottozahlen vom nächsten Samstag anzeigen 
kann. Sollte jetzt nicht so schwierig sein...

von JuliaEllie (Gast)


Lesenswert?

Martin W. schrieb:
> Nur ist eine einelne Anzeige noch etwas langweilig.
> Jetz also noch Multiplexen für mehr Zeichen ;)

Ja multiplexen wäre der nächste logische Schritt - ich hab ja noch PORTD 
frei damit könnte ich mit ein paar "Hilfs-Chips" noch 255 andere 
Anzeigen ansteuern. Oder ich besorge mir für das Geld das mir Conrad für 
255 Segmentanzeigen abknöpft gleich einen LCD und fange damit an zu 
experimentieren :D

Ich könnte mir vorstellen dass so eine kleine Anzeige nützlich sein 
könnte um schnell mal etwas zu testen man muss ja nur einen char an das 
PORTA anlegen was unter C ganz gut mit
1
PORTB = 'c';
 (auf einem anderen Chip selbstverständlich) funktioniert.

von Info (Gast)


Lesenswert?

1
void segDP()
2
{
3
  PORTC |= (1 << PC0);
4
}
5
6
//oft genutzte "Partikel" - Striche oben, unten, mitte, etc
7
void _left() 
8
{
9
  segH();
10
  segG();
11
}
12
...
13
} 
14
//Darstellbare ASCII Zeichen mit Hilfe der "Partikel" und Segmente - auf eine direkte Ansteuerung der Ausgänge mit z.B. PORTB = 0b1010101
15
//wurde wegen der freien Belegbarkeit der Pins verzichtet. 
16
void _A_() 
17
{
18
  _left();
19
  _right();
20
  _up();
21
  _horizontal();
22
}

Optimiert der Compiler die vielen Funktionsaufrufe?
1
#define SEGH (1 << PC0)
2
#define LEFT (SEGH | SEGG)
3
4
void A(void) {PORTC = LEFT;}

Wahrscheinlich geht es noch einfacher..

von Info (Gast)


Lesenswert?

Oh:
1
void A(void) {PORTC = LEFT | RIGHT | UP | HORI;}

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.