Forum: Compiler & IDEs LCD Ansteuerung Atmel ATxmeag 128 A3


von Johannes L. (megatron)


Lesenswert?

Hi,

erstmal möchte ich mich bedanken für das tolle Tutorial. Ich habe sehr 
viel erfahren bezüglich der Display Ansteuerung.

Ich habe Erfahrungen im Bereich ADCs und DACs. Habe viele Messaufgaben 
mittels Xmega Controller realisiert.

Nun möchte ich aber auch mal ein Display ansteuern. Ein HD 44780 20x4 
habe ich gekauft. Im Tutorial befinden sich eine LCD Routine. Leider 
läuft diese Routine nicht trotz umschreiben der Datei.

Folgende Signale verwende ich:

1: RS            PORTD.OUT
2: EN
3: R/W -- GND

4:  D0           PORTC.OUT
5:  D1
6:  D3
7:  D4
8:  D5
9:  D6
10: D7

leider bezieht sich das Tutorial auf nur einen PORT. Die Befehlstruktur 
weicht etwas ab, da ich einen Atmel ATxmega 128 A3 verwende und keinen 
Atmega.

Vielleicht hat von euch schonmal jemand ein Display mit so einem 
Controller in Betrieb genommen.

Danke im Voraus.

von XMEGA (Gast)


Lesenswert?

Hallo,

Johannes Losch schrieb:
> Vielleicht hat von euch schonmal jemand ein Display mit so einem
> Controller in Betrieb genommen.

schau mal hier:

http://blog.frankvh.com/2010/10/18/atmel-xmega-hd44780-lcd-support/

Ein Display für 5 Volt ist für den Atxmega nur bedingt geeignet.

Das Anpassen der 3,3 V nach 5 Volt und umgekehrt ist zuviel Aufwand.

Schau dir mal das Display an: http://www.basteln-mit-avr.de/

kostet bei Reichelt ca. 13 Euro


Gruß XMEGA

von Johannes L. (megatron)


Lesenswert?

Hi,

es stimmt das der Atxmega nur 3,3 Volt besitzt, jedoch nutze ich ein 
kleines Modul von Chip 45:

http://www.chip45.com/AVR-Xmega-Mikrocontroller-Module/CrumbX128A3-V1-2-AVR-ATxmega128A3-USB-RS485-Mikro-SD-Karte-Modul.html?XTCsid=80369902503f4fd5ef7476b6be3a2f5c

Ich habe auf diesem Modul ein USB Spannungsabgriff von 5 Volt. Die Frage 
ist, ob die jeweiligen High Pegel also 3,3 Volt vom Display auch als 
High erkannt werden. Laut Datenblatt ist die Schwelle bei 0,75*VCC, das 
würde bedeuten ich müsste mir dein Display Vorschlag mal anschauen. Es 
kann sein das ich den Xmega beschädige, da das Display den Controller 
hoch treibt (siehe Link)

http://blog.frankvh.com/2010/10/18/atmel-xmega-hd44780-lcd-support/

Was meinst du ?

Viele Grüße

von XMEGA DOGM 162 (Gast)


Lesenswert?

In dem Beispiel

Johannes Losch schrieb:
> (siehe Link)
> http://blog.frankvh.com/2010/10/18/atmel-xmega-hd4...

wird ausschließlich auf das Display geschrieben. 3,3V werden 
normalerweise als Logik 1 erkannt. Das sollte so gehen (für Versuche) 
ist natürlich nicht für was entgültiges geeignet.
Die Alternative ist ein DOGM162 (oder ähnliches) das mit nur 3,3 Volt 
Betriebsspannung auskommt, besitzt aber einen anderen Controller (mit 
anderer Initialsierung) und wird mit dem Code nicht 1:1 laufen.

von Johannes L (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe versucht den Code an meine Pin Konfiguration anzupassen und 
sofort habe ich es geschafft das Display zu löschen, also alle schwarzen 
Kästchen/Balken zu löschen.

Leider verstehe ich die Funktion PSTR nicht. Ich habe versuch die 
Funktion einzubinden jedoch bekomme ich einen Fehler


///////////////////// CODE ////////////////////////////////////

#include <lcd_routines2.h>
#include <avr/pgmspace.h>

#define PROGMEM     _ATTR_PROGMEM_
#define PSTR     (s) ((const PROGMEM char*)(s))

// Snippet 3
// display "Hello World" on LCD first line
lcd_line_one();
lcd_write_string_p(PSTR("Hello World\0"));  // message from flash space

///////////////////////////////////////////////////////////////

siehe Link

http://www.stmental.net/~dfoster/avr-libc-user-manual-1.6.5/group__avr__pgmspace.html#g05ca900ebf7cd121be73c654d9ccb3eb


In Anhang befindet sich der Code

Vielen Dank für die Hilfe, bei Erfolg kommt sofort ein Bild :)

von Peter D. (peda)


Lesenswert?

Johannes L schrieb:
> Ich habe versuch die
> Funktion einzubinden jedoch bekomme ich einen Fehler

Und der wäre ???

Johannes L schrieb:
> In Anhang befindet sich der Code

Nö.
Code heißt *.c


Peter

