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
Ich glaube es wäre am einfachsten, wenn Kernighan & Ritchie endlich mal 'ne If-Schleife zu C hinzufügen würden. :-(
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 :-)
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.
aber auch nur weil es immer noch keine IF-Schleifen in C gibt :( sonst wär es schon so gut wie feddisch
http://www.if-schleife.de/ Ansonsten wie schon gesagt ersteinmal das Datenblatt lesen und verstehen wie das HD44780 arbeitet.
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
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)
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?
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.
Abdelillah Karam schrieb: > dass mit den If-schleifen die Emulation zu ende geht nein da geht der prozessor zu ende
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
man ist hier, um etwas zu lernen, denke ich "Über jedem, der Wissen hat, ist der Eine, Der noch mehr weiß."
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.
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?
Abdelillah Karam schrieb: > Angehängte Dateien: > myCode.txt (9,93 KB, ..) C-Code darfst du auch so nennen oder verwendest du einen txt-Compiler? ;-)
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.
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?
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?
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.
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.