PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [erledigt] 4x20 LCD an RN-Control1.4 mit C



pod32
14.12.2009, 10:44
Hallo,


ich habe ein LCD gemäß 4-Bit mit Busy (http://www.rn-wissen.de/index.php/LCD-Modul_am_AVR#AVR-GCC_Programm_2) an Port C angeschlossen.
Das ganze mit WinAVR übertragen:


> "make.exe" program

Compiling C: rn-control.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./rn-control.lst -I. -std=gnu99 -MMD -MP -MF .dep/rn-control.o.d rn-control.c -o rn-control.o

Compiling C: lcd.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./lcd.lst -I. -std=gnu99 -MMD -MP -MF .dep/lcd.o.d lcd.c -o lcd.o

Linking: rn-control.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=rn-control.o -I. -std=gnu99 -MMD -MP -MF .dep/rn-control.elf.d rn-control.o lcd.o --output rn-control.elf -Wl,-Map=rn-control.map,--cref -lm

Creating load file for Flash: rn-control.hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock rn-control.elf rn-control.hex

Creating load file for EEPROM: rn-control.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 --no-change-warnings -O ihex rn-control.elf rn-control.eep || exit 0
avrdude -p atmega32 -P com4 -c stk500v2 -U flash:w:rn-control.hex
avrdude: stk500_2_ReceiveMessage(): timeout

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.04s

avrdude: Device signature = 0x1e9502
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "rn-control.hex"
avrdude: input file rn-control.hex auto detected as Intel Hex
avrdude: writing flash (722 bytes):

Writing | ################################################## | 100% 0.89s

avrdude: 722 bytes of flash written
avrdude: verifying flash memory against rn-control.hex:
avrdude: load data flash data from input file rn-control.hex:
avrdude: input file rn-control.hex auto detected as Intel Hex
avrdude: input file rn-control.hex contains 722 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.48s

avrdude: verifying ...
avrdude: 722 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:22

Ich habe aber das weit verbreitete Problem mit den 2 schwarzen bzw. 2 weißen Balken.
Text bekomme ich nicht auf das Display, egal in welcher Zeile


#include <stdlib.h>
#include <avr/io.h>
#include "lcd.h"
#include "rn-control.h"

int main(void)
{
for(;;){
/* Initialisiere Display, Cursor aus */
lcd_init(LCD_DISP_ON);
/* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
lcd_clrscr();
/* String auf Display anzeigen */
lcd_puts("Hello world.\n");
lcd_puts("testme\n");
}
return 0;
}

Ein Datenblatt von dem Display habe ich allerdings nicht :-#
auf dem Display steht nur was von "JHD 204A".

Wie bekomme ich Text auf das Display?

gruß
pod32

021aet04
14.12.2009, 10:54
Entweder ist die Initialisierung falsch. Was bedeutet lcd_init(LCD_DISP_ON)? Sollte das nicht nur lcd_init() heißen?
Oder das Display ist keines mit HD44780 oder kompatibel

MfG Hannes

oberallgeier
14.12.2009, 11:48
... Wie bekomme ich Text auf das Display ...Hmmm, bei mir steht z.B. dies:


#define LCD_DISP_ON 0x0C /* display on, cursor off */... und Hannes hat ja schon festgestellt, dass das bei Dir nicht da ist. Ausserdem vermisse ich beim schnellen drüberschauen bei Dir die einzubindenden Libraries. Andersrum: wo ist bei Dir die Routine lcd_init, die Du im main aufrufst? NUR Abschreiben des codes funktioniert ja leider nicht immer. Hast Du das in der Anleitung gelesen?

LCD-Modul am AvR[/b] im RN-Wissen]Verwendet wird die lcdlibrary von Peter Fleury.

pod32
14.12.2009, 12:24
die lcd.h ist 'selbstverständlich' eingebunden. O:)
Zu allem Überfluss habe ich auch noch die rn-control.h aus dem Demoprogramm drin, falls ich mal von dort eine Funktion brauche (wird ja weg optimiert).

Die Routine lcd_init steht dann in der lcd.h bzw. lcd.c und das

#define LCD_DISP_ON 0x0C /* display on, cursor off auch.

Der Linker bindet die lcd.o auch ein...

Linking: rn-control.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=rn-control.o -I. -std=gnu99 -MMD -MP -MF .dep/rn-control.elf.d rn-control.o lcd.o --output rn-control.elf -Wl,-Map=rn-control.map,--cref -lm

@Hannes:
Das Display ist zumindest zum HD44780 kompatibel, soviel weiß ich.

edit: habe ein Datenblatt gefunden:
http://www.8051projects.net/e107_files/public/1231066792_13674_FT0_jm204aspec.pdf

edit2:
auf Seite 16, im Flussdiagramm steht, dass man 30ms (bei einer Oszillatorfrequenz von 270kHz) warten muss, bevor man mit dem Initialisieren beginnen kann.
In der lcd.c, in
void lcd_init(uint8_t dispAttr), in Zeile 556,
steht im 4-Bit IO Mode eine Verzögerung von 16ms.
Die Frage ist nun, ob es sich um ein Timing-Problem handelt oder nicht...

pod32
20.12.2009, 16:44
ich habe nun mal auf Verdacht das Display gegen ein neues, baugleiches getauscht -> keine Änderung.

Ich habe auch die von Bascom generierte Intel-HEX (aus dem Wiki-Eintrag) übertragen. Selbes Ergebnis, nur 2 Balken.

Bild 1 (http://img130.imageshack.us/img130/7574/dsc00217d.jpg)Bild 2 (http://img130.imageshack.us/img130/2933/dsc00218ah.jpg)

Dabei leuchtet die LED2,4,6 und 7

Könnte es auch an HF-Einflüssen liegen?
Die Platine unterhalb des Displays ist ein Veroboard (die mit durchgezogenen Leiterbahnen).
Könnte es sein, dass ich mir damit Störungen einfange?

Warum bekomm ich nur nichts auf die Anzeige... :\

P.S. ein Oszi habe ich zur Verfügung...

oberallgeier
20.12.2009, 17:13
Puhhhh - schrecklich ! Brrrrrrrrrrr ! Kannst Du bitte die Bilder kleiner machen? Siehe hier (https://www.roboternetz.de/phpBB2/viewtopic.php?t=1340) - Punkt 11. Mir fällt bei solchen Breitwandbildern immer der Bildschirm mit Übergewicht vom Tisch.

Du hast das LCD am Port C des m32. Dummerweise hatte ich nicht gleich geschaltet: hast Du die JTAG Fuses korrekt gesetzt? Siehe hier (http://www.rn-wissen.de/index.php/Avr#Die_Fusebits) - lesen bei JTAGEN. Das ist ein dämlicher Fallstrick - in dem war ich auch mal gefangen *nochmehrbrrrrrrrrrrrrrr*. Dabei werden beim m32 PC2 bis PC5 vom JTAG "besetzt". Kann es sein, dass Dein Display an einem oder mehreren dieser Pinne hängt?

Viel Erfolg

pod32
20.12.2009, 17:28
JTAG habe ich disabled, es werden von PORTC der Pin 1 bis 7 genutzt.
Ich habe alles so angeschlossen, wie im Wiki beschrieben:
http://www.rn-wissen.de/index.php/LCD-Modul_am_AVR#4-Bit_Ansteuerung_mit_Busy.28I.2FO_Mode.29

Screenshot der ausgelesenen FUSES mit AVR-Studio:
http://img707.imageshack.us/img707/8382/fuses.png

echt seltsam das Ganze :-k

oberallgeier
20.12.2009, 17:40
Danke für die geänderte Bilderpräsentation.


JTAG habe ich disabled, es werden von PORTC der Pin 1 bis 7 genutzt. ...
Ich lese mal in der Beschreibung der RNControl:

... Durch entfernen des Motortreiber IC´s aus der Fassung, steht PC6 und PC7 zur freien Verfügung ...Diese Ports hängen an zwei "IN"s des L293D. Ich habe aber keine Ahnung, was das ausmacht (bin auch im Moment zu faul, das zu testen - da müsste ich mein LCD umlöten . . . .).

Ich gehe mal jetzt davon aus (sorry, steht vielleicht auch hier irgendwo im Thread) dass der Port korrekt initialisiert ist. Das sollte ja durch die Library gut erfolgen. Wenn nicht irgendwann "hinterher" etwas anderes geschrieben steht.

pod32
20.12.2009, 17:58
Danke für das Vorlesen aus der Beschreibung *nochnochmehrbrrrr* ;)
Ich habe das L293D entfernt und zur Sicherheit nochmal neu geflashed.
Immer noch nur 2 Balken.

hier meine main:


#include <stdlib.h>
#include <avr/io.h>
#include "lcd.h"
#include "rn-control.h"


/*### Hauptschleife ###*/
int main(void)
{
for(;;){
/* Initialisiere Display, Cursor aus */
waitms(30);
lcd_init(LCD_DISP_ON);
/* loesche das LCD Display und Cursor auf 1 Zeile, 1 Spalte */
waitms(20);
lcd_clrscr();
/* String auf Display anzeigen */
waitms(30);
lcd_puts("Hello world.\n");
lcd_puts("testme\n");
lcd_puts("testme\n");
lcd_puts("testme\n");
}
return 0;
}

Den I2C nutze ich (wie zu sehen ist) auch nicht.

oberallgeier
20.12.2009, 18:03
Hmmm, ich muss wohl doch mein RNControl auspacken und das LCD umlöten. Wie wärs, wenn Du nach den einzelnen lcd_puts(irgendwas) immer wieder ein waitms (1000) einfügst? Ausserdem würde ich (so als totaler C(äh)-Nobody die for-Schleife erst nach dem lcd_init anfangen lassen.

Meine Rat(losigkeits)schläge sind wie immer ohne jede Garantie.

pod32
20.12.2009, 19:05
leider hilft das auch nicht.
Hier mal mein komplettes WinAVR Projekt:
http://www.dateiupload.net/download.php?id=BA997A021

oberallgeier
21.12.2009, 00:22
leider hilft das auch nicht ...Vermutlich wird diese LETZTE HILFE etwas bringen. Der Portstecker an der RNControl ist total be..oppt - ähhhhh - verwirrungstiftend bezeichnet. PIN0 von PortC - also PC0 geht nämlich an den Portstecker-Pin 1 - und so weiter.

mws-h
21.12.2009, 06:47
Was ist daran bekloppt? Die Pins der Stecker beginnen bei der Zählung nun mal bei 1 und die Ports bei 0. Wie will man das sonst machen?

pod32
21.12.2009, 07:37
Ohh - das wird mein Fehler sein! ](*,)
Ich habe es bisher so angeschlossen, dass der "PC1" auf Pin1 usw. liegt.
Unten das entsprechende Code-Snippet:

/**
* @name Definitions for 4-bit IO mode
* Change LCD_PORT if you want to use a different port for the LCD pins.
*
* The four LCD data lines and the three control lines RS, RW, E can be on the
* same port or on different ports.
* Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on
* different ports.
*
* Normally the four data lines should be mapped to bit 0..3 on one port, but it
* is possible to connect these data lines in different order or even on different
* ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.
*
*/
#define LCD_PORT PORTC /**< port for the LCD lines */
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN 4 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 5 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 6 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 7 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 3 /**< pin for RS line */
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 2 /**< pin for RW line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 1 /**< pin for Enable line */

Ich werde es heute Abend mal testen - Danke!
Sollte ich es tatsächlich verwechselt haben, reicht es doch aus, es in der lcd.h jeden Pin um 1 zu erniedrigen. Oder?

oberallgeier
21.12.2009, 15:24
... Ich werde es heute Abend mal testen ...Hoffentlich war es das. Ich jedenfalls hatte mich da vertan. Aber ich weiß jetzt eindeutig, dass das LCD läuft, meins jedenfalls, auch wenn der L293D eingesetzt ist und auch wenn der DIL-Schalter die LEDs an den PortC koppelt. Da blinkt es weihnachtlich, wenn das LCD neu getextet wird.


... Sollte ich es tatsächlich verwechselt haben, reicht es ... in der lcd.h jeden Pin um 1 zu erniedrigen Hmmm. Das verstehe ich nicht eindeutig. Ich habe das jedenfalls so verdrahtet wie hier im Auszug aus meinem Code - mit einem Zwischenstecker an meinem Steckbrett, der mir Lötarbeit erspart hat. Ich habe aber möglicherweise eine geringfügig andere lcd*.h.


/* ================================================== ==============================
Controller | PortC
Mehrfachstecker an meinem Breadboard | RNControl-Stecker C
- - - - - - - - - - - - - - - - - v - - - v - - - v - - - - - - - -
LCD 24x2, pin for RS line 1 C3 = RN-C4
LCD 24x2, pin for RW line 2 C2 = RN-C3
LCD 24x2, pin for ENABLE line 3 C1 = RN-C2
GND 4 RN-C9
-
VCC 6 RN-C10
-
LCD 24x2, pin for 4bit data bit 0 8 C4 = RN-C5
LCD 24x2, pin for 4bit data bit 1 9 C5 = RN-C6
LCD 24x2, pin for 4bit data bit 2 10 C6 = RN-C7
LCD 24x2, pin for 4bit data bit 3 11 C7 = RN-C8 */
/* ================================================== ============================ */
Viel Erfolg

pod32
21.12.2009, 20:37
\:D/ Es funktioniert! \:D/

Fazit: Mit der Pin<->Portzuordnung an PortC höllisch aufpassen!


Vielen Dank! Insbesondere @ oberallgeier

Schöne Feiertage