Hi Ich habe mir bei reichelt folgendes LCD zum Hobbybasteln bestellt: http://www.reichelt.de/LCD-Module-DIP-Anschluss/EA-DIP203G-4/3//index.html?ACTION=3&GROUPID=3009&ARTICLE=129611&OFFSET=500&&SID=11U5AWlX8AAAIAAD41RiE734b8aec839358e635d6f3693d48261c&CTYPE=0&MWSTFREE=0 Ich bin jetzt schon seit längerem auf der Suche nach einer Library für LCDs für meinen ATXMEGA128A1U. Gute wäre wenn man in dieser für jeden einzelnen Pin auch den jeweiligen Port angeben könnte, so wie es in der Library von Peter Fleury funktioniert. Besitzt jemand so eine Library oder weiß wo eine solche zu finden ist? Ich hab jetzt schon eine Weile gegoogelt, leider ohne Erfolg. Allerdings kann ich mir nicht vorstellen, dass es so eine Library noch nicht gibt :-P
Matthias Frank schrieb: > Ich bin jetzt schon seit längerem auf der Suche nach einer Library für > LCDs für meinen ATXMEGA128A1U. Gute wäre wenn man in dieser für jeden > einzelnen Pin auch den jeweiligen Port angeben könnte, so wie es in der > Library von Peter Fleury funktioniert. Ich seh jetzt keinen Grund, warum die Fleury Lib da nicht auch grundsätzlich funktionieren sollte. > Ich hab jetzt schon eine Weile gegoogelt, leider ohne Erfolg. In der Zeit hättest du wahrscheinlich auch den Fleury Code schon 5 mal durchgehen können und die 3 Stellen, an denen die Hardware Zugriffe erfolgen, an die Bedürfnisse des XMega anpassen können.
Danke schonmal. Die Bibliothek umschreiben wäre natürlich das einfachste :P Dass ich statt: #define LCD_PORT PORTBA /**< port for the LCD lines */ Das hier schreiben muss ist mir klar: #define LCD_PORT PORTA.OUT /**< port for the LCD lines */ Aber wie ändere ich folgende 2 defines ab, so dass stattdessen z.B. PORTA.DIR und PORTB.IN gemeint ist und ? #define DDR(x) (*(&x - 1)) /* address of data direction register of port x */ #define PIN(x) (*(&x - 2)) /* address of input register of port x */
Keine AHnung wie die Adressverteilung der einzelnen Register beim XMEGA ist. Im schlimmsten Fall machst du eben nicht einfach nur ein
1 | #define LCD_PORT .....
|
sondern ein
1 | #define LCD_PORT ....
|
2 | #define LCD_DDR ....
|
3 | #define LCD_PIN ....
|
mit den entsprechenden Angaben für den XMega und änderst die verwendenden Stellen entsprechend ab. Da du die Makros DDR bzw. PIN aus dem Code rauswirfst, wird dir der Compiler mitteilen, wo dies notwendig ist. Die Idee hinter den Makros DDR bzw. PIN ist es einfach nur, sich die 3-fach Angabe
1 | #define LCD_PORT PORTB
|
2 | #define LCD_DDR DDRB
|
3 | #define LCD_PIN PINB
|
zu sparen, da sich DDRB bzw. PINB aus PORTB und dem Wissen der Adresslage der Register errechnen lassen. Das bringt einen gewissen Komforteffekt und ist auch der Fehlersicherheit zuträglich, weil es hier so nicht mehr möglich ist. nicht zusammenpassende ANgaben, wie zb
1 | #define LCD_PORT PORTB
|
2 | #define LCD_DDR DDRA
|
3 | #define LCD_PIN PINC
|
zu machen. Aber zwingend erforderlich ist es nicht Im schlimmsten Fall kann man immer noch auf die 3 Einzelangaben ausweichen.
:
Bearbeitet durch User
Ich hab die Library jetzt wie folgt geändert: Dies habe ich zusätzlich eingefügt
1 | #define set_bit(ADDRESS,BIT) ADDRESS |= (1<<BIT) // set Bit
|
2 | #define clear_bit(ADDRESS,BIT) ADDRESS &= ~(1<<BIT)// clear Bit
|
3 | #define invert_bit(ADDRESS,BIT) ADDRESS ^= (1<<BIT) // Bit umschalten
|
4 | #define BitIsSet(ADRESS,BIT) (ADRESS & (1<<BIT)) // Überprüft ob ein Bit gesetzt ist
|
5 | #define BitIsClr(ADRESS,BIT) (!(ADRESS & (1<<BIT)))// Überprüft ob ein Bit gelöscht ist
|
Für jeden Pin habe ich diese Defines erstellt:
1 | #define LCD_PORT PORTB /**< port for the LCD lines */ |
2 | |
3 | #define LCD_DATA0_PORT LCD_PORT.OUT /**< port for 4bit data bit 0 */ |
4 | #define LCD_DATA0_DDR LCD_PORT.DIR
|
5 | #define LCD_DATA0_PIN_IN LCD_PORT.IN
|
6 | #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ |
Hier einige Ausschnitte, was ich sonst noch verändert habe: (Auskommentiertes waren die ursprünglichen Zeilen)
1 | //DDR(LCD_RS_PORT) |= _BV(LCD_RS_PIN);
|
2 | set_bit(LCD_RS_DDR, LCD_RS_PIN); |
1 | //DDR(LCD_DATA0_PORT) |= 0x0F;
|
2 | LCD_DATA0_DDR |= 0x0F; |
1 | //data |= PIN(LCD_DATA0_PORT)&0x0F; /* read low nibble */
|
2 | data |= LCD_DATA0_PIN_IN &0x0F; |
1 | //if ( PIN(LCD_DATA0_PORT) & _BV(LCD_DATA0_PIN) ) data |= 0x10;
|
2 | if (BitIsSet(LCD_DATA0_PIN_IN, LCD_DATA0_PIN)) data |= 0x10; |
Das müsste von der Theorie doch Funktionieren oder? Allerdings hab ich noch ein Problem. Zuerst hatte ich DDR() komplett aus meinem Programm genommen. Beim Übersetzen hatte ich keine Fehlermeldung. Seitdem ich aber Pin() auskommentiert habe und die Befehle ersetzt habe kommt folgende Meldung:
1 | called object is not a function or function pointer |
Damit ist folgende Zeile gemeint:
1 | #define LCD_PORT PORTB /**< port for the LCD lines */ |
ich versteh sein Problem nicht.... Von der Theorie hab müsste es doch so gehen.
:
Bearbeitet durch User
Ich hab an einer Stelle den Strichpunkt vergessen xD Jetzt kommt keine Fehlermeldung mehr. Ich werd das ganze die nächsten paar Tage sobald das Display da ist mal testen :P Danke dir
Matthias Frank schrieb: > Seitdem ich aber Pin() auskommentiert habe und die Befehle ersetzt habe > kommt folgende Meldung: >
1 | > called object is not a function or function pointer |
2 | > |
> Damit ist folgende Zeile gemeint: >
1 | > #define LCD_PORT PORTB /**< port for the LCD lines */ |
2 | >
|
> ich versteh sein Problem nicht.... Von der Theorie hab müsste es doch so > gehen. DIe kann nicht gemeint sein. Das da ist eine Präprozessor-Definition. Also die Vereinbarung, welcher Text durch welchen anderen Text im Source Code zu ersetzen ist, ehe sich dann der Compiler diesen modifizierten Source Code zu Gemüte führt. Da kann ich auch schreiben
1 | #define LCD_PORT schnurdibur
|
und es interessiert keinen. Erst in der Verwendung im Source Code, also zb hier
1 | int main() |
2 | {
|
3 | LCD_PORT |= 0x20; |
4 | }
|
findet dann die Textersetzung statt. Der Präprozessor ersetzt 'LCD_PORT' durch 'schnurdibur' und es ergibt sich
1 | int main() |
2 | {
|
3 | schnurdibur |= 0x20; |
4 | }
|
und wenn ich nicht zufällig eine Variable dieses Namens habe, dann ist das nun mal ein Syntax-Error. Bei Makros musst du IMMER die Stelle untersuchen, an der das Makro benutzt wird! Dort machst du dir Textersetzung und siehst dir an, was nach der Textersetzung übrig bleibt. Aber erst mal ist es dem Präprozessor völlig egal, was du als Textersetzung angibst. Und wenn du
1 | #define asuifhibf viunbeaviunq
|
schreibst, ist ihm das auch wurscht. Er merkt sich, dass du in weiterer Folge das Wort 'asuifhibf' durch das Wort 'viunbeaviunq' ersetzt haben willst. Warum auch immer, das ist dem Präprozessor völlig egal. Er macht sich einen Eintrag in seine Ersetzungstabellen und damit hat sich für ihn die Sache.
:
Bearbeitet durch User
ja danke. Hast wieder recht :P Der Strichpunkt hat in einer Zeile gefehlt bevor das Makro verwendet wird. Ich werd sobald ich das Display habe schreiben ob es geklappt hat und die veränderte Library (falls alles funktioniert) für andere User hochladen.
irgendwie geht das nicht.... Das Display zeigt nichts an... Hat keiner eine bereits umgeschriebene Library?
Hallo, habe für das EA DOGM204W-A (SSD1803a Kontroller) folgenden Code: - seriell (SPI) -> Atxmega.. - 8 Bit parallel -> Atxmega.. Funktioniert auch für das EA-DIP203(SSD1803 Kontroller) was brauchst du: seriell oder parallel? Gruß G.G.
Hallo, habe die Lib hier eingestellt: http://www.basteln-mit-avr.de/atxmega128a3.html#EADOGM204A Gruß G.G.
Hi danke für deine Library :P Ich hab deine Nachricht leider zu spät gelesen und gestern abend versucht selber eine Library mit 4-Bit zu schreiben. Da diese inzwischen funktioniert lade ich sie hier öffentlich hoch. Ich werd deine Library über SPI aber auch mal die nächsten paar Tage anschauen. Danke nochmal. Gruß Matthias
Haben Sie vielleicht code fuer lcd fuer xmega? waere es nett wenn Sie geben koennen
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.