- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 38 von 38

Thema: LCD an ATmega32

  1. #31
    Benutzer Stammmitglied
    Registriert seit
    12.08.2010
    Ort
    Zürich
    Alter
    60
    Beiträge
    39
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von 021aet04 Beitrag anzeigen
    Ich werde es testen, es könnte aber sein das du die Frequenz ändern musst, da ich keinen 16Mhz Quarz habe und kein Bascom verwende. Ich programmiere in C mit dem AVR Studio.
    Ich habe das LCD mit Bascom programmiert, da ich ausschliessen wollte, dass der Fehler in der Software liegt. Kannst Du mir Dein C Sourcecode rüberbeamen?

    Als Greenhorn habe ich mich mit der Verbindung vom LCD auf Port C vertan. Könnte sein, dass ich den Bug dort entfernen kann. Bin trotzdem dankbar für den Quellecode in C.

  2. #32
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Ich kann dir den Quellcode geben.

    Die eigentliche Routine ist:
    Code:
    #include "HD44780.h"
    
    void LCD_Ctrl (unsigned char data)
    {
    
        PORTB &= ~(1<<RS);
    
    //erstes Nibble
    
        PORTC = ((data & 0xF0)>>4);
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
    
    //zweites Nibble
    
        PORTC = data & 0x0F;
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
    
        _delay_us(100);
    
    }
    
    void LCD_Home (void)
    {
    //Display löschen und auf Homeposition setzen
        LCD_Ctrl (0x01);
        _delay_ms(1);
        LCD_Ctrl (0x02);
        _delay_ms(5);    
    }
    
    void LCD_Data (unsigned char data)
    {
        _delay_us(100);
    
    //erstes Nibble
    
        PORTC = ((data & 0xF0)>>4);
        PORTB |= (1<<RS);
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
    
    //zweites Nibble
    
        PORTC = data & 0x0F;
        PORTB |= (1<<RS);
        PORTB |= (1<<EN);
        asm volatile ("nop");
        PORTB &= ~(1<<EN);
            
        PORTB &= ~(1<<RS);
    
        _delay_us(100);
    }
    
    void LCD_Init(void)
    {
        DDRC |= 0x0F;                    //PC0 - PC3 als Ausgang
        DDRB |= (1<<PB6) | (1<<PB7);    //RS und EN als Ausgang
    
        _delay_ms(15);
        LCD_Ctrl (0x28);
    
        _delay_ms(5);
        LCD_Ctrl (0x28);
    
        _delay_ms(1);
        LCD_Ctrl (0x28);
    
    /*    0b00001DCB
            0        1
    D:         Display
           aus     ein
    C:         Cursor
           aus     ein
    B:         Blinken
           aus     ein
    0x0F: Display ein, Cursor sichtbar, Blinken ein
    0x0E: Display ein, Cursor sichtbar, Blinken aus
    0x0C: Display ein, Cursor unsichtbar, Blinken aus
    
    */
        _delay_ms(1);
        LCD_Ctrl (0x0C);
    
        _delay_ms(1);
        LCD_Ctrl (0x01);
    
        _delay_ms(1);
        LCD_Ctrl (0x02);
    
        _delay_ms(5);
    
    }
    
    void LCD_Pos (unsigned int zeile, unsigned int spalte)
    {
        LCD_Ctrl (0x80 + spalte - 1+ 0x40 * (zeile - 1));
        _delay_us (100);
    }
    
    void LCD_String (char text [20])
    {
        unsigned int i=0;
        
        while ((!(text[i] == 0)) & (i < 20))
        {
            LCD_Data (text[i]);
            i++;
        }
    }
    
    void LCD_Integer (unsigned int data)
    {
        unsigned char a;
    
        a = (data % 10000)/1000;        //Tausender
        LCD_Data (a + 48);
    
        a = (data % 1000)/100;            //Hunderter
        LCD_Data (a + 48);
    
        a = (data % 100)/10;            //Zehner
        LCD_Data (a + 48);
    
        a = data % 10;                    //Einer
        LCD_Data (a + 48);
        
    }
    Ich habe 1:1 vom Buch "Basiskurs R8C/13" von Elektor genommen (nur Ports,... an den AVR angepasst).

    In der HD44780.h sind nur andere Headerdateien, die man benötigt (z.B. damit man "PORTX",... nutzen kann), und es ist noch RS bzw EN definiert.

    Die einzelnen Funktionen sind:
    LCD_Ctrl => wird verwendet um das LCD einzustellen (Kommandos senden), LCD wird gelöscht und Cursorposition wird auf Home gesetzt
    LCD_Data => wird verwendet um Daten an das LCD zu senden, damit etwas angezeigt wird
    LCD_Init => stellt die benötigten Pins auf Ausgang, stellt das LCD ein
    LCD_Home => löscht das Display und setzt den Cursor auf die Grundposition (Zeile 1, Spalte 1)
    LCD_Pos => springe zu Cursorposition
    LCD_String => übergibt einen String an das LCD
    LCD_Integer => übergibt eine Zahl von "0000" bis "9999" an das Display, inkl. auftrennen der einzelnen Stellen

    Das Beispiel von dir würde dann in etwa so aussehen (die Headerdateien,... fehlen noch, die Main funktioniert aber so):

    Code:
    .........
    
    int main (void)
    {
         LCD_Init;
         LCD_String ("16x4 LCD Display");
         LCD_Pos (2, 1);
         LCD_String ("----------------");
    }

  3. #33
    Benutzer Stammmitglied
    Registriert seit
    12.08.2010
    Ort
    Zürich
    Alter
    60
    Beiträge
    39
    Ich werde zum Lötkolben greifen und das LCD mit einer Stiftleiste versehen. Damit sollte die Verbindung zu einem Steckbrett ohne Probleme möglich sein.

  4. #34
    Benutzer Stammmitglied
    Registriert seit
    12.08.2010
    Ort
    Zürich
    Alter
    60
    Beiträge
    39
    Mit grosser Freude kann ich endlich aufatmen: Mit der Unterstützung von http://newbiehack.com/MicrocontrollerTutorial.aspx habe ich mein 16x4 LCD zum Laufen gebracht habe. Ein grosses Danke auch an Euch für die Beiträge hier in diesem Strang.

    Zur Zeit läuft noch alles auf einem Steckbrett und im 8-bit Modus, egal, ich kann Strings übermitteln und ausgeben. Da ich keine vernünftige Doku zur Programmierung des LCD gefunden habe, werde ich etwas experimentieren müssen. Bis bald.

  5. #35
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Hat es einen Fehler oder mehrere Fehler gegeben?
    Vielleicht hilft dir der Link weiter http://www.pacificdisplay.com/lcd_mod_if.htm
    Es gibt auch 2 Links zu PDF Dateien, eventuell hilft dir das weiter.

    MfG Hannes

  6. #36
    Benutzer Stammmitglied
    Registriert seit
    12.08.2010
    Ort
    Zürich
    Alter
    60
    Beiträge
    39
    Hallo Hannes
    Woran es vorher lag, kann ich immer noch nicht sagen. Über den fertig aufgebauten ATmega32 Controller Board und dem Bascom-USB-ISP Programmer wollte es einfach nicht. Ich habe es dann genau wie im angegebenen Tutorial mit einem Pocket Programmer und einer selbstgelöteten Verbindung zu einem Steckbrett mit einem ATmega32 Chip versucht, den C Code mit WinAVR eingegeben, kompiliert und übertragen und siehe da, es tut!

    Klicke auf die Grafik für eine größere Ansicht

