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.
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
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
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.
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 :)
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
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...
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
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
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
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
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
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.