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.
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
Nur ist eine einelne Anzeige noch etwas langweilig. Jetz also noch Multiplexen für mehr Zeichen ;)
>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...
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.
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..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.