Hallo Zusammen, ich habe ein Problem mit einem LCD DOTMATRIXDISPLAY (EA E162-BNLW). Angeschlossen habe ich es nach Datenblatt P1:GND P2:5V P3:GND P5: GND (R/W) und die Datenleitungen, Enable und RS sind mit dem Mikrokontroller verbunden. Als ich beim ersten Versuch das LCD Modul anzusteuern gesehen habe das nur die unterste Zeile des Displays leuchten (Alle Dots sind zu sehen), habe ich mal die Pins nachgemessen. Dabei habe ich festgestellt das die LCD Datenpins auf Dauer 1 sind. Wenn ich an das Display nur die Spannungsverorgung anlege und an R/W GND, sind alle Display Datenpins high. Meine Frage nun ist das LCD kaputt oder sind die LCD Datenpins auf Output geschalten!? Danke für eure Hilfe fisi
auch ein Eingang hat irgendeine Spannung, wenn nichts von außen angelegt wird. Liegt an diesem Eingang ein interner Pullup, ist die Spannung ohne Beschaltung sowieso 5 V.
OK, klingt logisch! Wenn ich das LCD komplett an den Mikrocontroller beschaltet habe (davor die Mikrcontoller Pins nachgemessen ob sie richtig geschaltet sind) und dann zwischen LOW und High den jeweiligen Pin umschalte, habe ich am LCD Eingang immer ein high Signal.
Christian F. schrieb: > OK, klingt logisch! > Wenn ich das LCD komplett an den Mikrocontroller beschaltet habe (davor > die Mikrcontoller Pins nachgemessen ob sie richtig geschaltet sind) und > dann zwischen LOW und High den jeweiligen Pin umschalte, habe ich am LCD > Eingang immer ein high Signal. Dann hast du wahrscheinlich den µC-Ausgang nicht als Ausgang geschaltet.
Karl heinz Buchegger schrieb: > Christian F. schrieb: >> OK, klingt logisch! >> Wenn ich das LCD komplett an den Mikrocontroller beschaltet habe (davor >> die Mikrcontoller Pins nachgemessen ob sie richtig geschaltet sind) und >> dann zwischen LOW und High den jeweiligen Pin umschalte, habe ich am LCD >> Eingang immer ein high Signal. > > Dann hast du wahrscheinlich den µC-Ausgang nicht als Ausgang geschaltet. Die µC-Ausgänge für das LCD sind alle auf OUTPUT!!
>Die µC-Ausgänge für das LCD sind alle auf OUTPUT!!
Behaupten kann man viel;) Kannst du es auch beweisen?
Ein falscher Befehl im Programm und es sind alles
wieder Eingänge.
Hier der Beweis:
1 | #define INPUT 0
|
2 | #define OUTPUT 1
|
3 | |
4 | // IN / OUT definitions
|
5 | |
6 | #define DDR_PORTA_PIN1 OUTPUT /* Extension 2: datapin 5 - bit 2 for display */ |
7 | #define DDR_PORTA_PIN2 OUTPUT /* Extension 2: datapin 8 - bit 5 for display old:Drum digital input (frequency measurement) */ |
8 | #define DDR_PORTA_PIN5 OUTPUT /* Extension 2: datapin 9 - bit 6 for display */ |
9 | #define DDR_PORTA_PIN6 OUTPUT /* Extension 2: datapin 10 - bit 7 for display */ |
10 | #define DDR_PORTA_PIN7 OUTPUT /* Extension 2: datapin 7 - bit 4 for display */ |
11 | #define DDR_PORTA_MASK (DDR_PORTA_PIN0) | (DDR_PORTA_PIN1 << 1) | (DDR_PORTA_PIN2 << 2) | (DDR_PORTA_PIN3 << 3) | (DDR_PORTA_PIN4 << 4) | (DDR_PORTA_PIN5 << 5) | (DDR_PORTA_PIN6 << 6) | (DDR_PORTA_PIN7 << 7)
|
12 | |
13 | #define DDR_PORTB_PIN2 OUTPUT /* Extension 2: datapin 4 - bit 1 for display */ |
14 | #define DDR_PORTB_PIN3 OUTPUT /* Extension 2: datapin 6 - bit 3 for display */ |
15 | #define DDR_PORTB_MASK (DDR_PORTB_PIN0) | (DDR_PORTB_PIN1 << 1) | (DDR_PORTB_PIN2 << 2) | (DDR_PORTB_PIN3 << 3) | (DDR_PORTB_PIN4 << 4) | (DDR_PORTB_PIN5 << 5) | (DDR_PORTB_PIN6 << 6) | (DDR_PORTB_PIN7 << 7)
|
16 | |
17 | #define DDR_PORTC_PIN0 OUTPUT /* Extension 1: datapin 8 - Enable for display */ |
18 | |
19 | #define DDR_PORTC_MASK (DDR_PORTC_PIN0) | (DDR_PORTC_PIN1 << 1) | (DDR_PORTC_PIN2 << 2) | (DDR_PORTC_PIN3 << 3) | (DDR_PORTC_PIN4 << 4) | (DDR_PORTC_PIN5 << 5) | (DDR_PORTC_PIN6 << 6) | (DDR_PORTC_PIN7 << 7)
|
20 | |
21 | |
22 | #define DDR_PORTD_PIN4 OUTPUT /* Extension 1: datapin 4 - R/W for display */ |
23 | #define DDR_PORTD_PIN6 OUTPUT /* Extension 1: datapin 3 - RS for display old:Trigger digital in - Tigger right */ |
24 | #define DDR_PORTD_PIN7 OUTPUT /* Extension 1: datapin 6 - bit 0 for display old: Trigger digital in - Tigger left */ |
25 | #define DDR_PORTD_MASK (DDR_PORTD_PIN0) | (DDR_PORTD_PIN1 << 1) | (DDR_PORTD_PIN2 << 2) | (DDR_PORTD_PIN3 << 3) | (DDR_PORTD_PIN4 << 4) | (DDR_PORTD_PIN5 << 5) | (DDR_PORTD_PIN6 << 6) | (DDR_PORTD_PIN7 << 7)
|
Das ist für die defines die dazugehörige iopins.c Alle Funktionen benutzen nun nur noch die Funktionen IOPINS_PinHigh und PinLow!
1 | void IOPINS_initIOs(void) |
2 | {
|
3 | //set the data-direction-registers
|
4 | DDRA = DDR_PORTA_MASK; |
5 | DDRB = DDR_PORTB_MASK; |
6 | DDRC = DDR_PORTC_MASK; |
7 | DDRD = DDR_PORTD_MASK; |
8 | |
9 | PORTA = 0x00; |
10 | PORTB = 0x00; |
11 | PORTC = 0x00; |
12 | PORTD = 0x00; |
13 | |
14 | }
|
15 | |
16 | uint8 IOPINS_PinHigh(enum IoPorts Port, uint8 Pin) |
17 | {
|
18 | uint8 ret_code = IL_OK; |
19 | |
20 | //Pins are from 0 to 7
|
21 | if (Pin >= 8) |
22 | {
|
23 | return (RET_ERROR); |
24 | }
|
25 | |
26 | //write to appropriate Port
|
27 | switch (Port) |
28 | {
|
29 | case A: |
30 | SB(PORTA,Pin); |
31 | break; |
32 | case B: |
33 | SB(PORTB,Pin); |
34 | break; |
35 | case C: |
36 | SB(PORTC,Pin); |
37 | break; |
38 | case D: |
39 | SB(PORTD,Pin); |
40 | break; |
41 | default:
|
42 | ret_code = RET_ERROR; |
43 | }
|
44 | |
45 | return (ret_code); |
46 | }
|
47 | uint8 IOPINS_PinLow(enum IoPorts Port, uint8 Pin) |
48 | {
|
49 | uint8 ret_code = IL_OK; |
50 | |
51 | //Pins are from 0 to 7
|
52 | if (Pin >= 8) |
53 | {
|
54 | return (RET_ERROR); |
55 | }
|
56 | |
57 | //write to appropriate port
|
58 | switch (Port) |
59 | {
|
60 | case A: |
61 | CB(PORTA,Pin); |
62 | break; |
63 | case B: |
64 | CB(PORTB,Pin); |
65 | break; |
66 | case C: |
67 | CB(PORTC,Pin); |
68 | break; |
69 | case D: |
70 | CB(PORTD,Pin); |
71 | break; |
72 | default:
|
73 | ret_code = RET_ERROR; |
74 | }
|
75 | |
76 | return (ret_code); |
77 | }
|
Jetzt sehe ich Code, aber nicht wie der aufgerufen wird.
>uint8 IOPINS_PinLow(enum IoPorts Port, uint8 Pin)
Was ist denn das für ein Unsinn mit enum?
Naja, vieleicht erklärt einer der C-Profis hier
das ja mal;)
Kleiner Auszug aus der Display INIT. Das Enum ist einfach dazu da, dass man die Ports als Buchstabe hat und nicht als Zahl!
1 | enum IoPorts |
2 | {
|
3 | A = 0, |
4 | B = 1, |
5 | C = 2, |
6 | D = 3 |
7 | };
|
8 | |
9 | void displayInit() { |
10 | |
11 | |
12 | /*Function Set 8-Bit, 2 zeiliges Display,*/
|
13 | IOPINS_PinHigh(C, 0); /* Enable - PC0 - 1*/ |
14 | |
15 | IOPINS_PinLow(D, 6); /*RS - PD5 - 0*/ |
16 | IOPINS_PinLow(D, 4); /*R/W - PD4 - 0*/ |
17 | IOPINS_PinLow(A, 6); /*DB7 - PA6 - 0*/ |
18 | IOPINS_PinLow(A, 5); /*DB6 - PA5 - 0*/ |
19 | IOPINS_PinHigh(A, 2); /*DB5 - PA2 - 1*/ |
20 | IOPINS_PinHigh(A, 7); /*DB4 - PA7 - 1*/ |
21 | IOPINS_PinLow(B, 3); /*DB3 - PB3 - 0*/ |
22 | IOPINS_PinLow(A, 1); /*DB2 - PA1 - 0*/ |
23 | IOPINS_PinLow(B, 2); /*DB1 - PB2 - 0*/ |
24 | IOPINS_PinLow(D, 7); /*DB0 - PD7 - 0*/ |
25 | |
26 | IOPINS_PinLow(C, 0); /* Enable - PC0 - 0*/ |
Wenn ich die Init und das schreiben ohne LCD im Debug modenachmesse kann ich die richtigen Pegel messen. Sobald ich das Display angeschlossen habe, ist alles nur noch auf High
> IOPINS_PinLow(A, 6); /*DB7 - PA6 - 0*/ > IOPINS_PinLow(A, 5); /*DB6 - PA5 - 0*/ > IOPINS_PinHigh(A, 2); /*DB5 - PA2 - 1*/ > IOPINS_PinHigh(A, 7); /*DB4 - PA7 - 1*/ > IOPINS_PinLow(B, 3); /*DB3 - PB3 - 0*/ > IOPINS_PinLow(A, 1); /*DB2 - PA1 - 0*/ > IOPINS_PinLow(B, 2); /*DB1 - PB2 - 0*/ > IOPINS_PinLow(D, 7); /*DB0 - PD7 - 0*/ 8 Bit Modus auf drei Ports verteilt! Sag mal gehts noch? Noch nie was vom 4Bit Modus gehört? >Wenn ich die Init und das schreiben ohne LCD im Debug modenachmesse kann >ich die richtigen Pegel messen. Sobald ich das Display angeschlossen >habe, ist alles nur noch auf High Dann check deine Schaltung.
Ach, nochwas:
Wo in deinem Programm werden die DDRx gesetzt?
>Kleiner Auszug aus der Display INIT.
Mach mal nen großen Auszug.
P3 ist die Kontrastspannung ! P3 auf GND (s.o.) ist falsch ! Poti lt. Datenblatt einsetzen. avr
Auch wenn ich bis jetzt immer noch nicht daran glaube, dass das LCD defekt ist, könntest du folgendes probieren. Nimm einen Widerstand, ich würde mal 1k vorschlagen, und schalte den von deinem LCD-Pin nach Masse. Wenn mit dem LCD alles in Ordnung ist, dann schafft es der Widerstand leicht den Pin nach Masse zu ziehen. OK, exakt 0V werdens wahrscheinlich nicht werden, aber nahe genug. Damit kannst du dich davon überzeugen, ob dir das LCD oder der µC die Pegel versaut. Weiters: Du verwendest den Port A. Aus der Porgrammierung sieht man, dass es sich offenbar um einen AVR handelt. Welcher µC ist das. Bei einigen liegt am Port A der ADC und es gibt dann einen Pin AVcc. Hast du an AVcc Versorgungsspannung angeschlossen? > Das Enum ist einfach dazu da, dass man die Ports als Buchstabe > hat und nicht als Zahl! Wieso Zahl. Was ist falsch daran gleich direkt PORTA, PORTB etc zu verwenden?
> void displayInit()
Wenn das alles ist was zur Initialisierung deines LCD nötig ist dann ist
es völlig daneben würde ich sagen.
Hast Du das Datenblatt nicht richtig gelesen?
Solltest vllt. mal das Toturial durchlesen.
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.