Forum: Mikrocontroller und Digitale Elektronik HD44780 emulieren


von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

Hallo Zusammen

für mein Projekt an der FH muss ich den HD44780 mit einem ATmega 32 
emulieren (statt LCD wird mit 16 8*8 LED matrizen gearbeitet).
Die Ansteuerung der Matrizen habe ich mit Hilfe von 16 MAX's 7219 
gemacht.
Ich bin dabei den HD44780 zu emulieren. Da habe ich meine 
Schwierigkeiten.
so habe ich angefangen:

#define MATRIX_PORT     PORTA // PORTA der Datenleitungen
#define MATRIX_DDR      DDRA
#define E    PB0
#define RW          0
#define RS          PB2

unsigned char InstructionReg = 0;
unsigned char DataReg = 0;

und danach möchte ich die mit if-schleifen die Fälle unterscheiden
(wenn RS == 0 bzw. RS == 1)
Ist das richtig?
für euere Antworten werde ich sehr dankbar.
Danke

von Bitflüsterer (Gast)


Lesenswert?

Ich glaube es wäre am einfachsten, wenn Kernighan & Ritchie endlich mal 
'ne If-Schleife zu C hinzufügen würden. :-(

von npn (Gast)


Lesenswert?

Nimm es mir bitte nicht übel, aber das ist, als wenn du einen Roman 
schreiben willst und sagst: "schau mal, den Buchtitel habe ich schon".
Die Frage ist, was das insgesamt werden soll. Den Befehlssatz vom 
HD44780 zu emulieren ist schon ein gutes Stück Arbeit, würde ich sagen. 
Was du bis jetzt hast, ist wirklich nur die Überschrift.
Wie gesagt, ist nicht böse gemeint, aber du hast noch sehr viel Arbeit 
vor dir :-)

von Bitflüsterer (Gast)


Lesenswert?

Ein guter Ansatzpunkt wäre, wenn Du Dir mal die Datenblätter zu einigen 
HD44780-Displays anschaust. In einigen (aber nicht allen) gibt es 
Blockdiagramme der internen Schaltungen. Diese Blöcke musst Du in Deiner 
Software nachbilden - allerdings kannst Du einiges weglassen, denn die 
Schaltung wird auch 2-zeilige Displays ansteuern können, was Du ja nicht 
benötigst.

Diese Blöcke skizzierst Du erstmal als Pseudocode. Da hast Du schonmal 
einen guten Ansatzpunkt.

von Amateur (Gast)


Lesenswert?

aber auch nur weil es immer noch keine IF-Schleifen in C gibt :(
sonst wär es schon so gut wie feddisch

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


Lesenswert?

http://www.if-schleife.de/

Ansonsten wie schon gesagt ersteinmal das Datenblatt lesen und verstehen 
wie das HD44780 arbeitet.

von Thomas P. (topla)


Lesenswert?

Theoretisch richtig, praktisch vom Timing wahrscheinlich zu knapp. Dort:
Beitrag "HD44780 - man in the middle mit AVR?"
habe ich so etwas Ähnliches umgesetzt.
Also erstmal die Anforderungen des steuernden Controllers analysieren, 
dann die Anforderungen an die Ausgabe und dann an das Konzept gehen.
Die paar Zeilen Coding sind vielleicht fast eine Überschrift, aber kein 
Programm.

Thomas

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

danke für die Antworten.
Ich habe nicht gemeint, dass mit den If-schleifen die Emulation zu ende 
geht.
ich habe ein Paar Funktionen geschrieben wie:

void clearDisplay()

/* Send to the controller instruction command
input: instruction to send to the controller */

void lcd_command(uint8_t cmd)
{

    lcd_write(cmd,0);
}

/* Send to the controller data send
input: data to send to the controller */

void lcd_data(uint8_t dat)
{
  lcd_write(dat, 1);
}
...usw

und tatsächlich, wenn ich z.B. in meiner main-Methode den folgenden 
Befehl eingebe:
lcd_command(0x02); dann wird der Cursor auf den Anfang der 1.Zeile 
(Adresse 0)

von Bitflüsterer (Gast)


Lesenswert?

Abdelillah Karam schrieb:
> danke für die Antworten.
> Ich habe nicht gemeint, dass mit den If-schleifen die Emulation zu ende
> geht.
Das hat hier auch sonst niemand gemeint.

> ich habe ein Paar Funktionen geschrieben wie: ...

Schön. Aber das sind ja Funktionen um ein Display zu steuern .
Was Du brauchst sind Funktionen um ein Display zu emulieren !

Und was sollte uns jetzt Dein letzter Beitrag sagen?

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

also was ich verstanden habe.
der HD hat zwei komminikations-Modi: 4 Bit und 8 Bit Bus.
ich habe versucht die 8-Bit HD44780 Schnittstelle so zu implemntieren:
PORTB Bit 0 = E
PORT Bit 1 = R/W
PORT Bit 2 = RS

PORTA Bits 0:7 = Data Bus (muss ständig zwischen Output und Input 
umgeschaltet werden)

wenn RS gleich 0: habe ich alle Instructions des HD implementiert.
und wenn RS gleich 1: dann werden die Data zum Display geschickt.

ich weiss, dass das Thema mit dem Emulieren sehr kompliziert ist.
 danke für euere Mühe, mich unterstützen zu wollen.

von Amateur (Gast)


Lesenswert?

Abdelillah Karam schrieb:
> dass mit den If-schleifen die Emulation zu ende geht

nein da geht der prozessor zu ende

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

:)

