Hallo, ich würde gern meinen Atmega8 und mein Display von Pollin zum Laufen bekommen. Ich sitze nun schon 2 Tage dran, aber bekomme kein Zeichen, geschwiege denn die Uhrzeit wie geplant, auf das Display. Ich habe die Beschaltung wie in LCD-Ansteuerung beschrieben, aufgebaut. Was kann die Ursache dafür sein ? Anhänge: - Datasheed Display http://www.pollin.de/shop/downloads/D120422D.PDF HW: - Atmega8 - STK 500 - Display TC1602A-09 (http://www.pollin.de/shop/dt/Nzc1OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TC1602A_09.html)
MartinO schrieb: > LCD-Ansteuerung versuch mal Deinen Link :-(( Aber unabhängig davon: es geht nicht um den "gleichen Code", sondern um genau Deinen. Ich nehme mal an, dass da doch einige winzige Details anders sind - und wenn es nur Schreibfehler sind. Außerdem ist ein Schaltplan sehr sinnvoll. Gruß Dietrich
abgesehn vom Schaltplan und Code. Hast du mal mit dem Displaykontrast gespielt? Ich erinner mich noch an meine ersten Gehversuche mit LCDs als der vermeintliche Fehler eine falsche Kontrasteinstellung war
@DietrichL: hier mal meinen Code:
1 | #include <avr/io.h> |
2 | #include "lcd-routines.h" |
3 | #include <util/delay.h> |
4 | |
5 | int main(void) |
6 | {
|
7 | lcd_init(); |
8 | |
9 | lcd_data( 'T' ); |
10 | lcd_data( 'e' ); |
11 | lcd_data( 's' ); |
12 | lcd_data( 't' ); |
13 | |
14 | lcd_setcursor( 0, 2 ); |
15 | |
16 | lcd_string("Hello World!"); |
17 | |
18 | DDRB = 0x01; |
19 | while(1) |
20 | {
|
21 | PORTB = 1; |
22 | _delay_loop_2(100000); |
23 | PORTB = 0; |
24 | _delay_loop_2(100000); |
25 | }
|
26 | |
27 | return 0; |
28 | }
|
das ist mein Code. Im Makefile habe ich noch folgendes angepasst:
1 | MCU = atmega8 |
hier dann nochmal der Link AVR-GCC-Tutorial/LCD-Ansteuerung Schaltplan habe ich angehangen. @HP: nein, habe ich noch nicht!
1 | // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
|
2 | // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
|
3 | //
|
4 | |
5 | #ifndef LCD_ROUTINES_H
|
6 | #define LCD_ROUTINES_H
|
7 | |
8 | ////////////////////////////////////////////////////////////////////////////////
|
9 | // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
|
10 | |
11 | #ifndef F_CPU
|
12 | #define F_CPU 3686400
|
13 | #endif
|
14 | |
15 | ////////////////////////////////////////////////////////////////////////////////
|
16 | // Pinbelegung für das LCD, an verwendete Pins anpassen
|
17 | // Alle LCD Pins müssen an einem Port angeschlossen sein und die 4
|
18 | // Datenleitungen müssen auf aufeinanderfolgenden Pins liegen
|
19 | |
20 | // LCD DB4-DB7 <--> PORTD Bit PD0-PD3
|
21 | #define LCD_PORT PORTD
|
22 | #define LCD_DDR DDRD
|
23 | #define LCD_DB PD0
|
24 | |
25 | // LCD RS <--> PORTD Bit PD4 (RS: 1=Data, 0=Command)
|
26 | #define LCD_RS PD4
|
27 | |
28 | // LCD EN <--> PORTD Bit PD5 (EN: 1-Impuls für Daten)
|
29 | #define LCD_EN PD5
|
30 | |
31 | ////////////////////////////////////////////////////////////////////////////////
|
32 | // LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden)
|
33 | |
34 | #define LCD_BOOTUP_MS 15
|
35 | #define LCD_ENABLE_US 20
|
36 | #define LCD_WRITEDATA_US 46
|
37 | #define LCD_COMMAND_US 42
|
38 | |
39 | #define LCD_SOFT_RESET_MS1 5
|
40 | #define LCD_SOFT_RESET_MS2 1
|
41 | #define LCD_SOFT_RESET_MS3 1
|
42 | #define LCD_SET_4BITMODE_MS 5
|
43 | |
44 | #define LCD_CLEAR_DISPLAY_MS 2
|
45 | #define LCD_CURSOR_HOME_MS 2
|
46 | |
47 | ////////////////////////////////////////////////////////////////////////////////
|
48 | // Zeilendefinitionen des verwendeten LCD
|
49 | // Die Einträge hier sollten für ein LCD mit einer Zeilenlänge von 16 Zeichen passen
|
50 | // Bei anderen Zeilenlängen müssen diese Einträge angepasst werden
|
51 | |
52 | #define LCD_DDADR_LINE1 0x00
|
53 | #define LCD_DDADR_LINE2 0x40
|
54 | #define LCD_DDADR_LINE3 0x10
|
55 | #define LCD_DDADR_LINE4 0x50
|
56 | |
57 | ////////////////////////////////////////////////////////////////////////////////
|
58 | // Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
|
59 | void lcd_init( void ); |
60 | |
61 | ////////////////////////////////////////////////////////////////////////////////
|
62 | // LCD löschen
|
63 | void lcd_clear( void ); |
64 | |
65 | ////////////////////////////////////////////////////////////////////////////////
|
66 | // Cursor in die 1. Zeile, 0-te Spalte
|
67 | void lcd_home( void ); |
68 | |
69 | ////////////////////////////////////////////////////////////////////////////////
|
70 | // Cursor an eine beliebige Position
|
71 | void lcd_setcursor( uint8_t spalte, uint8_t zeile ); |
72 | |
73 | ////////////////////////////////////////////////////////////////////////////////
|
74 | // Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition
|
75 | void lcd_data( uint8_t data ); |
76 | |
77 | ////////////////////////////////////////////////////////////////////////////////
|
78 | // Ausgabe eines Strings an der aktuellen Cursorposition
|
79 | void lcd_string( const char *data ); |
80 | |
81 | ////////////////////////////////////////////////////////////////////////////////
|
82 | // Definition eines benutzerdefinierten Sonderzeichens.
|
83 | // data muss auf ein Array[5] mit den Spaltencodes des zu definierenden Zeichens
|
84 | // zeigen
|
85 | void lcd_generatechar( uint8_t code, const uint8_t *data ); |
86 | |
87 | ////////////////////////////////////////////////////////////////////////////////
|
88 | // Ausgabe eines Kommandos an das LCD.
|
89 | void lcd_command( uint8_t data ); |
90 | |
91 | |
92 | ////////////////////////////////////////////////////////////////////////////////
|
93 | // LCD Befehle und Argumente.
|
94 | // Zur Verwendung in lcd_command
|
95 | |
96 | // Clear Display -------------- 0b00000001
|
97 | #define LCD_CLEAR_DISPLAY 0x01
|
98 | |
99 | // Cursor Home ---------------- 0b0000001x
|
100 | #define LCD_CURSOR_HOME 0x02
|
101 | |
102 | // Set Entry Mode ------------- 0b000001xx
|
103 | #define LCD_SET_ENTRY 0x04
|
104 | |
105 | #define LCD_ENTRY_DECREASE 0x00
|
106 | #define LCD_ENTRY_INCREASE 0x02
|
107 | #define LCD_ENTRY_NOSHIFT 0x00
|
108 | #define LCD_ENTRY_SHIFT 0x01
|
109 | |
110 | // Set Display ---------------- 0b00001xxx
|
111 | #define LCD_SET_DISPLAY 0x08
|
112 | |
113 | #define LCD_DISPLAY_OFF 0x00
|
114 | #define LCD_DISPLAY_ON 0x04
|
115 | #define LCD_CURSOR_OFF 0x00
|
116 | #define LCD_CURSOR_ON 0x02
|
117 | #define LCD_BLINKING_OFF 0x00
|
118 | #define LCD_BLINKING_ON 0x01
|
119 | |
120 | // Set Shift ------------------ 0b0001xxxx
|
121 | #define LCD_SET_SHIFT 0x10
|
122 | |
123 | #define LCD_CURSOR_MOVE 0x00
|
124 | #define LCD_DISPLAY_SHIFT 0x08
|
125 | #define LCD_SHIFT_LEFT 0x00
|
126 | #define LCD_SHIFT_RIGHT 0x04
|
127 | |
128 | // Set Function --------------- 0b001xxxxx
|
129 | #define LCD_SET_FUNCTION 0x20
|
130 | |
131 | #define LCD_FUNCTION_4BIT 0x00
|
132 | #define LCD_FUNCTION_8BIT 0x10
|
133 | #define LCD_FUNCTION_1LINE 0x00
|
134 | #define LCD_FUNCTION_2LINE 0x08
|
135 | #define LCD_FUNCTION_5X7 0x00
|
136 | #define LCD_FUNCTION_5X10 0x04
|
137 | |
138 | #define LCD_SOFT_RESET 0x30
|
139 | |
140 | // Set CG RAM Address --------- 0b01xxxxxx (Character Generator RAM)
|
141 | #define LCD_SET_CGADR 0x40
|
142 | |
143 | #define LCD_GC_CHAR0 0
|
144 | #define LCD_GC_CHAR1 1
|
145 | #define LCD_GC_CHAR2 2
|
146 | #define LCD_GC_CHAR3 3
|
147 | #define LCD_GC_CHAR4 4
|
148 | #define LCD_GC_CHAR5 5
|
149 | #define LCD_GC_CHAR6 6
|
150 | #define LCD_GC_CHAR7 7
|
151 | |
152 | // Set DD RAM Address --------- 0b1xxxxxxx (Display Data RAM)
|
153 | #define LCD_SET_DDADR 0x80
|
154 | |
155 | #endif
|
>Wo ist die "lcd-routines.h" ?
Und warum schliesst du dein Display nicht so an wie es
da drin steht?
Nimm mal meine HEX Datei.
Hast du die Ports entstprechend geändert? Im Tut liegt imho PD0-PD3 an den Datenleitungen ...
Nun, da ich den rest des codes nicht sehen kann, kann ich leider nicht nachvollziehen wie der Mega8 den 44780 in den 4-Bit mode schalten soll - denn dass muss er machen. Ich nutze die LCD-Support Routinen von Peter Fleury. ( $Id: lcd.c,v 1.14.2.1 2006/01/29 12:16:41 peter Exp $) Die funktionieren im 4-Bit Mode bei mir sehr gut. Mein Init sieht so aus: lcd_init ( LCD_DISP_ON ); lcd_clrscr (); lcd_gotoxy ( 0, 0 ); lcd_puts ( " Antennenkoppler Controller " ); sprintf(cpa, " Version %d.%d.%d%d",version[0],version[1],version[2],version[3]); lcd_gotoxy (0, 2); lcd_puts (cpa); Es ist wichtig dass die richtigen 4 Bit's des I/O-Ports der Displays benutzt werden. Ich finde bei deinem Code nicht die Stelle wo der 4/8 Bit Mode initialisiert wird. init(); <--- ?????????? Sehe mal da rein - ob noch was übergeben werden muss. Kontrolliere die Anschlüsse des Displays an den ATMEGA8.
Habe meine Beschaltung gemäß der Anleitung: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung geändert und @holger dein .hex eingespielt... leider nix!
>Habe meine Beschaltung gemäß der Anleitung: >http://www.mikrocontroller.net/articles/AVR-GCC-Tu... >geändert und @holger dein .hex eingespielt... leider nix! Dann funktionieren schon mal zwei komplett unterschiedliche Programme bei dir nicht. Jetzt will ich ein Bild von deinem Aufbau sehen.
Nachtrag: >Habe meine Beschaltung gemäß der Anleitung: >http://www.mikrocontroller.net/articles/AVR-GCC-Tu... >geändert und @holger dein .hex eingespielt... leider nix! Meine HEX Datei war für deine Anschlussbelegung und nicht die aus dem Tutorial;)
holger schrieb: > Nachtrag: > >>Habe meine Beschaltung gemäß der Anleitung: >>http://www.mikrocontroller.net/articles/AVR-GCC-Tu... >>geändert und @holger dein .hex eingespielt... leider nix! > > Meine HEX Datei war für deine Anschlussbelegung und nicht die > aus dem Tutorial;) habe ich mir schon gedacht und zuerst probiert, dann umgebaut!
ich bau das morgen nochmal um, sodass man was sieht :) ich weiß, aber hab halt noch nicht so viel equipment... morgen siehts besser aus
holger schrieb: > Ab in die Tonne damit. Man sieht nichts. Das kannst du so nicht sagen! Man kann ein Steckbrett erkennen, ein LCD und einen Quarz auf der Flucht.
>Das kannst du so nicht sagen! > >Man kann ein Steckbrett erkennen, ein LCD und einen Quarz auf der >Flucht. Zwei Kerkos und ein Widerstand scheinen auch zu flüchten. Kommt nur mir das so vor oder hat er die Datenleitungen zum Teil auf die VCC GND Schiene gelegt?
@holger: kommt dir nur so vor Habe nun nochmal versucht einen sauberen Aufbau zu starten: Die LCD Pins sind von oben bis unten K, A, DB7 ... VSS Hoffe es sieht besser aus :/
>Habe nun nochmal versucht einen sauberen Aufbau zu starten:
Und warum schliesst du das Display immer noch nicht richtig an?
>>Habe nun nochmal versucht einen sauberen Aufbau zu starten: > >Und warum schliesst du das Display immer noch nicht richtig an? Ach Shit vergiss es;) Jetzt nach Tutorial.
Wo und wie wird eigentlich die Kontrastspannung eingestellt? Hast du die schwarzen (weissen bei Blau) Balken schon mal gesehen?
Ja, die Balken sehe ich. Die Kontrastspannung geht direkt über einen 10kOhm an VCC.
Hi
>Die Kontrastspannung geht direkt über einen 10kOhm an VCC.
Kein Einstellregler?
MfG Spess
Ok, also einen kleineren wiederstand, wenn ich zuvfllig nicht noch ein regler finde ?
MartinO schrieb: > Die Kontrastspannung geht direkt über einen 10kOhm an VCC. Ich kenne das eher über nen Widerstand an GND. Im Datenblatt steht auch Supply Voltage For LCD: VDD-V0 typ: 4.7V Nach V0 umstellen müsste dann eher 0,3V als Kontrastspannung angelegt werden, also kommt 10kOhm gegen GND eher hin als 10kOhm gegen VCC ;) Gruß Benny
Benjamin R. schrieb: > MartinO schrieb: >> Die Kontrastspannung geht direkt über einen 10kOhm an VCC. > > Ich kenne das eher über nen Widerstand an GND. > > Im Datenblatt steht auch > Supply Voltage For LCD: VDD-V0 typ: 4.7V > Nach V0 umstellen müsste dann eher 0,3V als Kontrastspannung angelegt > werden, also kommt 10kOhm gegen GND eher hin als 10kOhm gegen VCC ;) > > Gruß Benny Ne, dass geht nicht!
Hi
>Ne, dass geht nicht!
Und dein unsinniger Widerstand nach VCC geht noch weniger.
Die richtige Beschaltung von Vo steht sogar groß und breit in den
Datenblatt.
MfG Spess
genau solche "Sparmaßnahmen" sind echt mist wenn man das erste Mal mit nem LCD spielt. Nimm ein Poti dann kannst du den Kontrast vernünftig einstellen bzw. weißt dass es nicht am Kontrast liegt das nix angezeigt wird. Glaub mir ich sprech da aus Erfahrung. Du kannst das Poti ja später gegen nen Festwiderstand austauschen wenn alles funktioniert.
Da muss ich HP recht geben, da mit habe ich auch meine erfahrung gemacht. mfg
hab noch einen Poti gefunden! :) nun kann ich den Kontrast einstellen... aber sehen tue ich immer noch nix
Alex W. schrieb: > MartinO schrieb: > >> Er hat 1MHz intern! > > Dann bitte die "#define F_CPU 3686400" da drauf anpassen! ist definiert!
Wechselt die Spannung an PortB? Evtl. mit LED kontrollieren, ob der µC überhaupt läuft. > ich würde gern meinen Atmega8 und mein Display von Pollin zum Laufen bekommen. Bei Pollin TC1602E kommen sofort die Alarmglocken: Beitrag "Vorsicht unübliche Pinbelegung beim LCD TC1602E (Pollin 120420): Pin1=VDD=+5V Pin2=VSS=Gnd" Du hast ja das TC1602A und es hat schonmal die Balken angezeigt, dann ist es richtig gepolt. Ist Dein Steckbrett zuverlässig? Es genügt eine Unterbrechung, dass es nicht läuft. Ich löte lieber. Da weiß man, was man hat (na zu 99%).
> // LCD Ausführungszeiten (MS=Millisekunden, US=Mikrosekunden) > #define LCD_BOOTUP_MS 15 > #define LCD_ENABLE_US 20 > #define LCD_WRITEDATA_US 46 > #define LCD_COMMAND_US 42 > #define LCD_SOFT_RESET_MS1 5 > #define LCD_SOFT_RESET_MS2 1 > #define LCD_SOFT_RESET_MS3 1 > #define LCD_SET_4BITMODE_MS 5 > #define LCD_CLEAR_DISPLAY_MS 2 > #define LCD_CURSOR_HOME_MS 2 Erhöhe die Wartezeiten testweise und zwar um den Faktor 10 bis 100.
Hallo, habe heute nochmal alles verlötet! Nun auch mit Poti. Leider sehe ich nur die Striche auf meinem LCD. :/ Ebenfalls habe ich mein Prog nochmal angepasst um zu sehen, ob der Mikrocontroller überhaupt läuft und habe dazu eine LED über einen 1kOhm an VCC gehangen. Leider blinkt die nicht auf.. Auf meinem STK500 funzt es. Hier das Programm:
1 | #include <avr/io.h> |
2 | #include "lcd-routines.h" |
3 | #include <util/delay.h> |
4 | |
5 | int main(void) |
6 | {
|
7 | lcd_init(); |
8 | |
9 | lcd_data( 'T' ); |
10 | lcd_data( 'e' ); |
11 | lcd_data( 's' ); |
12 | lcd_data( 't' ); |
13 | |
14 | lcd_setcursor( 0, 2 ); |
15 | |
16 | lcd_string("Hello World!"); |
17 | |
18 | DDRB=0x01; |
19 | while(1) |
20 | {
|
21 | PORTB = 0x01; |
22 | _delay_loop_2(100000); |
23 | PORTB = 0x00; |
24 | _delay_loop_2(100000); |
25 | }
|
26 | |
27 | return 0; |
28 | }
|
habe die LED an PB0 gehangen! Ich weiß langsam nicht mehr weiter :?
es blinkt es blinkt es blinkt :) leider noch nicht außer dicke unterstriche auf dem lcd :? Was kann das sein =? DatenKabel sind ordnungsgemäß angeschlossen
Datenleitungen richtig angeschlossen? Ansonsten bevor hier noch Mannjahre verschwendet werden: nimm für ein paar Euro mal ein neues und probiere das. Ein zweites kann eh nicht schaden auf Dauer.
Datenleistungen sind ordnungsgemäß dran! Kann ja nicht sein, dass ein neues LCD kaputt ist. (also kann schon sein, aber eher unwahrscheinlich)
Haben die unbeschalteten LCD Pins D0...D3 auch definiert Masse. Man kann
sie ja gewöhnlich offen lassen aber ich selbst hab sie immer mit GND
verbunden und es noch nie offen probiert.
Hast du die Wartezeiten erhöht?
>DDRB=0x01; // LCD_Init Einstellungen werden wieder überschrieben!
Schreib das mal lieber so: DDRB |= 0x01;
Gruß
Benny
Benjamin R. schrieb: > Haben die unbeschalteten LCD Pins D0...D3 auch definiert Masse. Man kann > sie ja gewöhnlich offen lassen aber ich selbst hab sie immer mit GND > verbunden und es noch nie offen probiert. Sie offen zu lassen, schadet definitiv nicht. Sie auf Masse zu legen, geht schief, wenn man versehentlich das LCD dazu bewegt, etwas auszugeben - dann ziehen zwei an einer Leitung, einer nach GND und einer nach VCC. Nachdem hier nicht klar ist, was eigentlich passiert, würde ich alles tun, aber nicht Leitungen unnötig auf Masse legen.
Ja ok macht natürlich Sinn kein weiteres Risiko einzugehen. Btw: Wenn wirklich R/W mit GND verbunden ist, befindet sich das Display immer im Daten-Empfangmodus und sollt die DBx Pins nicht beschreiben. Gruß Benny
Hi >Haben die unbeschalteten LCD Pins D0...D3 auch definiert Masse. Man kann >sie ja gewöhnlich offen lassen aber ich selbst hab sie immer mit GND >verbunden und es noch nie offen probiert. Dieser Irrglaube hält sich sehr hartnäckig. Hast du eigentlich schon mal das Datenblatt eines Displaycontrollers (z.B. HD44780) gelesen? Die Dinger haben interne Pull-Up-Widerstände . Also ist GND für unbenutzte Pins bei Displays der falsche Weg. Entweder offen lassen oder externe Pull-Ups. MfG Spess
Benjamin R. schrieb: > Btw: Wenn wirklich R/W mit GND verbunden ist, befindet sich das Display > immer im Daten-Empfangmodus und sollt die DBx Pins nicht beschreiben. Wenn... Alles scheint jedenfalls nicht richtig gemacht zu sein, sonst würde es ja gehen.
MartinO schrieb: > auf meinem Display sieht es übrigens mittlerweile so aus: siehe Anhang! .. für mich sieht es so aus, als wenn das Ding überhaupt keine Initialisierung bekommt. Das ist doch ein zweizeiliges Display oder ? Gruss Ingo
spess53 schrieb: > Dieser Irrglaube hält sich sehr hartnäckig. > Hast du eigentlich schon mal das Datenblatt eines Displaycontrollers > (z.B. HD44780) gelesen? Ja, allerdings nur die Abschnitte mit den Daten zur Ansteuerung. "Meinen" typischen Aufbau habe ich damals auch aus einem Tutorial 1:1 nachgebaut und ihn seitdem nicht mehr verändert, da es auf Anhieb funktioniert hatte. Aber danke für den Tipp, unnötig Strom verschwenden braucht man ja auch nicht. Zukünftig werd ich das berücksichtigen. Wieder Back2Topic: Ich möchte nochmal explizit auf die Wartezeit hinweisen, da es bei mir in der Vergangenheit öfters ein Fehler war und man ließt auch immer wieder das die kompatiblem Kontroller sich nicht 1:1 an das Timingverhalten des HD44780 halten. EDIT: Wie lange braucht denn ein AVR bis der interne Quarz eingeschwungen ist? Die LCD_init wird ja sofort aufgerufen. Vielleicht ist das Display nach dem Spannungseinschalten noch nicht bereit. Fügt doch mal vor der Init ein _delay_ms ein. Gruß Benny
Habe die Werte erhöht(um Faktor 10 - 100), aber ohne Erfolg!
1 | #define LCD_BOOTUP_MS 150
|
2 | #define LCD_ENABLE_US 200
|
3 | #define LCD_WRITEDATA_US 460
|
4 | #define LCD_COMMAND_US 420
|
5 | |
6 | #define LCD_SOFT_RESET_MS1 50
|
7 | #define LCD_SOFT_RESET_MS2 10
|
8 | #define LCD_SOFT_RESET_MS3 10
|
9 | #define LCD_SET_4BITMODE_MS 50
|
10 | |
11 | #define LCD_CLEAR_DISPLAY_MS 20
|
12 | #define LCD_CURSOR_HOME_MS 20
|
Stimmt das denn jetzt zu 100% mit deiner Verkabelung überein? MartinO schrieb: > // LCD DB4-DB7 <--> PORTD Bit PD0-PD3 <--- !!!!!!!!!!! > #define LCD_PORT PORTD > #define LCD_DDR DDRD > #define LCD_DB PD0 > > // LCD RS <--> PORTD Bit PD4 (RS: 1=Data, 0=Command) > #define LCD_RS PD4 > > // LCD EN <--> PORTD Bit PD5 (EN: 1-Impuls für Daten) > #define LCD_EN PD5 Falls nicht, frag lieber ruhig - sonst kommen wir nie zum Ziel ;-)
Hier nochmal die Pinbelegung des Atmega8 mit dem LCD 1602A-09 von Pollin! Pinbelegung Atmega8: Reset --> via 10kOhm zu VCC PD0 --> DB4 vom LCD PD1 --> DB5 vom LCD PD2 --> DB6 vom LCD PD3 --> DB7 vom LCD PD4 --> RS vom LCD VCC --> VCC GND --> GND PB6 --> PB7 --> PD5 --> E vom LCD PD6 --> PD7 --> PB0 --> via 1kOhm und LED zu VCC PC5 --> PC4 --> PC3 --> PC2 --> PC1 --> PC0 --> GND --> GND AREF --> AVCC --> VCC PB5 --> PB4 --> PB3 --> PB2 --> PB1 --> Pinbelegeung LCD: Vss --> GND Vdd --> VCC V0 --> Schleifer 10kOhm Poti(Poti zwischen GND und VCC) RS --> PD4 vom AVR R/W --> GND E --> PD5 vom AVR DB0 --> DB1 --> DB2 --> DB3 --> DB4 --> PD0 vom AVR DB5 --> PD1 vom AVR DB6 --> PD2 vom AVR DB7 --> PD3 vom AVR A --> via 1kOhm an VCC K --> GND Der AVR läuft auch, da die LED blinkt!
So, noch mal ein Versuch von mir. Nimm mal die HEX im Anhang. Wurde für 16MHz compiliert, also bitte ein wenig warten. Kann etwas dauern bevor was kommt. Dann kannst du noch mal folgendes tun falls noch nicht geschehen: BODLEVEL und BODEN Fuse aktivieren. Den Watchdog abschalten falls aktiviert. Pass auf das du dir dabei den Resetpin nicht wegfused. Wenn das alles nichts bringt ist entweder dein Display hinüber oder etwas nicht richtig angeschlossen. Also auf Kurzschlüsse oder falsche Verbindungen testen: Dieses Miniprogramm flashen und messen ob nur ein Pin auf High ist, und kontrollieren ob es der richtige Pin ist. void main(void) { DDRD = 0xFF; // Jeweils immer nur eine dieser Zeilen aktivieren, flashen // und dann messen PORTD = 0x01; // DB4 // PORTD = 0x02; //DB5 // PORTD = 0x04; //DB6 // PORTD = 0x08; //DB7 // PORTD = 0x10; //RS // PORTD = 0x20; //E while(1) { } }
hab deine .hex mal geflasht, aber nix zu sehen. Nun habe ich alle PINs geprüft und es sah gut aus, immer nur der entsprechende PIN auf HIGH. Nun habe ich das LCD mal an mein STK500 via Flachbandkabel an PORTD geklemmt, also das gleiche wie vorher, nur über das STK500. Nun ist die gestrichelte Linie in der Mitte des Displays.. hm.. Aber mehr hats auch nicht gebracht! Die Fuses hab ich auch mal gesetzt! - keine Auswirkung!
Hallo, nun ist das neue Display da! Ebenfalls ähnlich wie bei dem Alten! Hier sind aber im Gegenteil zum alten alle Pixel in der oberen Zeile = 1! :? Langsam versteh ich das nicht mehr!
Hi
>Oh, nach erneutem flashen sind nun alle Pixel beider Zeilen High! :)
Dann dreh mal mal am Kontrast.
MfG Spess
>Dann dreh mal mal am Kontrast. >Hab ich schon, bringt nix! Dann ist das Poti falsch angeschlossen.
MartinO schrieb: > V0 - Schleifer > Poti zwischen GND und VCC > Falsch ? Die Beschaltung stimmt doch, oder ?
Gruß, irgendwie scheinen deine Timings nicht zu stimmen... ich habe nur #include <util/delay.h> gesehen... wenn du mal in der delay.h nachschaust wirst du sehen "delay.h" wird nur richtig ausgeführt, wenn du optimization einschaltest... also setzt die mal auf level3. du benutzt doch avr studio oder?
habe jetzt avr studio nicht da aber unter einstellungen müsste da irgendwo compiler und debugger stehen da durchklicken und dann müste ein dropdownmenue mit optim kommen standart auf none eingestellt... du stellst dann da o3 ein....
Hallo MartinO, habe auch einen Atmega8 mit einem LCD 1602. Ebenfalls sind bei mir nur alle Pixel beider Zeilen auf 1. Komme da auch irgendwie nicht weiter. ??? Falls du eine Lösung hast, sag mal Bescheid! LG pete
@ Mike, pete >habe auch einen Atmega8 mit einem LCD 1602. Ebenfalls sind bei mir nur >alle Pixel beider Zeilen auf 1. Komme da auch irgendwie nicht weiter. Dein Kontrast stimmt nicht. Den musst du mit einem Poti einstellen. Häng dich hier bitte nicht dran. Mach einen neuen Thread auf. Dann beschreibst du wo und wie du das Display angeschlossen hast. Taktrate des AVR angeben, Schaltplan, Foto vom Aufbau, Code posten. Dann kann dir geholfen werden. @MartinO Für dich seh ich irgendwie schwarz. Da hilft ja gar nix. Das ist wohl der längste erfolgloseste LCD Thread bisher. Entweder du machst deine Displays beim ersten einschalten kaputt oder deine Schaltung ist komplett von Arsch.
Wieso sollte mein Display kaputt sein ? Habe alle Anschlüsse 1000mal geprüft. Diese sind zu 100% richtig verkabelt! Leider halt wie seitdem ich das neue Display habe alle Pixel auf HIGH. Irgendwie kann das doch nicht sein! ?
>Irgendwie kann das doch nicht sein! ?
Miss mal die Spannung an VO wenn du am Poti drehst.
holger schrieb: >>Irgendwie kann das doch nicht sein! ? > > Miss mal die Spannung an VO wenn du am Poti drehst. 0 - 4,87V bei 0,47V hat das Display den richtigen Kontrast!
> Miss mal die Spannung an VO wenn du am Poti drehst. >0 - 4,87V >bei 0,47V hat das Display den richtigen Kontrast! Ach was. >Dann dreh mal mal am Kontrast. >Hab ich schon, bringt nix! Ich verabschiede mich jetzt hier einfach mal für immer.
MartinO schrieb: > was sollte das bringen ? > Ich habs gemacht, aber ohne Erfolg! habe ich oben schon beschrieben, da du ja offensichtlich delay.h benutzt, wird jetzt bei_delayms(200) auch 200ms und nicht 2 oder 1 sec gewartet. ich glaube du machst besser einen neuen threat auf.... oder gib mal deinen kompletten code...
hier nochmal mein kompletter code. die lcd-routines.h habe ich von AVR-GCC-Tutorial/LCD-Ansteuerung und nix dran geändert!!!
MartinO schrieb: > die lcd-routines.h habe ich von AVR-GCC-Tutorial/LCD-Ansteuerung und > nix dran geändert!!! Wenn Du nichts geändert hast, sollten die LCD-Anschlüsse auch so verdrahtet werden wie es in lcd-routines.h (bzw. in der Liste darüber: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Anschluss_an_den_Controller) angegeben ist. Wenn der Schaltplan noch so ist: MartinO schrieb: > Schaltplan habe ich angehangen. dann sehe ich bei allen Anschlüssen, die zum ATmega8 gehen, Unterschiede! Woher hast Du Deine Beschaltung? Gruß Dietrich
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.