Forum: Platinen Suche Bibliothek / Library: LCD für ATXMEGA


von Matthias F. (frank91)


Lesenswert?

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

von Rene H. (Gast)


Lesenswert?

Hallo Matthias,

vielleicht hilft Dir das weiter:

Beitrag "Re: Display DIP204-4"

Grüsse,
René

von Karl H. (kbuchegg)


Lesenswert?

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.

von Matthias F. (frank91)


Lesenswert?

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  */

von Karl H. (kbuchegg)


Lesenswert?

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
von Matthias F. (frank91)


Lesenswert?

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
von Matthias F. (frank91)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
von Matthias F. (frank91)


Lesenswert?

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.

von Matthias F. (frank91)


Lesenswert?

irgendwie geht das nicht....

Das Display zeigt nichts an...

Hat keiner eine bereits umgeschriebene Library?

von Gerhard G. (g_g)


Lesenswert?

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.

von Gerhard G. (g_g)


Lesenswert?

Hallo,

habe die Lib hier eingestellt:

http://www.basteln-mit-avr.de/atxmega128a3.html#EADOGM204A

Gruß G.G.

von Matthias Frank (Gast)


Angehängte Dateien:

Lesenswert?

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

von ne (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.