mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Atmega EA DOGM163x-A 4-bit


Autor: B. H. (bluehazzard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche gerade das EA DOGM163x-A (3 Zeiliges LCD mit ST7036 
controller) im 4bit Modus zum laufen zu bekommen. Mein Controller ist 
ein Atmega32 mit integriertem Taktgeber von 1Mhz (wird später aber mit 
16MHz betrieben)
Mein Problem ist, dass die Pin Belegung schon vorgegeben ist:
#define DB4    PA7
#define DB5    PA6
#define DB6           PA5
#define DB7    PA4 

Also das Display hängt am PORTA aber die Pins sind vertauscht also: PA7 
-> DB4 usw... (wie man dem #define entnehmen kann...).

Ich habe nun eine Initialisierungsroutine geschrieben, aber sie 
funktioniert nicht:
void lcd_init()
{
     LCD_DDR = LCD_DDR | 0xF0 | (1<<LCD_RS) | (1<<LCD_EN);   // Port auf Ausgang schalten

     LCD_PORT |= (1<<LCD_EN);
  LCD_PORT &= ~(1<<LCD_RS);
  _delay_us(40);      //Hier eventuell 40ms wie im Datenblatt
  
  LCD_PORT |= (1<<DB4) | (1<<DB5);
  lcd_enable();
  _delay_ms(2);      //Hier konnte man auch rumschrauben...
  lcd_enable();
  _delay_us(30);
  lcd_enable();
  _delay_us(30);
  
  LCD_PORT &= ~(1<<DB4);
  lcd_enable();
  _delay_us(30);

  //LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  //Das ganze noch einmal                    //Function set
  lcd_enable();
  //Jetz das untere Byte
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB7) | (1<<DB4);
  lcd_enable();
  _delay_us(30);
  
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Internal OSC Frequenze
  LCD_PORT |= (1<<DB4);
  lcd_enable();
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB6) | (1<<DB4);
  lcd_enable();
  _delay_us(30);

  
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Contrast set
  LCD_PORT |= (1<<DB6) | (1<<DB5) | (1<<DB4);
  lcd_enable();
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  
  LCD_PORT |= (1<<DB7) | (1<<DB6);
  lcd_enable();
  _delay_us(30);

  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Power ICON Contrast control
  LCD_PORT |= (1<<DB6) | (1<<DB4);
  lcd_enable();
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB7) | (1<<DB6);
  lcd_enable();
  _delay_us(30);

  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Follower Controll
  LCD_PORT |= (1<<DB6) | (1<<DB5);
  lcd_enable();
  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB7) | (1<<DB6);
  lcd_enable();
  _delay_us(30);

  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Display ON/OFF control
  //LCD_PORT |= (1<<DB6) | (1<<DB5);
  lcd_enable();
  //LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7);
  lcd_enable();
  _delay_us(30);

  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Display Loschen Cursor Home
  //LCD_PORT |= (1<<DB6) | (1<<DB5);
  lcd_enable();
  //LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB4);
  lcd_enable();
  _delay_us(30);

  LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));  //Display Loschen Cursor Home
  //LCD_PORT |= (1<<DB6) | (1<<DB5);
  lcd_enable();
  //LCD_PORT &= ~((1<<DB4) | (1<<DB5) | (1<<DB6) | (1<<DB7));
  LCD_PORT |= (1<<DB5) | (1<<DB6);
  lcd_enable();
  _delay_us(30);

} 

im moment schaut sie sperrig aus, aber ich werde sie, wenn sie 
funktioniert schon noch zusammenfassen....
Findet hier jemand den Fehler? Angeschlossen ist alles richtig, das habe 
ich schon überprüft.

mfg.
und Danke.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum schreibst Du das in C - das geht doch in Hex viel übersichtlicher 
:-)

Sorry, aber lesbar ist der Code nicht wirklich, wer soll sich das 
antun?

Hans

Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans wrote:
> Warum schreibst Du das in C - das geht doch in Hex viel übersichtlicher
> :-)
Das musst du mir vormachen... also das in HEX schreiben G

Autor: AVR-Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

 so schaut es aus, wenn es funktioniert(DOGM163).
 Beachte meine 4Bit und 8Bit Anweisungen.
 Der Code ist halt nur bei mir lauffähig, aber die Reihenfolge der 
Befehle (Hex-Werte) ist einzuhalten.

 #ifdef LCD_DATA_4BIT      /* Function set1. */
   lcdControlWrite(0x28);   /* 4 Bit   */
  #else
   lcdControlWrite(0x38);   /* 8 Bit  */
  #endif

  #ifdef LCD_DATA_4BIT    /* Function set2. */
   lcdControlWrite(0x29);    /* 4 Bit   */
  #else
   lcdControlWrite(0x39);    /* 8 Bit  */
  #endif                   /* Function set2. */

  lcdControlWrite(0x15);    /* Bias 1/5, 2 lines. */
  lcdControlWrite(0x55);    /* Power/ICON/Contrast control.*/
  lcdControlWrite(0x6E);    /* Follower control. */
  lcdControlWrite(0x72);    /* Booster on, Contrast set.

 #ifdef LCD_DATA_4BIT      /* switch back to instruction */
  lcdControlWrite(0x28);  /* 4 Bit   */
 #else
  lcdControlWrite(0x38);   /* 8 Bit  */
 #endif

    lcdControlWrite(0x0F);    /* Display on. */
    lcdControlWrite(0x01);    /* Clear display. */
    lcdControlWrite(0x06);    /* Entry mode set. */

Gruß avr-tester

Autor: AVR-Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, bin nochmals da, habe was vergessen!