von Thomas P. (topla)


Lesenswert?

Abdelillah Karam schrieb:
> und tatsächlich, wenn ich z.B. in meiner main-Methode den folgenden
> Befehl eingebe:
> lcd_command(0x02); dann wird der Cursor auf den Anfang der 1.Zeile
> (Adresse 0)

Das ist jetzt die Ansteuerung eines LCDs, davon war im Ursprungspost 
überhaupt keine Rede. Und das "selber geschrieben" stelle ich auch mal 
in Frage.
Poste doch mal den kompletten Code für die Matrixansteuerung der 7219 
und deren Initialisierung.

Thomas

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

man ist hier, um etwas zu lernen, denke ich
"Über jedem, der Wissen hat, ist der Eine, Der noch mehr weiß."

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

Okay, Thomas, mache ich

von Ab K. (Firma: Herr) (k_avr)


Angehängte Dateien:

Lesenswert?

das ist der Code

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

das ist für 2 MAXs (2 8*8 Matrix)

von Mike (Gast)


Lesenswert?

Abdelillah Karam schrieb:
> PORTA Bits 0:7 = Data Bus (muss ständig zwischen Output und Input
> umgeschaltet werden)

Muss nicht. Meist werden die Controller im 4-Bit Modus und mit 
Datenfluss auf dem Port nur in eine Richtung zum HD44780 betrieben. Wenn 
du allerdings eine voll Emulation des HD44780 bauen willst, brauchst du 
4- und 8-Bit Modus, sowohl nur lesend als auch bidirektional. Mindestens 
für den unidirektionalen Betrieb, wirst du auch das Timing sauber 
einhalten müssen, wenn eine universelle Ansteuerung funktionieren soll.

von Bitflüsterer (Gast)


Lesenswert?

Bemerkung vorab: C-Quelltext mit der Endung ".c" posten, bitte.

Dein Code soll möglicherweise erstmal nur ein Loopback für die Emulation 
sein. Anders kann ich mir z.B. Code wie den hier:

1
  MATRIX_PORT = data;
2
  InstructionReg = MATRIX_PORT ; //PORTA

nicht erklären.

Damit wir mal einen roten Faden finden, wäre es gut, wenn Du mal eine 
konkrete Frage stellst. Bis jetzt haben wir nur:

> Ich bin dabei den HD44780 zu emulieren. Da habe ich meine
> Schwierigkeiten.

Was sind Deine Schwierigkeiten genau?

von n.b. (Gast)


Lesenswert?

Abdelillah Karam schrieb:
> Angehängte Dateien:
> myCode.txt (9,93 KB, ..)

