- Labornetzteil AliExpress         
Ergebnis 1 bis 8 von 8

Thema: probleme mit lcd ansteuerung

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.11.2004
    Beiträge
    365

    probleme mit lcd ansteuerung

    Anzeige

    Praxistest und DIY Projekte
    hi
    ich hab hier einen atmega 8 und ein 2x16 lcd. jetzt wollte ich mal versuchen das lcd anzusprechen.

    ich weis zwar dass es fertige libs gibt aba ich würde es gerne selbst machen. leider haut das nicht so ganz hin und jetzt wollt ich fragen ob mir evtl jemand einen tipp geben kann. ich will garkeine vollständige lösung(da könnt ich mir gleich die lib suchen) aba ein kleiner schubs in die richtige richtung währe supa.

    also mal zu meiner situation:
    atmega8
    lcd 16x2
    lcd hängt an portc
    pc0-3->db4-7 (ich will also im 4 bit mode arbeiten)
    pc4->enable
    pc5->rs

    r/w liegt auf masse ausser evtl dem busy flag gibts eh nix zum auslesen.

    also jetzt zu meinem code:
    hier hab ich mal eine routine um das untere nibble zu senden:
    Code:
    void LCD_out_low(uint8_t RS, uint8_t out){
     uint8_t out_low;
     
     port=0x00;
     
     out_low  = out;
     out_low |= (1<<4|RS<<5|0<<6|0<<7);
     
     port |= (RS<<5);
     enable_on;
     port=out_low;
     enable_off;
     
     port=0x00;
    }

    das ganze hab ich auch fürs obere nibble:
    Code:
    void LCD_out_high(uint8_t RS, uint8_t out){
     uint8_t out_high;
     
     port=0x00;
     
     out_high  = (out>>4);
     out_high |= (0<<4|RS<<5|0<<6|0<<7);
     
     port |= (RS<<5);
     enable_on;
     port=out_high;
     enable_off;
     
     port=0x00;
    }
    und hier für beide nibbles (erst das obere dann das untere):

    Code:
    void LCD_out(uint8_t RS, uint8_t out){
     uint8_t out_low, out_high;
     
     port=0x00;
     
     out_high  = (out<<4);
     out_high |= (0<<4|RS<<5|0<<6|0<<7);
     
     
     
     port |= (RS<<5);
     enable_on;
     port=out_high;
     enable_off;
    
     out_low  = out;
     out_low |= (0<<4|RS<<5|0<<6|0<<7);
     
     
     enable_on;
     port=out_low;
     enable_off;
     
     port=0x00;
    }
    die port=0x00 kann man eigentlich weglassen aba ich habs zur sicherheit mal da lassen.

    stimmt das soweit mal? oda hab ich da schon den fehler?

    und wie geht das jetz mit der initialisierung?

    das lcd ist doch eigentlich schon initialisiert und muss nur auf 4 bit mode umgestellt werden.
    meine init sequenz hab ich leider versehentlich ganz gelöscht aba ich werd morgen eine neue schreiben.

    allerdings währe es supa wenn mir bis dahin mal wer sagen könnte ob die befehle oben soweit in ordnung sind.

    aja sollte irgendjemand ne gute seite mit infos zum ansteuerungsprokoll oda mit allgemeiner c- syntax haben würd ich mich natürlich auch freuen.


    mfg
    macgyver
    irren ist menschlich
    unmenschen irren trotzdem

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    also was mir so auffällt, ist die Wartezeit zwischen setzen und löschen des enable Bits, das sollte schon ein paar µs aktiv sein, nach meinem DB 40µs, wenn man das Busy abfrägt.
    Wenn ich schaue was Bascom macht, sind es IIRC 180 µs bevor es die nächsten Daten sendet.
    Es gibt da auch Befehle, die die eine oder andere ms zeit brauchen !

    HTH

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.11.2004
    Beiträge
    365
    hi
    wollt nur sagen dass ich es jetztgeschafft habe das lcd zu initialisieren und zu beschreiben. (das einzig komische ist dass er jeden string den ich nicht vollschreibe mit müll auffüllt.)

    nur wie binde ich die ganzen funktionen jetzt in ein anderes programm ein?
    einfach in eine .h datei schreiben und die einbinden?

    aja und wie wandle ich ein uint oda float in einen string um?

    mfg
    irren ist menschlich
    unmenschen irren trotzdem

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    in den Header (*.h) gehoren nur die Prototypen, also die Deklarationen. Die Definitionen (Implementierungen stehen in der Quelle (*.c)

    Wenn LCD_out_high bekannt sein soll, dann steht im Header zB

    extern void LCD_out_high(uint8_t RS, uint8_t out);
    oder
    extern void LCD_out_high (uint8_t, uint8_t);

    Zu beachten ist, daß wenn du das includest, auch die <inttypes.h> gebraucht wird (wegen uint8_t etc). Die gibt's zB mit <avr/io.h>. Oder explizit angeben.
    For Umwandlungen guckst du in die doc zur avr-libc.
    Disclaimer: none. Sue me.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.04.2004
    Beiträge
    121
    itoa() und umgekehrt mit atoi()
    funktioniert ziemlich gut

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.11.2004
    Beiträge
    365
    hi
    dumme frage evtl aba was konvertiert zu was?

    mfg
    irren ist menschlich
    unmenschen irren trotzdem

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Wenn man das englisch ließt, kann mans erahnen:

    i to a -> Integer nach Ascii
    a to i -> Ascii nach Integer

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.11.2004
    Beiträge
    365
    ahh danke

    hätte ich mir eigentlich denken können.

    mfg
    irren ist menschlich
    unmenschen irren trotzdem

Berechtigungen

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

12V Akku bauen