- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: EA DIP204-4 an Atmega48

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356

    EA DIP204-4 an Atmega48

    Anzeige

    Powerstation Test
    Hallo,
    Ich habe mir ein Display EA DIP204-4 von Reichelt schicken lassen, das einen KS0073 Kontroller enthält und das ich nun über 4Bit ansteuern will.
    Ich habe dazu schon ein wenig gegooglet und unter anderem das gefunden:
    http://www.mikrocontroller.net/topic/79603
    Also schnell auf einen mega48 geflasht, drähte an das Display und an mein MyAVR mit dem kontroller gehangen, damals noch Steuer und Datensignale auf verschiedenen PORTS.
    Jetzt hab ich den controller auf die Platine gelötet (leider ohne sockel, da er sonst nicht unter das Display passt) und die Pins in der Lib geändert.
    Doch jetzt passiert plötzlich nichts mehr.
    Ich bin langsam am verzweifeln, denn das Display initialisiert nicht.
    Der Controller funktionierd noch und das Display dürfte eigentlich auch nicht defekt sein.
    Ich vermute mal das es daran liegt, dass ich jetzt Steuer und Daten auf einem Port habe (RS PD3,E PD2,D0-D3=PD4-7) und es vorher verschiedene waren. Zudem sollte, wenn ich das Programm richtig verstanden habe nach der Ausführung RS auf High liegen, was es aber nicht tut.
    Könnte da vieleicht mal jemand drüber schauen ?
    Verdrahtung hab ich inzwischen 3x mal durchgemessen und nichts gefunden.

    MFG Thalhammer

    // EDIT: Hab den Fehler glaub ich gefunden:
    Code:
    LCD_DATAPORT=(byte&0b11110000);            //1. High Nibble senden 
        display_enable(); 
        LCD_DATAPORT=(byte<<4);                //2. Low Nibble senden 
        display_enable();
    Überschreibt doch meiner Meinung nach den ganzen Port oder ?
    Wie kann man das ändern, damit nur die oberen 4 überschrieben werden, ohne zuviel performance zu verlieren ? ?
    //EDIT2:
    Code:
    LCD_DATAPORT&=(byte&0b11110000);            //1. High Nibble senden 
        display_enable(); 
        LCD_DATAPORT&=(byte<<4);
    Sollte dass nicht eigentlich das Problem beheben ?
    Tut es jedenfalls nicht.

    //EDIT:
    Hat denn wirklich keiner ne Idee ?
    Ich bin jetzt mittlerweile alles durch, D0-D3 auf GND gelegt, RES auf HIGH,PINS vom UC abgelötet und wieder über drähte mit meinem MyAVR Board verbunden und die Original software probiert, nichts.
    Ich kappiers einfach nicht, was mach ich falsch ?
    Das Teil macht garnichts, keine Schwarzen balken, einfach nichts, als währe es nicht mit Strom verbunden.
    Bei der Kontrastspannung bin ich mitlerweile schon so ziehmlich alles durch, von 5V bis auf GND, es wird nichts angezeigt.
    Mensch könnte sich vieleicht mal irgendwer dazu äußern und sei es nur dass er keine Ahnung hat ?
    Ich dreh gleich durch.
    Angehängte Dateien Angehängte Dateien
    Geändert von Thalhammer (08.12.2012 um 18:13 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Grundsätzlich ist dein Programm falsch aufgebaut. Du schreibst alles in die Headerdatei. Normalerweise hat man aber 2 Dateien, einer h-und einer c-Datei (abgesehen von der C-Datei mit der main). In die Headerdatei schreibt man die defines,... und in die c-Datei die einzelnen Funktionen.

    Was mir aufgefallen das du immer nur 2ms als Pausen hast. Hier findest du mehr http://www.mikrocontroller.net/artic...-Tutorial:_LCD
    Etwas genaueres zum Thema Init findest du hier: http://www.mikrocontroller.net/artic...g_des_Displays

    Das ist meine Init-Routine
    Code:
    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);
    
    }
    Ich hoffe das ich dir helfen konnte.

    MfG Hannes

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356
    Das das Programm nicht perfekt aufgebaut ist ist mir schon klar, auserdem ist es nicht mein code, sondern ich hab ihn aus dem oben verlinkten Beitrag übernommen.
    Dein Beispiel hilft mir jetzt insofern wenig, da du die LCD_Ctrl routine nicht postest.
    Ist dein Beispiel den für das DIP204-4 ?
    Da das Display allerdings schonmal funktionierd hat bin ich nur entweder zu blöd den gleichen versuchsaufbau nochmal zu machen oder ich hab das Display wirklich geschrottet.
    Naja wie dem Auch sei funktionierd es nicht und ich werde mir vermutlich ein neues besorgen.
    Ein indiz dafür das es nicht das Beste ist könnte sein das Reichelt das Display nur eine Woche nachdem ich es gekauft hab nicht mehr im Sortiment hat und es auf der Website von denen nicht für neue Designs empfohlen wird.
    Was würdet ihr mir den für ein Display empfehlen ?
    Sollte möglichst 20x4 sein und ambesten genauso groß die das.
    Sollte aber was sein, das öfter verwendet wird, so dass ich leicht einen Beispielcode finde.
    Was den Preis angeht gilt das übliche, so günstig wie möglich aber so teuer wie nötig.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Sorry, stimmt das ich nicht alles gepostet habe.

    Hier ist meine gesamte c-Datei:
    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);
        
    }
    und die h-Datei:
    Code:
    #include <avr/io.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <util/delay.h>
    
    #define    RS    PB7
    #define    EN    PB6
    Hier findest du etwas über LCDs http://www.pacificdisplay.com/lcd_mod_if.htm
    Schau dir einmal die erste PDF an (How to use a Character Display Module - Part 1), dort steht wie du die mit Tasten ansteuern kannst. Zum Testen ist es so optimal. So kannst du Programmfehler ausschließen.

    PS: Ich habe ein HD44780-Display angesteuert (ein 2x16). Dieser sollte aber mit dem KS0073 kompatibel sein bzw mit leichten Änderungen anzusteuern sein.

    MfG Hannes
    Geändert von 021aet04 (10.12.2012 um 23:12 Uhr)

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.04.2010
    Beiträge
    356
    PS: Ich habe ein HD44780-Display angesteuert (ein 2x16). Dieser sollte aber mit dem KS0073 kompatibel sein bzw mit leichten Änderungen anzusteuern sein.
    Der haken ist, das der KS eben nur NAHEZU kompatibel ist, da bei ihm die Init anders aufgebaut ist.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich verwende immer die Lib. von Fleury, hier gibt es die Einstellung ob KS oder HD.
    Das hat bei mir noch bei jedem LCD funktioniert.
    Angehängte Dateien Angehängte Dateien
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Ähnliche Themen

  1. EA DIP204-4 4 bit modus
    Von DBF im Forum Assembler-Programmierung
    Antworten: 4
    Letzter Beitrag: 07.03.2008, 14:16
  2. LCD defekt? EA DIP204-4
    Von Lektor im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 11.11.2005, 14:34
  3. EA DIP204-4
    Von Eric79 im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 11.11.2005, 14:25
  4. EA DIP204-4
    Von Eric79 im Forum AVR Hardwarethemen
    Antworten: 0
    Letzter Beitrag: 17.08.2005, 15:05
  5. Problem Initialisierung EA DIP204
    Von Udam im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 11.08.2005, 15:39

Berechtigungen

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

LiFePO4 Speicher Test