C-Code darfst du auch so nennen oder verwendest du einen txt-Compiler?
;-)

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

sorry :)
habe ich nicht dran gedacht

von Ab K. (Firma: Herr) (k_avr)


Angehängte Dateien:

Lesenswert?

das ist mein Bastelcode

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

sorry für die Umstände
bin neu hier.
und nur die initialisierung und Ansteuerung der MAX's hat's viel Zeit 
und Energie gekostet.

von Bitflüsterer (Gast)


Lesenswert?

Abdelillah Karam schrieb:
> sorry für die Umstände
Naja. Bis zu einem gewissen Grad werden die hier toleriert.

> und nur die initialisierung und Ansteuerung der MAX's hat's viel Zeit
> und Energie gekostet.

Ich hab's mir nicht im Detail angeschaut, aber gut: Wenn's funktioniert 
kannst Du stolz darauf sein. Unsere ersten Versuche in dieser Richtung 
sind keinem von uns leichtgefallen.

Aber nun mal Butter bei die Fische: Was ist Deine Frage?

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

also die 1. Frage ist: wie schwer ist die volle HD44780 Emulation.
ich habe bis jetzt im Studium nur ein Semester über "Microcontroller" 
gehabt.
wir haben u.a. HD44780-Display-Controller gehabt.
Anschlussbelegung, speicher,Betriebsart, initialisierung und 
Display-Programmierung in C.
wie soll ich nun vorgehen? was soll ich zuerst tun?

von Bitflüsterer (Gast)


Lesenswert?

Abdelillah Karam schrieb:
> also die 1. Frage ist: wie schwer ist die volle HD44780 Emulation.
Für Dich ist sie schwer. Gefühlt Fünfmal so sehr wie die 
Matrix-Ansteuerung.

> wie soll ich nun vorgehen? was soll ich zuerst tun?

Ist an sich schon gesagt worden.

Datenblatt studieren in Hinblick auf:
1. Timing
2. Innere Struktur
3. Auswahl des uC entsprechend Timing-Anforderungen
4. Implementierung der inneren Struktur in Software

Es ist (meiner Meinung nach) sinnvoll sich die Punkte 1. und 2. erstmal 
zusammen vorzunehmen. Von Vorteil ist, dass Du schonmal so ein Display 
gesteuert hast. Aber nun musst Du den Standpunkt wechseln und Dir 
vorstellen Du implementierst das Display.

Wahrscheinlich sind mehrere Iterationen notwendig. Es wäre aber ein 
Wunder, wenn Dir das anders ginge.
Es ist schon ein Unterschied, ob man viele kleine Einzelprojekte gemacht 
hat, die für sich genommen zwar notwendig waren aber letztlich doch sehr 
primitiv oder ein aus vielen dieser kleinen primitiven Dinge 
zusammengesetztes Projekt. Da kommen Schwierigkeiten hinzu, die man an 
einfachen Dingen einfach nicht üben kann.

von Ab K. (Firma: Herr) (k_avr)


Lesenswert?

super, danke vielmals für die Antworten.
noch eine letzte Frage, Ist eigentlich schon mal jemand auf die Idee 
gekommen, einen HD44780 zu emulieren :)
schönen Abend noch euch allen.

von Thomas P. (topla)


Lesenswert?

So wie ich es sehe, hat er ein Problem mit der Datenentgegennahme vom 
steuernden Controller. Das geht nicht als Funktion, die irgendwann mal 
aufgerufen wird. Du bist da vollkommen fremdgesteuert, also kann man nur 
Interrupts einsetzen.
Ich habe das so gelöst, dass ein Interrupt bei RD und E und ein anderer 
bei WR und E ausgelöst wird. Dann hat man nur kurze Zeit zum reagieren, 
also um die Daten abzuholen, die ISR ist also auf schnelles Einlesen 
ausgelegt. Bei mir lag grundsätzlich 4-bit-Betrieb vor und ich habe in 
der ISR immer auf das zweite Nibble gewartet; ist nicht elegant, aber in 
dem Fall problemlos möglich. Nachdem das Byte komplett ist wird die ISR 
beendet und die Auswertung begonnen. Parallel ist für ein Lesen ein 
aktives Busy zu liefern, solange die Auswertung läuft.

