LCD ansprechen Probleme

#944957
Lesenswert?

Ich habe ein Problem und zwar möchte ich ein LCD an die Pins 7 6 5 4 
eines Ports anschließend und die RS und Enable an 0 und 1. Das mache ich 
deshalb, weil ich so den Port optimal ausnutze (2 und 3 sind für den 
UART.)

Ich Benutze einen Atmega128.

Meine Initialisierung scheint soweit zu funktionieren, denn der Cursor 
blinkt und ist an der richtigen Stelle. nun hab ich versucht die 
Dataroutine des Tutorials hier abzuändern, dass die oberen 4 Bits des 
Ports als Datenleitung genutzt werden.

Hier der Code wie ich ihn abgeändert habe:

1
 void lcd_data(unsigned char temp1){
2

3
    
4
   unsigned char temp2 = (temp1<<4);
5
 
6
  LCD_PORT |= (1<<LCD_RS);                     // RS setzen
7

8
  LCD_PORT = (  (LCD_PORT & 0x0F) | (temp1 & 0xF0) );  // ausgeben
9

10
  lcd_enable();           // Enableimpuls senden                    
11
  _delay_us(42);
12

13
  LCD_PORT = (  (LCD_PORT & 0x0F) | (temp2 & 0xF0) );  // ausgeben
14

15
  lcd_enable();           // Enableimpuls senden                   
16
  _delay_us(42);
17

18

19
  }
#944976
Lesenswert?

Der Teil des Code sieht aber ok aus. Hört sich nach einem Timingproblem 
an.

Getreu nach dem Motto "Pausenzeiten können nicht zu gross sein" solltest 
du mal versuchen, die delays anzupassen. Musst halt nur aufpassen, daß 
du nicht über die maximalwerte entsprechend der Taktgeschwindigkeit 
hinausgehst.

Wenn das immernoch nicht zieht, empfehle ich alle Leitungen zum Display 
auf kurzschlüsse bzw unterbrechnungen zu untersuchen.
#944977
Lesenswert?

Du möchtest die Daten auf D4-7 übertragen ?
Du machst das aber genau umgekehrt, du überträgst auf D0-3:

LCD_PORT = (  (LCD_PORT & 0x0F) | (temp1 & 0xF0) );  // ausgeben

Du muss 0x0F und 0xF0 vertauschen.
Entsprechend muss dann auch noch
 unsigned char temp2 = (temp1<<4);
angepasst werden.
#944990
Lesenswert?

Benedikt K. wrote:
> Du möchtest die Daten auf D4-7 übertragen ?
> Du machst das aber genau umgekehrt, du überträgst auf D0-3:

Kann es sein, daß du dich vertutest?

> LCD_PORT = (  (LCD_PORT & 0x0F) | (temp1 & 0xF0) );  // ausgeben

Das ist m. E. absolut korrekt.
1
LCD_PORT & 0x0F
blendet D4-7 vom bestehenden Port aus. Dann werden mit
1
temp1 & 0xF0
von temp1 D4-7 in LCD_PORT übernommen.
#944999
Lesenswert?

Sönke Paschko wrote:
> zum Timingproblem: es wird ja was angezeigt, nur kein a wnn ich ein a
> sende.

Ja, das spricht für ein Timingproblem...z.B. wenn durch eine 
Befehlsausführung ein Nibble auf dem Bus am Display "vorbei" geht. 
Wärend der Displaykontroller "buzy" ist, nimmt er Signale auf dem Bus 
nicht wahr.

Durch eine falsche Beschaltung (kurzschluss unterbrechung) kann es aber 
auch sein, daß gewisse signale falsch interpretiert werden. Hat der 
ATmega128 nicht auch JTAG defaultmässig eingeschaltet?
#945081
Lesenswert?

momentan bin ich auf was gestoßen, ich habe manuell direkt nach dewr 
Initialisierung folgende Daten an das LCD gesendet:
1
_delay_ms(1000); // 1 sec warten
2

3
    _delay_ms(1);
4

5
   LCD_PORT = 0b01100010;
6
      lcd_enable();
7

8
    _delay_ms(1);
9

10
   LCD_PORT = 0b00110010;
11
      lcd_enable();

man sollte laut tabelle meinen, dass ein zeichen richtig angezeigt wird. 
so ist es auch. hierbei wird eine "6" angezeigt. andere zeichen 
funktionieren genauso. wenn ich aber zwei zeichen hintereinander 
anzeigen lasse (auf die gleiche Weise) werden bei gewolltem Anzeigebild 
"6+" folgende Buchstaben angezeigt: "&;" diese zeichen stehen jeweils in 
der selben reihe mit den Sollzeichen (in der Ascitabelle)??
#945146
Lesenswert?

spess53 wrote:

> Also wenn bei deinem geposteten Code '6' rauskommt, stimmt etwas nicht.

Doch, das passt schon, zumindest halb
Er verwendet den 4bit Modus.
Das Bitmuster ist daher 01100011
Allerdings ist '6' eigentlich 00110110, also genau umgekehrt.
Ich vermute da ist bei der Initialisierung irgendwas durcheinander, 
wodurch High und Low Nibble sich verschieben.
#945164
Lesenswert?

ah das kann sein, ich poste mal die Initialisierung:
1
   LCD_PORT = 0b00100000;
2
     lcd_enable();
3
    _delay_ms(1);
4

5
     lcd_enable(); // 2 mal senden
6
    _delay_ms(1);
7

8
   LCD_PORT = 0b00000000;
9
     lcd_enable();
10
       _delay_ms(1);
11

12
     lcd_enable();  // 2 mal senden
13
    _delay_ms(1);
14

15
   LCD_PORT = 0b11110000;
16
      lcd_enable();
17
    _delay_ms(1);
18

19
   LCD_PORT = 0b00000000;
20
      lcd_enable();
21
    _delay_ms(1);
22

23
   LCD_PORT = 0b00010000;
24
      lcd_enable();
25
    _delay_ms(1);
26

27
   LCD_PORT = 0b00000000;
28
      lcd_enable();
29
    _delay_ms(1);
30

31
   LCD_PORT = 0b01100000;
32
      lcd_enable();
33

34
    _delay_ms(15);

PS: die hab ich aus dem Datenblatt von meinem LCD übernommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren