Display

Ein Bericht im Linux-Magazin, in welchen eine Statusanzeige für Server an der parallen Schnittstelle gebaut wurde, hat mich auf den Gedanken gebracht das so etwas auch für den Heimgebrauch nützlich sein könnte. Allerdings sollte für diesen Zweck nicht die Druckerschnittstelle herhalten. Also mußte ich mich um einen Wandler kümmern, welcher die Daten von der seriellen Schnittstelle entgegennimmt und dem Display parallel übergibt. Etwas Komfort wie positionierbarer Cursor, cls und andere kleine Selbsversttändlichkeiten sollten natürlich auch nicht fehlen.
Da dieses unterfangen nicht das einfachste der Welt ist, und ich ohne Tatkräftige Unterstützung eines Freundes(S.Weber) es wohl nicht so schnell geschafft hätte, will ich Euch etwas 'Überlege-Arbeit' abnehmen und auf den folgenden Seiten eine kleine Anleitung geben.

Vorab schonmal.. die Kosten liegen so bei 60-100DM (je nach Display) und natürlich ein paar Stündchen Bastelarbeit.
 

NEU:
Artikel dazu im Linux-Magazin 02/2001 (leider nicht mehr online)

22.01.2005..V0.5 

Download Artikel im Englischen Linux-Magazin: Artikel

 

Inhalt

  1. Die Grundlagen
  2. Die Schaltung
  3. Datenblätter und Software
  4. Layout
  5. Gehäuse
  6. Programmieren
    1. Programmieren mit der AVR-Suite
    2. Programmieren unter Linux
      1. Assembler AVRA
      2. SP12 Grundlagen
  7. Die Software
  8. Wie gehts unter Linux
  9. Nutzungsvorschläge
  10. Links
  11. Entwickler
  12. Kommerzielle Nutzung

 

Die Grundlagen

Was man als Erstes braucht ist ein Display welches es in allen erdenklichen Variationen gibt. Ich habe mich für ein 16x4 mit Beleuchtung entschieden (ca. 40DM bei Reichelt-Elektronik 10/2001). Es ist natürlich möglich auch kleinere Displays zu benutzen, da liegen die Kosten bei der Hälfte und man kann sich etwas Programmierarbeit ersparen (Zeilen sind nicht versetzt, siehe Controller Anleitung).
Wichtig an dieser Stelle ist der verwendete Controller auf dem Display, es muß ein HD44780 oder Kompatible sein (z.B. LSI KS007xB).
Diese Display's werden parallel angesteuert, also muß ein Prozessor her, welcher die Daten seriell entgegennimmt, evt. Steuercodes ausführt und natürlich meinen Text an die entsprechende Position setzt. Nun gibt es vielerlei solcher kleinen Alleskönner jeder mit seinen Vor- und Nachteilen. Entschieden haben wir uns dann für einen ATMEL 2333, dieses Wunderwerk hat 20 I/O's, AD-Wandler, 2kByte Programmspeicher, 128Byte SRAM und EEPROM und vielerlei weiterer Nützlichkeiten. Der Große Vorteil allerdings ist seine Programmierbarkeit, ein kleines Käbelchen gebaut, Software geladen und schon kann es losgehen, und was das spätere probieren erleichert - man kann ihn in eingebautem Zustand programmieren. Kurz und gut, genau richtig der Kleine (ca. 9DM bei Reichelt-Elektronik 10/2001). Auch hier kann man kleinere Typen einsetzen, z.B. 2313, dies macht die Schaltung kleiner, aber man kann später weniger Zusätze anbringen.
Nun brauchen wir noch eine Pegelanpassung an die serielle Schnittstelle, wozu uns der MAXIM 232 dient und natürlich die übliche Stromversorgung die bei Verwendung der Hintergrundbeleuchtung 300mA bei 5V liefern muß (ansonsten ca. 100mA).
Damit hätten wir im Prinzip alles nötige, ein paar LED's noch und evt. einen Fotowiderstand damit die vielen I/O's einem sinnvollen Zweck bekommen.

Die Schaltung

Schaltplan klein Download als PDF (44k)
Download als PS (370k)
Download als GIF (22k)
Download als Eagle-Schaltplan (44k)

Die Schaltung ist schnell erklärt..
Zuerst die Stromversorgung, nicht weiter kompliziert. Wer sich mit weniger Komfort zufrieden gibt und ein Display ohne Beleuchtung verwendet, kann den Strom evt. auch aus der Schnittstelle beziehen.
Dann gehts weiter zur schon erwähnten Pegelanpassung mittels des MAXIM Chips. Es ist ebenfalls eine Standartschaltung die nicht viel Aufwand verlangt. Wir haben hier auch RxD mit angeschlossen um dem Computer evt. auch mal Daten schicken zu können, bzw. um XON/XOFF zu simulieren. Ihr könnt später zwischen der CTS bzw. XON/XOFF - Programmversion wählen bzw. benutze ich gleich beides.
An dieser Stelle wird auch die Drehung von Sende- und Empfangsleitung vorgenohmen, sodaß später ein 1:1 Kabel von der seriellen Schnittstelle verwendet werden kann. (Es geht also TXD von der COM-Schnittstelle auf PIN2-RXD des ATMEL).
Nach der Pegalanpassung geht es zum Prozessor.
Dieser besitzt einen internen Taktoscillator welchen wir extern mit einem 8MHz-Quarz nebst Kondensatoren beschalten. Weiterhin sind an ihm 5 LED's angeschlossen, die später wahlweise programmiert werden können. Und natürlich macht er seine Hauptaufgabe, - er steuert unser Display an.
Ich habe noch die Beleuchtung des Displays per Software schaltbar gemacht und ein kleines Poti integriert, welches den Kontrast steuert.
An einigen Ausgängen sind die Programmierleitungen über einen Widerstand parallel geschaltet. Dieses Verfahren funkioniert wunderbar und man hält sich I/O's frei und braucht den Chip zum programmieren nicht aus der Schaltung zu nehmen.
Genaueres zu den einzelnen Bauteilen könnt ihr in den jeweiligen Datenblättern lesen.

Datenblätter und Software

Ich stelle Euch die Datenblätter die ich benötigte zum Download auf meine Homepage.
Die AVR-Suite von Atmel solltet Ihr allerdings von dort laden, da gibt es immer das Neueste.
Als Programmiertool verwende ich WinAVR. Da es noch in Entwicklung ist, solltet ihr auch dies von der Original-Homepage laden.
Keine Angst, ATMEL stellt alles Kostenfrei zur Verfügung. Eine Nette Geste, finde ich..

ATMEL 2333 doc1042.pdf ca. 1.7MB
Assembler Instr. doc0856.pdf ca. 1.1MB
MAXIM 232 max232.pdf ca. 450kB
Display's LCD_Module.pdf Achtung ca. 6MB
WinAVR http://www.rowalt.de/mc/ ca. 50kB
AVR-Suite v. Atmel http://www.atmel.com/atmel/products/prod202.htm ca. 4.4MB

Layout

Mein Layout habe ich an ein fertiges Gehäuse angepaßt, in dem die Höhe begrenzt war und ich somit nichts unter das Display plazieren konnte. Wer da ein anderes Gehäuse hat, muß selbst 'Hand anlegen' ;)..
 

Layout-Beschreibung Download als GIF Download als PDF Download als PS
Lötseite - Blick von Unten Download .. ..
Bauteilseite - Blick von Unten Download .. ..
Bauteilseite - gespiegelt Download .. ..
Bauteile - Blick von Unten Download .. ..
Bauteilse - gespiegelt Download .. ..
Gesamt - Blick von Unten Download .. ..

Und hier ein Beispiel wie es fertig aufgebaut aussehen könnte:..
Ansicht der Platine.gif

Gehäuse

Die Frage ist schnell geklärt..

  • Erstens In den Rechner - gut für Server,da könnte man dann auch die Stromversorgung einsparen
     
  • Zweitens Externes Gehäuse - für allt. Gebrauch, da habe ich genohmen was da war und da kann jeder nach indiv. Bastelleidenschaft werkeln.
     

Programmieren

Nun da die Schaltung fertig aufgebaut, geprüft und OK ist, können wir ans Programmieren gehen. Die Bauanleitung zum Programmierkabel findet Ihr auf der WinAVR-Seite von Roland Walter. Anm.: Ihr solltet generell mal dort vorbeischaun und Euch die Texte zu den ATMEL-Chips durchnehmen.
Wir haben die Widerstände fest in die Schaltung integriert und so reichte es aus ein einfaches Kabel zu bauen in dem die fünf Anschlüsse, zur Druckerschnittstelle führen.
Ich habe die jeweiligen Pins zur Druckerschnittstelle genau im Schaltplan vermerkt.