von Johannes L (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

sorry ich war etwas zu schnell, bitte um entschuldigung.


Ich habe den Source-Code von der  Seite http://blog.frankvh.com 
verwendet. Das Display konnte ich ansprechen und die schwarzen Rechtecke 
erfolgreich löschen, jedoch scheitere ich bei folgendem Code Ausschnitt:

// Snippet 3
// display "Hello World" on LCD first line
lcd_line_one();
lcd_write_string_p(PSTR("Hello World\0"));  / message from flash space


Quelle:
http://blog.frankvh.com/2010/10/18/atmel-xmega-hd44780-lcd-support/


Meine Einbindung (vielleicht auch falsch):

#define PSTR   (s) ((const PROGMEM char*)(s))

Quelle:

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga05ca900ebf7cd121be73c654d9ccb3eb

leider bin ich mir aber nicht sicher, ob es daran liegt.

Ich sende die .c im Anhang mal mit.



Vielen Dank ich freue mich sehr über Ihre Hilfe, leider habe ich erst 
wenig Erfahrung.

Fehlerbeschreibung:

Build started 13.5.2011 at 13:43:58
avr-gcc  -mmcu=atxmega128a3 -Wall -gdwarf-2 -Os -std=gnu99 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP 
-MT LCD_Display_3.o -MF dep/LCD_Display_3.o.d  -c  ../LCD_Display_3.c
In file included from ../LCD_Display_3.c:26:
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:85:3: warning: 
#warning "F_CPU not defined for <util/delay.h>"
../LCD_Display_3.c:32:1: warning: "PSTR" redefined
In file included from ../LCD_Display_3.c:29:
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:249:1: 
warning: this is the location of the previous definition
../LCD_Display_3.c: In function 'main':
../LCD_Display_3.c:38: warning: implicit declaration of function 
'clock_init'
../LCD_Display_3.c:64: error: 's' undeclared (first use in this 
function)
../LCD_Display_3.c:64: error: (Each undeclared identifier is reported 
only once
../LCD_Display_3.c:64: error: for each function it appears in.)
../LCD_Display_3.c: At top level:
../LCD_Display_3.c:97: warning: conflicting types for 'clock_init'
../LCD_Display_3.c:38: warning: previous implicit declaration of 
'clock_init' was here
make: *** [LCD_Display_3.o] Error 1
Build failed with 3 errors and 6 warnings...

von XMEGA (Gast)


Lesenswert?

Hallo,

Johannes L schrieb:
> leider bin ich mir aber nicht sicher, ob es daran liegt.

> #define PSTR     (s) ((const PROGMEM char*)(s))
ist bereits in der avr/pgmspace.h definiert. Also weglassen.


Oder probier es mal mit der printf() Anweisung:
Folgender Abschnitt ist auf printf() programmiert.


//****** Deine C-Programm..

// vor delay.h oder im make-file  definieren

#define F_CPU 32000000UL    // oder deine Taktrate


#include <util/delay.h>
#include <math.h>
#include <stdio.h>
#include <avr/io.h>
#include <Seriell.h>
#include <dac_adc.h>
#include <lcd_routines2.h>
#include <avr/pgmspace.h>


#define Kontrast 100 // Kontrasteinstellung

int lcd_putchar(char c, FILE *stream);      // Stream einbinden

static FILE mystdout = FDEV_SETUP_STREAM(dogm_putchar, NULL, 
_FDEV_SETUP_WRITE);  // bindet printf() ein



int main (void) {

stdout = &mystdout; // bindet printf() ein



// Code ...

lcd_line_one();
printf(" alles ok ");

//...usw.
return (0);
} // Ende main


int lcd_putchar(char c, FILE *stream) // // bindet printf() ein
{
lcd_write_char(c); //LIB LCD
return 0;
}






Gruß XMEGA

von Johannes L (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe mal versucht deinen Code einzubinden, jedoch erhalte ich 6 
Fehler:

Build started 13.5.2011 at 15:47:55
avr-gcc  -mmcu=atxmega128a3 -Wall -gdwarf-2 -Os -std=gnu99 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP 
-MT LCD_Display_3.o -MF dep/LCD_Display_3.o.d  -c  ../LCD_Display_3.c
../LCD_Display_3.c:34: error: expected declaration specifiers or '...' 
before 'FILE'
../LCD_Display_3.c:36: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'mystdout'
../LCD_Display_3.c: In function 'main':
../LCD_Display_3.c:47: error: 'stdout' undeclared (first use in this 
function)
../LCD_Display_3.c:47: error: (Each undeclared identifier is reported 
only once
../LCD_Display_3.c:47: error: for each function it appears in.)
../LCD_Display_3.c:47: error: 'mystdout' undeclared (first use in this 
function)
../LCD_Display_3.c:49: warning: implicit declaration of function 
'clock_init'
../LCD_Display_3.c:72: warning: implicit declaration of function 
'printf'
../LCD_Display_3.c:72: warning: incompatible implicit declaration of 
built-in function 'printf'
../LCD_Display_3.c: At top level:
../LCD_Display_3.c:107: warning: conflicting types for 'clock_init'
../LCD_Display_3.c:49: warning: previous implicit declaration of 
'clock_init' was here
make: *** [LCD_Display_3.o] Error 1
Build failed with 6 errors and 5 warnings...





Ich habe nochmal den veränderten Code angehängt.

Vielen Dank für deine Hilfe

von XMEGA (Gast)


Lesenswert?

Hallo,

Johannes L schrieb:
> uild failed with 6 errors and 5 warnings...

da hab ich noch einen kleinen Fehler eingebaut:


static FILE mystdout = FDEV_SETUP_STREAM(dogm_putchar, NULL,

muss so heißen:


static FILE mystdout = FDEV_SETUP_STREAM(lcd_putchar, NULL,

Bitte nochmals testen!

Gruß Xmega

von XMEGA (Gast)


Lesenswert?

Hallo,

die Function brauchst duauch!

int lcd_putchar(char c, FILE *stream) // // bindet printf() ein
{
lcd_write_char(c); //LIB LCD
return 0;
}



Gruß XMEGA

von Johannes L (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

erstmal vielen Dank für deine Hilfe.

Ich habe die Änderungen vorgenommen, leider ohne Erfolg.

Die Funktion:

int lcd_putchar(char c, FILE *stream) // // bindet printf() ein
{
lcd_write_char(c); //LIB LCD
return 0;
}

habe ich versucht in der LCD_Display.c einzubinden, jedoch entstehen 
wieder 7 Fehler.

Schau mal mein Code ist im Anhang

Ciao

Schönen WE

von Johannes L (Gast)


Lesenswert?

Hey,

habe nur noch einen Fehler:


../LCD_Display_31.c:142: error: expected declaration specifiers or '...' 
before 'FILE'



ich habe keine <stdio.h> eingebunden daher die Fehler. Ohne die Include 
kann kein stdout etc. verwendet werden.

Hoffe es klappt bald !!!

Grüße Johannes

von Johannes L (Gast)


Lesenswert?

Hi ich bins nochmal,

habe nochmal drüber geschaut und nun den Fehler behoben.

Habe nur noch ein Problem:

C:\Dokumente und Einstellungen\user\Eigene 
Dateien\default/../LCD_Display_3.c:115: undefined reference to 
`lcd_write_char'

keine Definition für lcd_write_char ???

Grüße Johannes

von XMEGA (Gast)


Lesenswert?

Hallo,

das war noch ein Teil meines Codes.

Du musst die Funktion aus deinem Code nehmen.

lcd_write_data

also:


int lcd_putchar(char c, FILE *stream) // // bindet printf() ein
{
lcd_write_data(c); //LIB LCD
return 0;
}

Sorry..

Gruß XMEGA

von Johannes L (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

habe alles versucht, leider ohne Erfolg.

Ich bekomme keine Fehler sehe aber leider auch keinen Erfolg beim 
Display.
Alle schwarzen Kästchen sind zwar gelöscht aber schreiben kann ich nix 
aufs Display.

Codeausschnitt:


// Snippet 1
//Initialise the LCD Display
  lcd_init();


// Snippet 2
// clear display
  lcd_clear_and_home();

//lcd_write_string("Hello World");
//////////////////  PRINTF  //////////////////////////////////
  lcd_line_one();
  printf("alles ok");

Funktion:


int lcd_putchar(char c, FILE *stream) // // bindet printf() ein
{
lcd_write_data(c); //LIB LCD
return 0;
}


Ich habe deinen Rat befolgt und mir ein DOGM Display bestellt. Laut 
Datenblatt wird ein High Pegel bei 0,75*VCC erkannt also 0,75 * 5 Volt = 
3,75V und mein Atxmega hat einen High Pegel von 3,3 Volt.

Ich habe nochmal meinen Code beigefügt, falls du nochmal drüberschauen 
willst. Ich habe auf einen kleinen Erfolg gehofft, aber was will man 
machen :-)

Danke für deine Hilfe

von XMEGA (Gast)


Lesenswert?

Hallo,

schade..


Johannes L schrieb:
> Ich habe nochmal meinen Code beigefügt, falls du nochmal drüberschauen
> willst.

Sehe im ersten Moment keinen Fehler mehr. Hardware ist in Ordnung?

Hast du den CPU Takt mal verringert?

Wie wär es  mit 16 oder 8 Mhz. Bei 32 Mhz stößt man schnell an die 
Grenze
des Machbaren (Peripherie).

Eleganter ist aber ein DOGS102 oder DOGM128. Zum testen ist das DOGS102 
die bessere Lösung, da die Hardware sprich die Menge der benötigten 
Kondensatoren deutlich geringer ist.

Gruß XMEGA

von Johannes L (Gast)


Lesenswert?

Hi,

ich habe die CPU eingestellt auf 8 MHZ.

Ich verwende auch einen 8Mhz Quarz. Ich friere erstmal das HD44780 
Projekt ein, da ich heute Post bekommen habe :-)

Ich habe heute folgende Displays erhalten:

EA DOGM 132S-5
EA DOGL 128B-6

Im ersten Moment habe ich mich gewundert, wo der Controller sitzt ?

Ich habe, wie schon erwähnt, wenig Vorkenntnis im Bereich der 
Displaytechnik.

Im folgenden Forum habe ich etwas gefunden:

http://basteln-mit-avr.de/atxmega128a3.html

ich besitze einen Atxmega128a3 und hoffe mit Hilfe der Software die 
Displays zum laufen zu bringen.

Es scheint trotzdem so als benötige ich noch einen Aufsatz bzw. ein 
Steckboard, wo die Displays drauf müssten. In Internet sehe ich diverse 
Display Boards mit vielen Kapazitäten ???

Ich hoffe es geht auch erstmal ohne

Ciao

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.