Thomas

von Thomas P. (topla)


Lesenswert?

Ab Ka schrieb:
> noch eine letzte Frage, Ist eigentlich schon mal jemand auf die Idee
> gekommen, einen HD44780 zu emulieren :)

Meinen Link oben hast Du gelesen?
Das ist eine Emulation, allerdings nicht vollständig über beide 
Betriebsarten, da die Rahmenbedingungen des steuernden Controllers 
bekannt waren bzw. sich ermitteln ließen.
Das passende Vorgehen hat Bitflüsterer schon dargestellt.

Thomas

von Lenny D. (le-do)


Lesenswert?

Du sollst also im Prinzip eine Anzeige bauen, die für ein existierendes 
Programm wie ein HD44780 angesteuert wird?
Dann solltest auch du 2 Controller verwenden, den Emulator um den es 
geht und einen Testcontroller, der meinetwegen die Anzeige initialisiert 
und ein "Hello World" sendet und den Cursor blinken lässt.

Aus deinen vergangenen Projekten, dem Datenblatt und den guten Tutorials 
hier auf der Seite weißt du dann genau welche Daten aus deinem 
Testcontroller rausgehen, ergo welche in deinen Emulator reingehen und 
wie diese zu verarbeiten sind.
Dein Emulator ist also eine Art Übersetzer zwischen HD44780 und den 
MAXs, inklusive er muss den Zeichen-RAM haben etc. wie ein echter 
HD44780.

Wie bereits angesprochen solltest du dir klarmachen wie viel von dem 
Befehlssatz du implementieren willst, ob 1 Zeile 4 bit reicht oder ob 
das Display alle gültigen HD44780 Befehle verstehen können soll.

Klingt nach einem spannenden aber durchaus sehr umfangreichen Projekt. 
Wenn du die Grundstruktur richtig machst müsstest du aber in der Lage 
sein klein anzufangen und den Befehlssatz nach und nach zu erweitern.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ab Ka schrieb:
> Ich bin dabei den HD44780 zu emulieren. Da habe ich meine
> Schwierigkeiten.
Ja, sieht man. Wie wäre es, wenn du dir mal auf ein Blatt Papier 
zeichnest, was alles in dem HD44780 drin ist, und was er aussenrum 
braucht?

Dann wirst du sehen, dass im HD44780 eben nichts drin ist, was den 
HD44780 ansteuert. Sondern dort ist ein paralleles Interface, das mit 
Daten- und Steuerleitungen Kommandos von aussen entgegennimmt. Und 
dieses parallele Interface wird hier am vermutlich einfachsten über 
einen Pin-Change Interrupt am Enable-Pin gesteuert.

> (statt LCD wird mit 16 8*8 LED matrizen gearbeitet).
Das sind also gut 21 Zeichen in der Breite bei einer 5x7 Darstellung und 
einem Leerpixel (16*8/(5+1)=21,33). Da reicht es aus, wenn dein 
HD44780-Nachbau nur ein 1 zeiliges Display unterstützt...

Oder du machst nur 15 dieser LEDs nebeneinander und hast eine Zeile mit 
genau 20 Zeichen (was für ein Textdisplay sehr üblich ist). Bei diesen 
Gedankengängen und den ungeraden Resultaten fällt mir auf: hat sich bei 
euch eigentlich auch schon mal jemand diese sehr simplen Gedanken 
gemacht?

Lenny D. schrieb:
> Wenn du die Grundstruktur richtig machst müsstest du aber in der Lage
> sein klein anzufangen und den Befehlssatz nach und nach zu erweitern.
Richtig. Denn dann kann z.B. der steuernde Rechner davon ausgehen, ein 
initialisiertes Display vorzufinden und man kann sich gleich mal die 
Zeichendarstellung und die Cursorfunktionen durchdenken und 
programmieren.

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.