Name:	DarioNoahLCD.jpg
Hits:	15
Größe:	45,2 KB
ID:	23393

    (Noah und Dario sind die Namen meiner Söhne). Kleiner Schönheitsfehler: Der Cursor ist sichtbar.

    Mir ist zur Zeit noch nicht klar, ob die Programmierung eines LCD wirklich so komplex sein muss, wie im Tutorial mit dem Mister LCD sein muss. Danke jedenfalls für die Links.
    Geändert von tuttle64 (20.10.2012 um 12:21 Uhr)

  7. #37
    Benutzer Stammmitglied
    Registriert seit
    12.08.2010
    Ort
    Zürich
    Alter
    60
    Beiträge
    39
    Es geht weiter mit dem nächsten Projekt: Nachdem schön längere Zeit das Buch "AVR-Mikrokontroller in C programmieren" im Regal steht, habe ich etwas darin geblättert und die Vorgaben bis und mit Peripherie zusammengesteckt. Dort gehört zum Basissystem auch ein 2 x 16 LCD Display. Leider hat mein Hardware-Shop heute geschlossen so dass ich die Teile erst am Montag besorgen kann.

    Ich muss sagen, das Thema Programmer wird im genannten Buch mehr als dürftig behandelt. Ich hatte das Glück, dass ich bereits den Pocket Programmer über ein selbstgebasteltes SPI Interface verbinde und den verwendeten ATmega8 so ansprechen kann.
    Geändert von tuttle64 (21.10.2012 um 23:02 Uhr)

  8. #38
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von tuttle64 Beitrag anzeigen
    Mir ist zur Zeit noch nicht klar, ob die Programmierung eines LCD wirklich so komplex sein muss, wie im Tutorial mit dem Mister LCD sein muss.
    Im 4-bit-Modus sollte es wesentlich einfacher sein.
    Grüße
    Thomas

Seite 4 von 4 ErsteErste ... 234

Ähnliche Themen

  1. I2C an ATMEGA32
    Von WeiserDruide im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 31.07.2010, 13:27
  2. ADC mit ATmega32
    Von Jannik im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 12.03.2008, 09:36
  3. datenaustausch von atmega32 zu atmega32 über spi usw...
    Von roboterheld im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.10.2007, 23:39
  4. Speicherplatz des ATmega32 + Display an ATmega32
    Von Rob.Anfänger im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 19.11.2006, 02:59
  5. ATMega32
    Von AceKiller73 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 29.04.2006, 22:51

Berechtigungen

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

Solar Speicher und Akkus Tests