Hallo, vor einiger Zeit schaffte ich mir ein "myAVR Board 2 USB" und das dazugehörige LCD-Addon an. Die Beispiel-Programme, sowie einige eigene Programme funktionieren einwandfrei. Jetzt versuche ich, jedoch vergeblich, Werte von Variablen auf dem LCD auszugeben. Als Grundlage für meine Versuche dient mir das Tutorial "AVR-GCC-Tutorial" dieser Seite. Dieser Code lässt sich auch kompilieren und auf den Mikrocontroller Atmega8 übertragen, als Entwicklungsumgebung verwende ich "AVR Studio 4". Leider passiert danach nichts mehr, es ist lediglich die erste Zeile komplett schwarz. Die anderen Beiträge in diversen Foren halfen mir leider nicht weiter. Da ich nicht weiter weiß, hoffe ich, dass jemand mir sagen kann wie ich den im Anhang befindlichen Code ändern muss, damit die Anzeige den Wert korrekt wiedergibt. Mit freundlichen Grüssen steffen3
Kein Wunder. Dieser Code geht fix davon aus, dass die Datenleitungen zum LCD am Ausgabeport an den Pins 0 bis 3 hängen. Das tun sie aber in deiner Beschaltung nicht. Die Daten- leitungen hängen an den Pins 4 bis 7. Das wirst du umschreiben müssen.
@ Steffen Kreutzberg (steffen3) >Leider passiert danach nichts mehr, es ist lediglich die erste Zeile >komplett schwarz. Klar, der Code geht davon aus, dass die Bit 0..3 für den Datenbus verwendet werden, nicht 4..7. Frei wählbar sind nur RS und E. MFG Falk P.S. Deine Ansteuerung der Hintergrundbeleuchtung ist auch sehr gewagt.
Für lcd_data würde das dann so aussehen
1 | void lcd_data(unsigned char temp1) |
2 | {
|
3 | unsigned char temp2=temp1; |
4 | |
5 | LCD_PORT |= (1<<LCD_RS); |
6 | |
7 | temp1 = temp1 & 0xF0; |
8 | LCD_PORT &= 0x0F; |
9 | LCD_PORT |= temp1; |
10 | lcd_enable(); |
11 | |
12 | temp2 = temp2 & 0x0F; |
13 | temp2 = temp2 << 4; |
14 | LCD_PORT &= 0x0F; |
15 | LCD_PORT |= temp2; |
16 | |
17 | lcd_enable(); |
18 | _delay_us(42); |
19 | }
|
lcd_command muss ebenfalls geändert werden. Aber das lasse ich als Übung für den angehenden Programmierer.
so, die Funktion
1 | void lcd_data(unsigned char temp1) |
habe ich wie oben beschrieben umgeschreiben, die Funktion
1 | void lcd_command(unsigned char temp1) |
habe ich folgendermaßen umgeschrieben aber es funktioniert nicht
1 | void lcd_command(unsigned char temp1) |
2 | {
|
3 | unsigned char temp2=temp1; |
4 | LCD_PORT &= ~(1<<LCD_RS); |
5 | temp1=temp1 & 0xF0; |
6 | LCD_PORT &= 0x0F; |
7 | LCD_PORT |=temp1; |
8 | lcd_enable(); |
9 | |
10 | temp2=temp2 & 0xFO; |
11 | temp2 =temp2 <<4; |
12 | LCD_PORT &= 0x0F; |
13 | LCD_PORT |=temp2; |
14 | lcd_enable(); |
15 | |
16 | _delay_us(42); |
17 | }
|
Ich wäre dankbar wenn man mir nochmals helfen kann.
1 | void lcd_command(unsigned char temp1) |
2 | {
|
3 | unsigned char temp2=temp1; |
4 | LCD_PORT &= ~(1<<LCD_RS); |
5 | temp1=temp1 & 0xF0; |
6 | LCD_PORT &= 0x0F; |
7 | LCD_PORT |=temp1; |
8 | lcd_enable(); |
9 | |
10 | temp2=temp2 & 0xFO;// Vertausche mal |
11 | temp2 =temp2 <<4; // diese Zeilen... |
12 | LCD_PORT &= 0x0F; |
13 | LCD_PORT |=temp2; |
14 | lcd_enable(); |
15 | |
16 | _delay_us(42); |
17 | }
|
blöder fehler ;) hth. Jörg
danke erst mal.habe die beiden so geändert.
1 | temp2 =temp2 <<4; |
2 | temp2=temp2 & 0xFO; |
3 | LCD_PORT &= 0x0F; |
4 | LCD_PORT |=temp2; |
5 | lcd_enable(); |
funktioniert aber immer noch nicht, jetzt frage ich mich ob ich in diese Methode
1 | public void lcd-init(void) |
nicht auch anpassen muss, so langsam weiß ich nicht mehr weiter.
@ Steffen Kreutzberg (steffen3) >danke erst mal.habe die beiden so geändert. Passt. >funktioniert aber immer noch nicht, jetzt frage ich mich ob ich in diese >Methode >public void lcd-init(void) Ja, ist aber keine Methode, sondern eine ganz normale Funktion. Wir machen hier "nur" C, kein C++.
1 | void lcd_init(void) |
2 | {
|
3 | LCD_DDR=LCD_DDR |0x0F |(1<<LCD_RS) |(1<<LCD_EN); |
4 | _delay_ms(15); |
5 | LCD_PORT &=0x0F; |
6 | LCD_PORT |= 0x30; |
7 | LCD_PORT &= ~(1<<LCD_RS); |
8 | lcd_enable(); |
9 | _delay_ms(5); |
10 | lcd_enable(); |
11 | _delay_ms(1); |
12 | lcd_enable(); |
13 | _delay_ms(1); |
14 | |
15 | LCD_PORT &= 0x0F; |
16 | LCD_PORT |=0x20; |
17 | lcd_enable(); |
18 | |
19 | lcd_command(0x28); |
20 | lcd_command(0x0C); |
21 | lcd_command(0x06); |
22 | lcd_clear(); |
23 | }
|
Sollte jetzt laufen. MfG Falk
@ Steffen Kreutzberg (steffen3)
>nochmals danke jetzt funktionierts.
Dahast du aber Glück gehabt, ist noch ein Fehler drin :-(
So ist es jetzt hoffentlich richtig.
1 | void lcd_init(void) |
2 | {
|
3 | LCD_DDR=LCD_DDR |0xF0 |(1<<LCD_RS) |(1<<LCD_EN); |
4 | _delay_ms(15); |
5 | LCD_PORT &=0x0F; |
6 | LCD_PORT |= 0x30; |
7 | LCD_PORT &= ~(1<<LCD_RS); |
8 | lcd_enable(); |
9 | _delay_ms(5); |
10 | lcd_enable(); |
11 | _delay_ms(1); |
12 | lcd_enable(); |
13 | _delay_ms(1); |
14 | |
15 | LCD_PORT &= 0x0F; |
16 | LCD_PORT |=0x20; |
17 | lcd_enable(); |
18 | |
19 | lcd_command(0x28); |
20 | lcd_command(0x0C); |
21 | lcd_command(0x06); |
22 | lcd_clear(); |
23 | }
|
MfG Falk
In solchen Fällen mach ich folgendes. Ich hol mir für AVR-Studio die Hapsim Erweiterung http://www.helmix.at/hapsim/ und konfiguriere mir dort mal ein LCD. Und dann steppe ich im Code in einzelschritten durch und sehe im Simulator nach, ob alle Pins ihren Zustand so ändern wie ich das haben will. PS: Wenn alles nichts fruchtet: Hol dir die LCD-Library vom Peter Fleury. Die ist auch bei den Datenpins frei konfigurierbar.
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.