Hallo zusammen Ich hab mir ein Display gekauft und diesen an einen ATMEGA32 geschlossen. Den Display habe ich an PORTD gehängt und RS und E an PORTA(PIN1 und PIN2). Gibt eine einfache möglichkeit irgendetwas auszugeben, z.B. "Hallo" und kann man dieses Tutorial auch für den 8-Bit-Interfacemodus benutzen? http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Das kommt drauf an, was das für ein 'Display' ist. Es gibt ja weltweit mehr als nur einen einzigen Typ. > und kann man dieses Tutorial auch für den 8-Bit-Interfacemodus benutzen? > http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung Wenn es ein HD44780 kompatibles LCD ist, dann ja. Musst du halt die Initialisierung ein wenig umschreiben. Aber wozu? Nimm halt den 4 Bit Modus. Das spart Leitungen.
Ich hab dieses Display. http://www.distrelec.ch/Web/Downloads/_t/ds/dem16217syh_eng_tds.pdf?mime=application%2Fpdf Wie finde ich heraus ob es HD44780 kompatibl ist?
Renfer schrieb: > Ich hab dieses Display. > http://www.distrelec.ch/Web/Downloads/_t/ds/dem162... > Wie finde ich heraus ob es HD44780 kompatibl ist? Im Datenblatt steht, welcher Kontroller auf dem Display sitzt. Der ST7066. Wenn du das bei gurgel eingibst, erfährst du von Wikipedia, dass er zum HD44780 kompatibel ist. Also bingo.
Renfer schrieb: > Ich hab dieses Display. > http://www.distrelec.ch/Web/Downloads/_t/ds/dem16217syh_eng_tds.pdf?mime=application%2Fpdf Das ist wohl kompatibel > Wie finde ich heraus ob es HD44780 kompatibl ist? Indem du bei deinem nächsten Einkauf nicht unbedingt nur nach dem Preis gehst, sondern auch danach, welche Informationen sonst noch verfügbar sind. Findest du ein Bauteil, bei dem du die notwendige Information nicht erhältst (zb in dem du danach goggelst) und das auch sonst keiner (zb in einem Forum) kennt, dann lass die Finger davon. Egal wie schön die Farbe ist, egal wie billig es ist. Löse dich von der Vorstellung, die dir PC vermitteln, das das alles zusammenpasst und man im Prinzip alles kaufen kann und es wird schon irgendwie gehen. Beim PC funktioniert das, weil es da Standards gibt, die sich seit Jahrzehnten etabliert haben.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung Ich hab dieses Tutorial durchgelesen und es anschliessen den Code kopiert und folgendes geändert: // LCD RS <--> PORTD Bit PD4 (RS: 1=Data, 0=Command) #define LCD_RS PD4 // LCD EN <--> PORTD Bit PD5 (EN: 1-Impuls für Daten) #define LCD_EN PD5 zu // LCD RS <--> PORTD Bit PD4 (RS: 1=Data, 0=Command) #define LCD_RS PA1 // LCD EN <--> PORTD Bit PD5 (EN: 1-Impuls für Daten) #define LCD_EN PA0 Jetzt macht es aber nix. Die schwarzen Balken bleiben stehen auf dem Display. Wird hier nicht mal die Initialisierung durchgeführt? Hat jemand ein Tipp wie weiter?
Renfer schrieb: > Jetzt macht es aber nix. Die schwarzen Balken bleiben stehen auf dem > Display. Wird hier nicht mal die Initialisierung durchgeführt? Hat > jemand ein Tipp wie weiter? Wenn du die beiden Leitungen vom Port D auf den Port A übersiedelst, dann müssen in der Initialisierung auch diese beiden Leitungen auf Ausgang geschaltet werden bzw. die Ausgabeanweisungen entsprechend umgeschrieben werden. Der Code geht nun mal davon aus, das alle Leitungen an nur einem einzigen Port hängen und ist auch genau für diesen Fall geschrieben. Hast du denn deine ersten Schritte nicht mit LED-ein/aus schalten bzw. blinken lassen verbracht, so dass du erst mal grundsätzlich die Technik erlernt hast, wie man bestimmte Bits an einem bestimmten Port schaltet? Das in PA1 der Portname A vorkommt, ist zwar nett, aber trügerisch. Denn PA1 unterscheidet sich in nichts von PD1. Beides sind einfach nur 2 unterschiedliche Bezeichnungen für das selbe: Das Bit 1. In dieser Bezeichnung ist aber nicht enthalten (auch wenn es so aussieht), dass dieses Bit am Port A residiert.
PA1 steht für 1, PA0 steht für 0, wenn du sonst nichts änderst, schreibt er dir 1 und 0 in Port D. Du müsstest also zumindest noch den Port ändern.
- Hast Du die Bauteile nach Datenblatt angeschlossen? - Dann noch JTAG in den Fuses disablen. - Abblockondensatoren nicht vergessen? - F_CPU richtig verwendet, damit die delay-Zeiten stimmen? - Warnungen vom Compiler ernst genommen? - Kontrast richtig abgeschlossen (siehe Datenblatt)? - Initialisierungsroutine mit dem Datenblatt verglichen, ob evtl. andere Timings angegeben sind? (Kompatibel heisst nicht baugleich)
ich habs jetzt so geändert. // LCD DB4-DB7 <--> PORTD Bit PD0-PD3 #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_DB PD0 // LCD RS <--> PORTD Bit PD4 (RS: 1=Data, 0=Command) #define LCD_RS PD4 // LCD EN <--> PORTD Bit PD5 (EN: 1-Impuls für Daten) #define LCD_EN PD5 zu #define LCD_A_PORT PORTA #define LCD_A_DDR DDRA #define LCD_RS PA1 #define LCD_EN PA0 #define LCD_DATA_PORT PORTD #define LCD_DATA_DDR DDRD #define LCD_DATA_DB PD0 Ist dies gut so?
Renfer schrieb: > zu > > #define LCD_A_PORT PORTA > #define LCD_A_DDR DDRA > #define LCD_RS PA1 > #define LCD_EN PA0 > > #define LCD_DATA_PORT PORTD > #define LCD_DATA_DDR DDRD > #define LCD_DATA_DB PD0 > > Ist dies gut so? Ich hätte das jetzt nicht LCD_A_PORT genannt. Denn dieses #define soll ja letzten Endes regeln, an welchem Port die Control-Leitungen (RS und E) liegen. Das das am A Port ist, ist ein nettes Detail, sollte sich aber IMHO nicht im Namen des #define wiederspiegeln. Genauso wie sich ja in LCD_DATA_PORT auch nicht der konkrete Name des Ports wiederfindet. Was spricht gegen
1 | #define LCD_CTRL_PORT PORTA
|
2 | #define LCD_CTRL_DDR DDRA
|
denn im Code selber, steht dann ja beispielsweise
1 | LCD_CTRL_PORT |= ( 1 << LCD_RS ); |
da steht also im Code, dass am Port an dem die Control Leitungen hängen, die RS Leitung auf 1 geschaltet werden soll. Und das ist ok so. Das sich das alles am Port A abspielt und welches Bit sich hinter RS verbirgt, das soll und will ich an dieser Stelle im Code ja gar nicht wissen. Aber grundsätzlich: Ja, das ist der Anfang der MOdifikation. Jetzt jeißt es den Code durchgehen und die Ausgabeanweisungen entsprechend modifizieren bzw. in Daten und Control Anweisungen zu zerteilen. Denn beispielsweise das hier
1 | void lcd_init( void ) |
2 | {
|
3 | // verwendete Pins auf Ausgang schalten
|
4 | uint8_t pins = (0x0F << LCD_DB) | // 4 Datenleitungen |
5 | (1<<LCD_RS) | // R/S Leitung |
6 | (1<<LCD_EN); // Enable Leitung |
7 | LCD_DDR |= pins; |
kann ja nicht so bleiben. Die Datenleitungen sind ja nicht mehr am selben Port wie die Controlleitungen. Also wird es da auch 2 Zuweisungen an das jeweils richtige DDR Register geben müssen. usw. usw.
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.