- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: LCD 4*20 mit ATMEGA32/16MHZ....

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26

    LCD 4*20 mit ATMEGA32/16MHZ....

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Tag zusammen!
    Ich beschäftige mich seit numehr 4 Tagen mit einem RN-Board(1.4Mega32) und einem 4*20 Display mit dem Standart adapter!

    Zunächst habe ich auf dem Bord etwas aufräumen müssen damit ich die Ports so nutzen konnte wie ich es für mein Projekt brauchte!Motortreiber und das Ic für die serielle Schnittstelle raus und R13 und R14 getrennt!

    Dann habe ich das Display mit dem 10-pooligen Wannenstecker in Port-C eingesteckt und den Jtag mit dem ProgTool nicht enabled also deaktiviert!
    Die 4Datenleitungen DB4-DB7 habe ich im Wannenstecker umgedreht das sie aufsteigend von PC0-PC3 angeschlossen sind!

    Bisher kann ich aber nur über PC4 die Hintergrundbeleuchtung schalten!

    Ich habe nun die letzten 30 Stunten damit verbracht irgendwie wenigstens mal dem LCD auch nur ein Pixel zu entlocken aber Fehlschlag!
    Ich habe die verschiedensten lcd.c und ..h ins Programm eingebunden und das Makefile geändert aber alles vergebens das Display zeigt mir nichts an ich bin ratlos!

    Ich programmiere in c aber ich finde immer nur Programmierungen in GCC oder Bascom, aber damit kann ich nichts anfangen!

    Ds LCD muß im 4-Bit_Modus programmiert werden!

    Ich weiß das es eine Blöde Frage ist aber WAS NUN???

    Prozessor ATMEGA32 //Quarz 16MHz //
    EDIT:Ich brenne mit dem mySmartusb MK2 via ISP

    Grüße Stephan

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Hallo,
    als erstes solltest du testen, ob der Kontrast richtig eingestellt ist.

    Wenn das Display mit Strom versorgt wird und noch keine Daten vom
    Mikrocontroller erhalten hat, müssen zumindest in der ersten Zeile
    schwarze Blöcke
    sichtbar sein (bei einem vierzeiligen wird wahrscheinlich
    auch die dritte Zeile mit Blöcken gefüllt sein).

    Wenn da nichts erscheint, dann passt der Kontrast noch nicht.
    Das wird ja meist über ein Poti eingestellt (den Adapter kenne ich
    persönlich jedoch nicht).

    Erst einmal muss das funktionieren, sonst brauchst du mit der Software
    noch garnicht anfangen

    Grüße,
    Bernhard

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Ich hoffe das nervt nicht wenn ich hier nur kurz anrworte !!???
    Habe den Kontrastregler eingestellt und in der 1. und 3. Reihe habe ich jetzt schwarze Balken!
    EDIT:Blöcke
    Grüße Stephan

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Eine kurze Rückmeldung ist immer gut.
    Jetzt kannst du ja nochmal dein Programm testen.

    Falls es immer noch nicht klappen sollte, dann könntest du mal alle elektrischen Verbindungen zum Display prüfen (mit Messgerät auf Durchgang prüfen).
    Kannst du Lötfehler ausschließen?
    Ansonsten bitte Programmcode hier rein kopieren.
    Ich habe immer noch nicht verstanden mit welcher Programmierumgebung du arbeitest.

    Grüße,
    Bernhard

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    Es tut sich immer noch nichts besonderes!(nur schwarze blöcke
    Ich programmiere mit ProgrammersNotepad von WINAVR und den atmega schreibe ich mit PrgTOOL von myAVR , das Makefile erstelle ich ebenfallls mit MAKEFILE von WINAVR

    Grüße Stephan
    Angehängte Dateien Angehängte Dateien

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Erstmal: WinAVR enthält avr-gcc (das schreibe ich nur weil du in deinem ersten Post etwas von GCC-Beispielen geschrieben hast^^)

    Hab mal den Code grob durchgeschaut.
    In der lcd_init wird der LCD_PORT zum Glück auf Ausgang geschaltet, das hätte ich sonst vermisst. Konnte sonst nichts Verdächtiges finden, würde weiterhin auf einen elektrischen Fehler tippen.
    Wenn ich das richtig sehe hast du EN auf PC5, RS auf PC7 und die Datenleitungen auf PC0...PC3. Vergleiche das bitte nochmal mit der Hardware. Sind die Leitungen wirklich durchverbunden und auch nicht vertauscht? (Ich habs mal geschafft RS und EN zu verwechseln...bis man das findet!)

    Grüße,
    Bernhard

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    So habe nochmal die Daatenblätter von dem LCD-Adapter der ja zu dem 4*20 LCD angeboten wurde durchgeschaut mit der Hardware verglichen und die Anschlüsse und durchkontaktierungen überprüft!
    Auch die Pc0 bis PC7 lasssen sich einzeln ansteuern also nun weiß ich auch nicht weiter!(habe zusätzlich die freien Daatenleitungen auf GND gesetzt!)

    Wenn ich jetzt zum Beispiel das c-Programm abspeichere und dann auf make all gehe, erstellt er mir keine neue HEX Datei weil irgend etwas faul ist!Dieser C-Umgebung zeigt aber auch keine Fehler oder so wie man das von normalen C_compilern kennt die dann am Rand nen Fehler anzeigen!

    Grüße Stephan


    EDIT: Jetzt kompiliert alles ich bekomme auch eine neue Hex-Datei , aber immer noch schwarze Kästen!! hat an eine slash gelegen der einzeln in der Gegend rumstand! Komisches Programm!!!???

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    habe zusätzlich die freien Daatenleitungen auf GND gesetzt
    Das würde ich nicht machen. Wenn das LCD, aus welchen Gründen auch immer, hier etwas ausgeben möchte, knallt´s! Ist eigentlich r/w mit GND verbunden?

    Ein 4x20-LCD an meinem RP6 (auch ein Mega32):

    https://www.roboternetz.de/phpBB2/ze...ag.php?t=41805

    Der Code (hoffentlich richtig an deine Belegung angepasst):

    Code:
     // LCD 20x4 (LMC-SSC4A20) an den PC0-3, PC5 und PC7               10.2.2011 mic
    
    // 4-Bit-Ansteuerung ohne busy-Abfrage:
    
    // 1 - GND - GND
    // 2 - Vcc - Vcc
    // 3 - Kontrast (0-0,5V)
    // 4 - RS - PC7
    // 5 - R/W - GND
    // 6 - E - PC5
    // 7 - nc
    // 8 - nc
    // 9 - nc
    // 10 - nc
    // 11 - Data4 - PC0
    // 12 - Data5 - PC1
    // 13 - Data6 - PC2
    // 14 - Data7 - PC3
    // 15 - A - Vcc
    // 16 - K - GND
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #define demospeed 50
    
    #define d4h	(PORTC|=1)
    #define d4l	(PORTC&=~1)
    #define d5h	(PORTC|=2)
    #define d5l (PORTC&=~2)
    #define d6h (PORTC|=4)
    #define d6l (PORTC&=~4)
    #define d7h (PORTC|=8)
    #define d7l (PORTC&=~8)
    #define eh  (PORTC|=32)
    #define el  (PORTC&=~32)
    #define rsh (PORTC|=128)
    #define rsl (PORTC&=~128)
    
    void strobe(void)
    {
       eh;
       _delay_ms(1);
       el;
    }
    void lcd_write8(uint8_t wert, uint8_t pause)
    {
       if(wert & 16) d4h; else d4l;
       if(wert & 32) d5h; else d5l;
       if(wert & 64) d6h; else d6l;
       if(wert & 128) d7h; else d7l;
       strobe();
       _delay_ms(pause);
    }
    void lcd_write4(uint8_t wert, uint8_t pause)
    {
       if(wert & 16) d4h; else d4l; // high nipple
       if(wert & 32) d5h; else d5l;
       if(wert & 64) d6h; else d6l;
       if(wert & 128) d7h; else d7l;
       strobe();
       _delay_ms(pause);
       if(wert & 1) d4h; else d4l; // low nipple
       if(wert & 2) d5h; else d5l;
       if(wert & 4) d6h; else d6l;
       if(wert & 8) d7h; else d7l;
       strobe();
       _delay_ms(pause);
    }
    void lcd_cls(void)
    {
       rsl;
          lcd_write4(1,2);
       rsh;
    }
    void lcd_locate(uint8_t x, uint8_t y)
    {
       rsl;
       switch (y) {
          case 0: lcd_write4(0x80+x, 40); break;    // 0. Zeile
          case 1: lcd_write4(0xc0+x, 40); break;    // 1. Zeile
          case 2: lcd_write4(0x94+x, 40); break;    // 2. Zeile
          case 3: lcd_write4(0xd4+x, 40); break;    // 3. Zeile
       }
       rsh;
    }
    void lcd_writeChar(uint8_t zeichen)
    {
       lcd_write4(zeichen,1);
    }
    void lcd_writeString(char *string)
    {
       while(*string)
          lcd_writeChar(*string++);
    }
    void lcd_init(void)
    {
       DDRC |= 0b10101111;
       PORTC &= ~0b10101111;
    
       rsl;
       _delay_ms(100);
       lcd_write8(0b00100000,100);   // Function Set: 4bit-Modus starten
       lcd_write4(0b00101000,40);      // Function Set: 2 Zeilen, Font 0 (0010NFxx)
       lcd_write4(0b00000001,40);      // Display Clear
       lcd_write4(0b00000110,40);      // Entry Mode Set: inc, no shift
       lcd_write4(0b00001100,40);      // Display On and Cursor
       //lcd_write4(0b00001111,40);   // Display On and Cursor
       rsh;
       _delay_ms(1);
    }
    int main(void)
    {
       uint8_t i;                    // Hilfsvariable
       lcd_init();                   // lcd initialisieren
    
       lcd_cls();                    // Display löschen
       lcd_locate(0,0);              // Schreibpositon festlegen
       for(i=0; i<20; i++) {lcd_writeChar('*'); _delay_ms(demospeed); }
       lcd_locate(0,1);
       for(i=0; i<20; i++) {lcd_writeChar('a'+i); _delay_ms(demospeed/2); }
       lcd_locate(0,2);
       for(i=0; i<20; i++) {lcd_writeChar('A'+i); _delay_ms(demospeed/3); }
       lcd_locate(0,3);
       for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }
       for(i=0; i<10; i++) {lcd_writeChar('0'+i); _delay_ms(demospeed/4); }
    
       _delay_ms(2000);
       lcd_cls();
       lcd_locate(2,0);
       lcd_writeString("RP6 ROBOT SYSTEM");
       lcd_locate(0,2);
       lcd_writeString("LC-Display an LED1-6");
       lcd_locate(9,3);
       lcd_writeString("16.7.08 mic");
    
       while(1){
       }
       return 0;
    }
    Vielleicht hilf dir das?

    btw. verwende ich fünf der sechs Datenleitungen gleichzeitig auch zum Einlesen von fünf Tastern ;)

    Poste mal dein aktuelles Programm... (bitte in Code-Tags)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.02.2011
    Beiträge
    26
    So, erstmal vielen Dank an alle die mir hier weitergeholfen haben!
    Ich habe einfach mal die letzten drei Stunden einen Temperatursensor gebaut also Zeitvertreib und dann habe ich mir gedacht das ich den RW Port einfach mal softwaremäßig auf 0 setze und den ganzen LCD-Port auf Ausgang und nun steht da TEST und in der nächsten Zeile Hello World ....
    Ihr habt das bestimmt schon öfter gesehen aber ich habe gerade Mondlandungsfeeling!

    Vielen Dank nochmal und viele Grüße Stephan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen