www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD ansprechen Probleme


Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht 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:

 void lcd_data(unsigned char temp1){

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

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

  lcd_enable();           // Enableimpuls senden                    
  _delay_us(42);

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

  lcd_enable();           // Enableimpuls senden                   
  _delay_us(42);


  }

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso und zur ergänzung noch es wird ein zeichen angezeigt, nur nicht 
das, was ich sende. irgendwann rückt nurnoch der cursor vor, ohne dass 
Zeichen angezeigt werden.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
inwiefern angepasst?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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.
LCD_PORT & 0x0F 
blendet D4-7 vom bestehenden Port aus. Dann werden mit
temp1 & 0xF0 
von temp1 D4-7 in LCD_PORT übernommen.

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum Timingproblem: es wird ja was angezeigt, nur kein a wnn ich ein a 
sende.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niels Hüsken wrote:
> Kann es sein, daß du dich vertutest?

Ja, hast recht. Ich bin noch im Halbschlaf, bei der Hitze kann ich nicht 
schlafen.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab gerade mal nachgeschaut. JTAG ist beim mega128 per default 
eingeschaltet. Ich hoffe deine Portwahl ist nicht auf PortF gefallen?! 
:)

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein ist Port D, ich habe die delays jezt auf 60 us gesezt und es geht 
immer noch nicht.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du schonmal versucht den Cursor an eine andere Stelle zu setzen ?
Wenn das geht, dann liegt der Fehler nur in dieser Funktion und nicht 
irgendwo anderst.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sönke Paschko wrote:
> nein ist Port D, ich habe die delays jezt auf 60 us gesezt und es geht
> immer noch nicht.

du hast doch noch ein paar mehr delays als nur diese beiden....
Schreck auch nicht davor zurück, mal ein paar delay_ms() einzubauen...

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
momentan bin ich auf was gestoßen, ich habe manuell direkt nach dewr 
Initialisierung folgende Daten an das LCD gesendet:

_delay_ms(1000); // 1 sec warten

    _delay_ms(1);

   LCD_PORT = 0b01100010;
      lcd_enable();

    _delay_ms(1);

   LCD_PORT = 0b00110010;
      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)??

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Also wenn bei deinem geposteten Code '6' rauskommt, stimmt etwas nicht. 
Deine Binärzahlen entsprechen ASCII 'b' und '2'.
Ist in BASCOM folgendes möglich  'LCD_PORT = '6';' ?

MfG Spess

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah das kann sein, ich poste mal die Initialisierung:

   LCD_PORT = 0b00100000;
     lcd_enable();
    _delay_ms(1);

     lcd_enable(); // 2 mal senden
    _delay_ms(1);

   LCD_PORT = 0b00000000;
     lcd_enable();
       _delay_ms(1);

     lcd_enable();  // 2 mal senden
    _delay_ms(1);

   LCD_PORT = 0b11110000;
      lcd_enable();
    _delay_ms(1);

   LCD_PORT = 0b00000000;
      lcd_enable();
    _delay_ms(1);

   LCD_PORT = 0b00010000;
      lcd_enable();
    _delay_ms(1);

   LCD_PORT = 0b00000000;
      lcd_enable();
    _delay_ms(1);

   LCD_PORT = 0b01100000;
      lcd_enable();

    _delay_ms(15);

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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal das Datenblatt. 44780 kompatibel ist das nämlich nicht. Bei dem 
sieht die Init etwas anderst aus. (3x 0011 senden usw.)

Autor: Sonke A. (soeni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und welches hast du nun?

MfG Spess

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach die Pausen beim Init mal sehr viel länger. Laut Datenblatt muss man 
nach dem ersten Befehl >4,1ms warten.
Auch der return home Befehl braucht 1,5ms.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.