Nachdem das Kabel fertig ist, müssen wir uns noch für eine der vielen Programmiersprachen entscheiden. Wir haben uns für Assembler in Verbindung mit der AVR-Suite(Windows) von ATMEL entschieden, da sie einen Simulator enthält und somit für den Einstieg ideal ist.
Später kann man dann unter Linux einen reinen Assembler einsetzen, ich benutze da zur Zeit AVRA.
Es gibt allerdings auch noch einige Basic- und Pascalähnliche Sprachen und sogar C (auch für Linux, aber von mir noch nicht getestet).
Und da wir dann mit der Suite schonmal in Windofs arbeiten, nehmen wir zum Programmieren des Chips WinAVR (auch dies gibt es für Linux ohne grafisches Allerlei, und sogar als Grundlage des WinAVR - SP12 genannt).

Programmieren mit der AVR-Suite

So, nun können wir einen kleinen Blick in die AVR-Suite wagen. Man ein legt dort Neues Projekt an und probiert ersteinmal ein wenig.
..später kommt eine kurze Einführung.. in die AVR-Suite...

Programmieren unter Linux

Wer schon Erfahrung mit Assembler hat und sich zutraut gleich ohne Simulator anzufangen, gebe ich hier eine kurze Einleitung für SP12 und AVRA.
Nachdem wir die beiden Programme entpackt und neu übersetzt (make, make install) haben, kann es loßgehen.

AVRA

AVRA ist der Assembler. Er ist zu dem ATMEL-Assembler kompatibel und somit kann man den unter Windows geschriebenen Programmcode auch mit diesem übersetzen.
Es reicht ein einfacher Aufruf von:

avra main.asm

Wenn das Programm Fehlerfrei ist, wird eine Datei mit der Endung .hex erzeugt. Dies ist unser Code den wir in den Atmel 'brennen' müssen, wobei es sich um das Atmel-generic Format handelt.
Da wir allerdings auch Daten für unser EEROM haben, wird noch eine zweite Datei angelegt 'xxx.eep.hex' . Diese enthählt logische Weise die Daten die im EEPROM stehen sollen.

SP12

SP12 dient dann dazu den Programmcode (.hex) und die EEPROM-Daten (.eep) in den Chip zu schreiben.
Allgemein sollte sich jeder einmal die Datei sp12.doc anschauen. Sie enthählt eine Umfangreiche Anleitung wie ich sie hier nicht geben kann und will. Die folgenden Zeilen sind somit nur für den kleinen Einstieg gedacht.

Zuerst gilt must be root ;) ..
Dann müssen wir SP12 beim Ersten starten mit der Option -i aufrufen womit das Programm initalisiert wird (LPT festgestellt usw.).

sp12 -i

Nun sollten wir unser Programm in den Atmel brennen können:

sp12 -wpfC main.hex

w : write
p : programm data
f : filename folgt
C : Checksumme
 

Und jetzt folgen die EEPROM-Daten:

sp12 -wefC eeprom.eep.hex

e : eeprom daten

Das ganze lässt sich auch in eine Zeile packen..

sp12 -wpfC main.hex -wefC eeprom.eep

Das sollte als sehr kleiner Einstieg ausreichend sein, wobei SP12 wirklich weitaus mächtiger ist.

Zur Software

In meinen Programm wird hautpsächlich nur Nachgeschaut ob ein Zeichen im Puffer ist. Dieser Puffer wird durch die Interruptroutine beschrieben, welche durch ein empfangenes Zeichen auslöst wird. Ist der Puffer voll wird CTS gesetzt bzw. XOFF gesendet (je nach Version).
Ist nun ein Zeichen im Puffer wird dies geprüft ob es evt. einen Befehl einleitet, ansonsten wird es ausgegeben und es wird bei Bedarf CTS wieder gelöscht bzw XON gesendet.
Das ist das Prinzip, schaut Euch das Programm an, es ist ausführlich Kommentiert.
 

In die Sofware hab ich einen kleinen 'Interpreter' eingebaut, so kann man ihm sagen welche LED angehen, wo der Cursor hin soll, ob die Beleuchtung an ist und noch paar kleinerer Nützlichkeiten. Wie die Codezeichen lauten steht in der Anlage.
 

Das Display arbeit jetzt seit 09/2000 fehlerfrei mit der Software. Das Programm erfüllt noch nicht alle meine Wünsche und ist noch nicht optimiert, aber ich hab ja noch Zeit ;)
Hier vorab erstmal mein kleines Progrämmchen, und für weitere Anregungen bin ich immer zu haben.

Programmcode V0.6 CTS
Und eine Anlage: als .txt oder als .pdf

Änderungen zur Version 0.55:
- der Pufferüberlauf beim senden von mehr als Puffergrösse ist behoben (man kann jetzt den Empfangspuffer wieder aktivieren !)
- LED's haben ein zusätzliches Argument -> BLINKEN
 

Wie gehts mit Linux ?

Auf Grund einiger Anfragen kommen ein paar Zeilen:
1. Man teile Linux mit welchen UART man besitzt (tlw. schon gemacht)

setserial /dev/ttyS0 uart 16550A 

2. Man stelle die Übertragungsparameter ein:
 

stty -F /dev/ttyS0 speed 38400 ixon ctrscts

und schon kann der Spass losgehen...

Nutzungsvorschläge und Aussichten

ich nutze das Display zur Zeit zur Ausgabe von Statusmeldungen, z.B. Fortschritt von SETI, loadavg und ob ich ONLINE bin. Natürlich gibt es da noch erheblich mehr Möglichkeiten die jeder selbst 'entwerfen' kann.
Man schickt einfach eine Zeile an die serielle Schnittstelle (unter Linux relativ einfach mit Cron automatisierbar) und mehr ist nicht nötig, der übliche Treiberkampf kann entfallen.
 

  • Beispiele:
  • Diese Zeile schaltet zuerst die Beleuchtung an (~B1), löscht dann das Display (~C), setzt Cursor auf Zeile 0 und Spalte 5 (~P005) und schreibt da Hallo hin...
    echo "~B1~C~P005Hallo" >/dev/ttyS0
  • Dies filtert den Fortschritt aus der Seti-Statusdatei..
    das `-Zeichen ist wichtig ! .. ASC(96)
    echo ~P200Seti:`cat state.sah 2>/dev/null | grep prog | tr "a-z,=" "\b" | cut -c8-9` >/dev/ttyS0 2>/dev/null 
  • Nach Installation vom lm_sensors kann die Prozessortemp. gefiltert werden..
    echo ~P109`cat /proc/sensors | grep Mainboard | cut -c10-15` >/dev/ttyS0 2>/dev/null 

Es gibt größere Chips mit 4KByte Programmspeicher (4333) bis hin zu den Riesen mit 512kByte. Dort hinein kann man dann schon nen kleineren Linuxkernel verpacken oder ein eigenes kleines Terminalprogramm.

Also, auf zum probieren und Viel Spaß...

Weitere Links

Beschreibung Adresse:
ATMEL-HOME
Hersteller der kleinen Alleskönner
http://www.atmel.com/
MAXIM-HOME
der Pegalanpasser
http://www.maxim-ic.com/
HOME von Roland Walter
Zusammenfassung Atmel-Chips Prgrammieren
http://www.rowalt.de/mc/
SP12
SP12 für viele Betriebssysteme
http://www.xs4all.nl/~sbolt/e-spider_prog.html
Einführung ATMEL
mit Bau- u. Programmbeispielen
http://www.uc-project.de/uc-if/avrhelp.shtml (leider nicht mehr online)

Kommerzielle Nutzung

Aus gegebenem Anlass möchte ich darauf hinweisen, dass eine kommerzielle Nutzung , Vermarktung oder ähnliches nur nach schriftlicher Genehmigung durch mich erlaubt ist.
Anm.:
Die Entwicklung des Displays hat eine Menge Arbeit gemacht und wer damit Geld verdient, sollte doch Bitte die Grundsätze der 'Fairniss' einhalten.

Entwickler

Michael Majunke
und

Sascha Weber 
 

Anmerkung: Original Site: www.mmajunke.de/display.htm