Schau dir doch mal meine Homepage an, da findest du einige Infos zu 
DOGM's

http://www.basteln-mit-avr.de/

Gruß AVR-Tester

Autor: B. H. (bluehazzard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans:
Das der Code so schwerer zu lesen ist weis ich, aber wenn man nur 
schnell mal ein bit löschen oder setzen will, kommt es mir so effektiver 
vor...
Wie ich schon schrie werde ich dann alles in Hex umschreiben, wenn es 
mal funktioniert....

@ AVR-Tester:
Danke für den Beispielcode, ich werde die Reihenfolge testen..., aber 
was für Wartezeiten benutzt du? die wie sie im Datenblatt des st**** 
angeführt sind?
Deine Seite habe ich übrigens schon mit meinem Freund google gefunden, 
aber leider keinen passenden Beispielcode...

mfg.
und danke

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ OP:
Suchst du sowas:
#define LCD_D4 (1<<PA7)
#define LCD_D5 (1<<PA6)
#define LCD_D6 (1<<PA5)
#define LCD_D7 (1<<PA4)
#define LCD_DATA_MASK (LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7)
/* REMAP() unbedingt auf Konstanten anwenden
   Damit der Compiler das alles aufloesen kann */
#define REMAP(_byte) (( _byte & (1<<4)? LCD_D4 : 0)\
                     |( _byte & (1<<5)? LCD_D5 : 0)\
                     |( _byte & (1<<6)? LCD_D6 : 0)\
                     |( _byte & (1<<7)? LCD_D7 : 0))
//...
LCD_PORT = LCD_PORT              // Falls es noch mehr pins gibt ;)
           & ~LCD_DATA_MASK      // loesche Datenbits
           | REMAP( daten_byte); // setze neue Daten
Und sortier' deinen Code aus (extra static Funktion zum Nibble-, 
(Daten-,Befehls-)Byteübertragen), _delay_ms() ist wahrscheinlich besser 
um 40ms zu warten, definiere Namen (Macros) für die LCD-Befehle usw.

hth, Jörg

Autor: B. H. (bluehazzard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
@Jörg: Danke, das hilft mir schon km weit weiter!!!!

Jetzt habe ich das Display so weit, dass es mir einen Cursor Anzeigt, 
und dieser blinkt auch.
Wenn ich nun einen Buchstaben Sende hüpft der Cursor zwar eine Stelle 
weiter, aber es erscheint kein Zeichen auf dem Display....

Zudem flackert es ab und zu, nicht die Hintergrundbeleuchtung, sondern 
die Flüssigkristalle, an was könnte das liegen?

mfg.

Autor: AVR-Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo bluehazzard,

Wennn der Code stimmt, und das  Ganze lauffähig ist, ist die Wartezeit 
nicht das Thema. Da kann man ordentlich drehen. Generelle gilt, lieber 
die Zeiten vergrößern als kürzen.
Wenn im Datenblatt 40ms steht solltest Du auch die Zeit verwenden.
Meine: delay(60000);  // wait 60ms an diesem Punkt
Bei den 26,3us verwende ich 40us. Mit Oszi. am Port kontrolliert!!

Des weiteren ist am Ende der Routine ein weiterer Reset nötig.
Hier sollten die Zeiten bei einigen 100ms sein. Besser eine Sekunde 
warten.

Eine Erfolgreiche Init. ist ohne nachfolgende Daten nur schwer zu 
überprüfen. Das Ding macht ohne Daten nichts!
Stimmt das Senden der Daten auch nicht, drehst du dich im Kreis.

Ich würde mir mal ein lauffähiges System installieren. Dann weis man 
dass die Hardware (DOGM163) in Ordnung ist. Es gibt im Internet 
mittlerweile diverse kleine und erprobte Programme die deinem sehr 
ähnlich sind.

Dann , und nur dann würde ich meinen Code verwenden und geringfügige 
Displayänderungen durchführen.

Noch was zu Deinen kleinen Änderungen an den Display-Rourinen:
In einer gut geschrieben Display-Lib ist es ein Klacks auch die 
kleinsten Änderungen im Modus zu bewerkstelligen.

Zwei Routinen in einem Programm sind immer schlecht.

Das soll aber Deinen Ergeiz nicht bremsen, so und nicht anders habe ich 
auch meine Kenntnisse im Bereich AVR vertiefen können.

PS: Mir geht es zur Zeit mit dem Atxmegas genau so. Bit für Bit alles 
neu erkunden.


Gruß AVR-Tester

Autor: B. H. (bluehazzard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
"Ich würde mir mal ein lauffähiges System installieren. Dann weis man
dass die Hardware (DOGM163) in Ordnung ist. Es gibt im Internet
mittlerweile diverse kleine und erprobte Programme die deinem sehr
ähnlich sind."

Diese Möglichkeit habe ich leider nicht.... bin ziemlich in der Pampa 
was elektronische Bauteile betrift, und brauche mindestens 3 Wochen um 
eine weitere Platine zu erstellen, muss das ganze aber so schnell wie 
möglich zum Laufen bringen.

Ich habe das Display mittlerweile so weit, dass es ohne Probleme Startet 
und sich initialisiert. Auch das flackern ist weg.
Mein Problem ist jetzt, dass es wenn ich es einschalte Sinnlose Zeichen 
zeigt, und der Befehl clr display keine Reaktion hervorruft. Wenn ich 
nun Daten schicke wandert zwar der Zeiger, aber es erscheinen keine 
Zeichen auf dem Display, und die die schon dort waren werden einfach 
übersprungen.
Was könnte da falsch sein?

mfg.
und Danke

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.