Hallo again,
langsam bin ich am verzweifeln. Ich möchte endlich ein Erfolgserlebnis
bezüglich LCD haben und bekomme es nicht (seit Monaten!)...
Ich habe auch schon bereits im Forum bei ulrichradig.de geschrieben
leider aber noch keine Antwort erhalten und erhoffe mir daher hier
eine...
Also:
Ich habe ein LCD 16x2 von Reichelt (HD44780 kompatibel), Best.nr.
LCD162C LED. Dann habe ich einen ATmega32. Der ATmega32 wird ganz nach
Vorlage mit Betriebsspannung versorgt usw.
Auf dem uC ist ein Programm für eine Uhr, das läuft auch soweit. Für das
LCD nehme ich die Vorlage von ulrichradig.de (hier zu finden:
http://www.ulrichradig.de/home/uploads/File/AVR_LCD/lcd_display.zip).
Angeschlossen habe ich das Display an PortA und zwar so:
ATmega32 LCD
40 - PA0 11 - D4
39 - PA1 12 - D5
38 - PA2 13 - D6
37 - PA3 14 - D7
36 - PA4 4 - RS
35 - PA5 5 - RW
34 - PA6 6 - E
Das LCD bekommt noch Vcc, GND, Kontrast und Backlight.
Im Quellcode in der lcd.h habe ich u.a. das hier stehen:
1 | ...
|
2 | //Prototypes
|
3 | extern void lcd_write (char,char);
|
4 | extern char lcd_read (char);
|
5 | extern void lcd_init (void);
|
6 | extern void lcd_clear (void);
|
7 | extern void lcd_print_P (unsigned char,unsigned char,const char *Buffer,...);
|
8 | extern void lcd_print_str (char *Buffer);
|
9 | #define lcd_print(a,b,format, args...) lcd_print_P(a,b,PSTR(format) , ## args)
|
10 |
|
11 | //LCD_D0 - LCD_D3 connect to GND
|
12 | //Im 4Bit Mode LCD_D4-->PORTx.0 ........ LCD_D7-->PORTx.3
|
13 | //LCD_RS --> PORTx.4 | LCD_RW --> PORTx.5 | LCD_E --> PORTx.6 | PORTx.7-->NotConnect
|
14 |
|
15 | //Anzahl der Zeilen 1,2 oder 4
|
16 | //#define ONE_LINES
|
17 | #define TWO_LINES
|
18 | //#define THREE_LINES
|
19 | //#define FOUR_LINES
|
20 |
|
21 | #define LCD_Port_DDR DDRA //Port an dem das Display angeschlossen wurde
|
22 | #define LCD_Port_Write PORTA
|
23 | #define LCD_Port_Read PINA
|
24 |
|
25 | #define LCD_RS 4 //Pin für RS
|
26 | #define LCD_RW 5 //Pin für Read/Write
|
27 | #define LCD_E 6 //Pin für Enable
|
28 | #define LCD_LED 7 //Pin für Hintergrund LED
|
29 |
|
30 | #define LCD_DataOutput 0x0f
|
31 | #define LCD_DataInput 0x00
|
32 |
|
33 | #define BUSYBIT 7
|
34 |
|
35 | #define NOP() asm("nop")
|
36 | #define WAIT() for (unsigned char b=0;b<200;b++){NOP();}
|
37 | ...
|
Sollte doch so richtig sein, oder? Programmiert habe ich den Atmega32
mit dem STK500, JTAG ist aus, die Fuses sind richtig, auch die Uhrdaten
kommen vom uC auf der RS232 raus, so dass der läuft. Auf meiner
Streifenrasterplatine wo dann der uC drauf kommt und auch das LCD alle
Signale und Pegel bekommt sollte auch alles stimmen (x-mal
kontrolliert). Da kann ich mit dem Oszi auch die Seriellen Daten an TXD
bzw. RXD sehen und auch aus den Pins von PortA kommen Bits die auch
gleich an der Stiftleiste des LCD ankommen.
Trotzdem sehe ich nach dem Einschalten der Spannung nur in der ersten
Zeile des LCD ################ und sonst tut sich nichts.
In meiner main.c sind natürlich auch u.a. drin
1 | lcd_init();
|
2 | lcd_clear();
|
so dass ja eigentlich die ### weggehen sollten, aber auch dann werden ja
die Uhrzeitdaten aufs Display mit
1 | lcd_print(0,0,"%2i.%2i.%4i RX: %i",day,mon,year,flags.dcf_rx);
|
2 | lcd_print(1,0,"%2i:%2i:%2i SYNC: %i",hh,mm,ss,flags.dcf_sync);
|
geschrieben.
Was mache ich nur falsch? Und was hat in der lcd.h u.a. die Zeile
#define LCD_DataOutput 0x0f mir zu sagen? Ist da evt. mein Fehler?
Bitte helft mir, das mit dem LCD kann doch nicht so verflixt schwer
sein?
Danke!
Grüße Pascal