- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: LCD Display mit KS0066U/KS0070B

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Die Balken bedeuten das das LCD nicht bzw falsch initialisiert wurde (eventuell passt auch die Beschaltung nicht, Ader vertauscht, im 4bit Modus die nicht benötigen Eingänge auf Masse gelegt,...).

    Die Fehlermeldung bezieht sich auf die delay.h
    Du hast die Optimierung ausgeschaltet und dadurch gibt es Fehler mit der delay.h (funktioniert nicht wie gewollt => won't work as designed)

    MfG Hannes

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2013
    Beiträge
    6
    Hallo das es sich um die delay handelt war mir klar nur halt nicht warum. verstehe es nicht, denn ich habe mit #define F_CPU 8000000UL die Frequenz definiert... wie kann man denn die Optimierung einschalten?
    und verdrahtungsfehler sind ausgeschlossen habe alles 5 mal genau geprüft und ist ja auch direkt mit Leitungen angeschlossen.... die 4 Datenleitungen also vom Display Data5-Data8 habe ich nicht auf Masse gelegt kann es nur daran liegen??
    @ Thorben danke werde aber erstmal die gewählte lib nehmen, da sie ja doch häufig verbreitet ist und wenn sie mal funktionieren sollte sehr flexibel ist. Dennoch danke für ne schnelle Antwort

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Du hast einige sinnlose Zeilen im Programm.
    Du schreibst #define F_CPU... und danach steht #ifndef ...
    Das bedeutet:
    Setzte F_CPU
    Wenn F_CPU nicht gesetzt
    setze F_CPU

    Entweder du entfernst dein erstes #define F_CPU oder entfernst #ifndef... bis #endif
    Das ist zwar kein Fehler, ist aber Sinnlos. Du kannst aber auch bei den Einstellungen (Beim AVR Studio 4 hat es Project Options geheißen, wie es beim 5er heißt weiß ich nicht) die Taktfrequenz einstellen, dann wird es automatisch im Makefile eingetragen (dann brauchst du das ganze #ifndef F_CPU... nicht). Dort kannst du auch optimization (das ist der Punkt den du brauchst) einstellen und noch weitere Dinge die mit dem Projekt zutun haben. Was du einstellen musst kannst du normalerweise in der Hilfe bzw im Internet nachlesen. Ich habe beim 4rer "Os" eingestellt und hatte noch nie Probleme.

    MfG Hannes

    MfG Hannes

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    #define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
    Du solltest hier eine 1 hinschreiben, also für einen KS0073
    Die freien Datenleitung musst du nicht auf Masse legen, die haben interne PullUp.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    Hallo robotka,

    ich verwende das LED 204B LED von Reichelt, also auch ein LCD mit KS0070B-Controller. Angesteuert wird es auch mit der .lib von Peter Fleury.

    Zu Anfang hatte ich ähnliche Probleme. Bin auch wie Hannes der Meinung, dass es sich um ein Problem bei der Initialisierung handelt.

    Das #define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */ habe ich bei mir auf 0 gelassen. Die Ansteuerung funktioniert. Wenn ich das richtig sehe, ist das nur für ein "extended function register" von Bedeutung.

    Das Problem bei mir war ein Timing-Problem. So habe ich für Taktfrequenzen unter 4Mhz in die Funktion "toggle e" ein delay(40) eingeschoben. Den Wert habe ich durch Ausprobieren gefunden, in wie weit der nun tatsächlich optimal ist, kann ich nicht wirklich sagen.

    Wenn Du schreibst, dass Du den ATMega ohne Quarz verwendest, dann läuft der doch mit einer Taktfrequenz von 1Mhz, oder nicht? Bin mir jetzt nicht so sicher, weil ich nie ohne Quarz gearbeitet habe. Diese Taktfrequenz muss dann auch so angegeben werden, Du gibst im Programm die Taktfrequenz aber mit 8Mhz an. Auch das spricht eher für ein Timingproblem.

    Zunächst solltst Du aber das Problem mit der Fehlermeldung lösen, dass die delay(ms) Funktion tatsächlich auch läuft und das macht was sie soll. Ich verwende die WinAVR Toolschain und habe da im Makefile als Optimization level s (optimize for size) gewählt.

    Viele Grüße

    Uwe
    Legasteniker on Board!
    gefundene Rechtschreibfehler dienen der Belustigung des Lesers und dürfen von diesem behalten werden.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.093
    Die Atmegas bzw Attinys haben (soweit ich weiß) alle einen internen 8MHz RC-Oszillator, der Standardmäßig auf 1MHz heruntergeteilt wird (mit dem Fusebit CKDIV8 o.Ä. je nach Typ). Wenn man das Fusebit für die Teilung entfernt taktet der µC mit den 8MHz, das kann also schon einmal stimmen. Ich verwende meistens den internen Oszillator mit den 8MHz (ohne Teilung durch .

    Ich habe eine Lib für den R8C (Renesas) auf den Atmega umgeschrieben, könnte nachschauen wegen dem Timing. Die Lib funktioniert nur mit delays (ohne Interrupts), die habe ich aber am Laptop.

    MfG Hannes

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2013
    Beiträge
    6
    Also nun hatte ich endlich mal zeit mich wieder damit zu beschäftigen jedoch ohne Erfolg....
    Natürlich hab eich nochmal die Pinbelegung kontrolliert Fehler kann ich dort echt 100% ausschließen...

    Ich habe die Fehlermeldung durch Eure hilfe weg bekommen und habe wie empfohlen Optimization auf Os gestellt.
    Der Atmega läuft ohne Quarz auf 8MHz dies habe ich durch die Fuses Eingestellt und auch wieder auslesen lassen, somit denke ich mal stimmt es auch und ich kann diesen Fehler auch ausschließen.

    Nun verstehe ich nicht wieso es nicht funktioniert ich habe ehrlich keine Idee mehr...
    Ich stelle euch zur weiteren Analyse mal den Text vom Complier zur Verfügung:

    Code:
    ------ Build started: Project: Mega8Testfunktionen, Configuration: Debug AVR ------
    Build started.
    Project "Mega8Testfunktionen.avrgccproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "C:\Users\Christian Dopatka\Documents\AVRStudio\Mega8Testfunktionen\Mega8Testfunktionen\Mega8Testfunktionen.avrgccproj" (target "Build" depends on it):
    	Task "RunAvrGCC"
    		C:\Program Files (x86)\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe all 
    Mega8Testfunktionen.c
    		Invoking: AVR/GNU C Compiler
    		"C:/Program Files (x86)/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-gcc.exe" -funsigned-char -funsigned-bitfields -Os -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99  -mmcu=atmega8   -MD -MP -MF"Mega8Testfunktionen.d" -MT"Mega8Testfunktionen.d" -o"Mega8Testfunktionen.o" ".././Mega8Testfunktionen.c"
    		Finished building: .././Mega8Testfunktionen.c
    		Building target: Mega8Testfunktionen.elf
    		Invoking: AVR/GNU C/C++ Linker
    		"C:/Program Files (x86)/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-gcc.exe"  -mmcu=atmega8  -Wl,-Map=Mega8Testfunktionen.map -o Mega8Testfunktionen.elf  lcd.o Mega8Testfunktionen.o  
    		Finished building target: Mega8Testfunktionen.elf
    		"C:/Program Files (x86)/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature  "Mega8Testfunktionen.elf" "Mega8Testfunktionen.hex"
    		"C:/Program Files (x86)/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objdump.exe" -h -S "Mega8Testfunktionen.elf" > "Mega8Testfunktionen.lss"
    		"C:/Program Files (x86)/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "Mega8Testfunktionen.elf" "Mega8Testfunktionen.eep" || exit 0
    		AVR Memory Usage
    		----------------
    		Device: atmega8
    		Program:     554 bytes (6.8% Full)
    		(.text + .data + .bootloader)
    		Data:         12 bytes (1.2% Full)
    		(.data + .bss + .noinit)
    	Done executing task "RunAvrGCC".
    Done building target "CoreBuild" in project "Mega8Testfunktionen.avrgccproj".
    Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
    Target "Build" in file "C:\Program Files (x86)\Atmel\AVR Studio 5.0\Vs\Avr.common.targets" from project "C:\Users\Christian Dopatka\Documents\AVRStudio\Mega8Testfunktionen\Mega8Testfunktionen\Mega8Testfunktionen.avrgccproj" (entry point):
    Done building target "Build" in project "Mega8Testfunktionen.avrgccproj".
    Done building project "Mega8Testfunktionen.avrgccproj".
    
    Build succeeded.
    ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

  8. #8
    Hallo robotka,

    zu der Ausgabe vom AVR-Studio kann ich leider nichts kompetentes beitragen, da ich wie gesagt die GCC-Toolchain verwendet.

    Vielleicht hilft Dir aber ein kleines Programm weiter, dass ich geschrieben habe um die Fehlerquellen bei meinem ähnlichen Problem ein zu kreisen

    Code:
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *
    *    Datei:        LCD-Test1.c
    *     erstellt:    im Januar 2010
    *    von:        Bot-Builder
    *
    *    Hardware:    Bot-Board ATMega 16 V2
    *                ATMega 32 und 7,3728 Mhz,
    *                Bot-Board LC-Display V1,
    *                Bot-Board Portanzeige mit LED
    *
    *    Resourcen
    *
    *    Timer0:        frei
    *
    *    Timer1:        frei
    *
    *    Timer2:        frei
    *
    *
    *    Interrupt:    keine
    *
    *    I/O-Pins:
    *
    *
    *    Funktionsbeschreibung:
    *        In diesem Programm wird die vollständige  Initialisierung des
    *        LC-Display ohne Verwendung von Biblotheken abgearbeitet.
    *        Zum Debuggen wurden Verzögerungen verwendet.
    *        Das LC-Display ist wie folgt angeschlossen:
    *            PC0        DB7
    *            PC1        DB6
    *            PC2        DB5
    *            PC3        DB4
    *                    DB3        an gnd
    *                    DB2        an gnd
    *                    DB1        an gnd
    *                    DB0        an gnd
    *            PC4        Enable Hintergrundbeleuchtung
    *            PC5        E (Taktleitung)
    *            PC6        R/W
    *            PC7        RS
    *
    *        Zur Kontrolle werden auf Port D die gleichen Daten ausgegeben
    *        und mit den LEDs dargestellt.
    *
    *        Das Display wird somit im 4-Bit Modus verwendet.
    *
    *        JTAG Interface mit den Fuses ausgeschaltet!
    *        sonst funktioniert Port C nicht vollständig.
    *
    *        Bei dieser Beschaltung kann das Busyflag ausgelesen werden!
    *
    *
    *
    *    Bemerkungen:  
    * 
    *
    *    letzte Änderung: 25.01.2010
    *
    *
    ---------+---------+---------+---------+---------+---------+---------+---------+*/
    
    
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *   #include-Dateien
    *--------+---------+---------+---------+---------+---------+---------+---------+*/
    #include <avr/io.h>
    #include <util/delay.h>        // definiert _delay_ms() 
    
    
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *   Variablen.- und Konstantendefintionen
    *--------+---------+---------+---------+---------+---------+---------+---------+*/
    #define delay(us)  _delay_loop_2 (((F_CPU/4000)*us)/1000)        // wartet µs
    
    #define Pause1 50
    #define Pause2 50
    
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *   Interrupts
    *--------+---------+---------+---------+---------+---------+---------+---------+*/
    //  hier keine
    
    
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *   Funktionen():
    *--------+---------+---------+---------+---------+---------+---------+---------+*/
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *   delay_ms(ms):
    *        wartet ms Millisekunden
    *--------+---------+---------+---------+---------+---------+---------+---------+*/
    void delay_ms(uint16_t ms)
    {
      for(uint16_t t=0; t<=ms; t++)
        _delay_ms(1); 
    }
    
    
    
    /*-------+---------+---------+---------+---------+---------+---------+---------+
    *   main()
    ---------+---------+---------+---------+---------+---------+---------+---------+*/
    int main()
    {
        //    Initialiserung
        //    der Ports
        //    alle Pins als Ausgang
        //    also im Datenrichtungsregister an allen Stelle eine Eins
        //    DDRC |= ( (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5) | (1 << DDC6) | (1 << DDC7) ); 
        DDRC = 0xff;
        DDRD = 0xff;
        
        //    alle Ausgänge auf low
        PORTC = 0x00;
        PORTB = 0x00;
        //    Warten damit die Flanke sicher alle fallen
        //    laut Datenblatt reichen 15ms nach erreichen 
        //    der Arbeitsspannung von 4,5V aus
        delay_ms(100);
        
    
        //    Initialisierung des LC-Displays
        //    zunächst in den 8-Bit Modus schalten
        //    DB7 = 0, DB6 = 0 und DB5 = 1
        //    schaltet in die Funktionsdefinition um,
        //    dann bedeutet
        //    DB4 = 1, 8-Bit-Modus
        //    DB3 bis DB0 liegen fest auf gnd
        //    zunächst also die Daten ans LC-Display legen, RS und R/W bleiben null
        //    also PC2 und PC3 auf high
        //    also muss 0b 0000 1100
        //    (mit RS und R/W = 0)
        //    übertragen werden
        
        //    vereinfacht geschrieben
        PORTC = 0x0c;
        PORTD = 0x0c;
    
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    und noch eine Verzögerung weil Busy hier noch nicht
        //    ausgewertet werden kann
        delay_ms(5);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    das Ganze zur Sicherheit noch zwei Mal wiederholen
        //    erste Wiederholung
        //    vereinfacht geschrieben
        PORTC = 0x0c;
        PORTD = 0x0c;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    zweite Wiederholung
        //    vereinfacht geschrieben
        PORTC = 0x0c;
        PORTD = 0x0c;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        
        //    und jetzt in den 4-Bit-Modus schalten
        //    also DB5 = 1 und DB4 = 0
        //    also PC2 = 1 und PC3 = 0
        //    also 0b 0000 0100
        //    mit RS und R/W = 0
        //    vereinfacht geschrieben
        PORTC = 0x04;
        PORTD = 0x04;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    die übrigen Betriebsparameter einstellen
    
    
        //    Funktionsdefinition        0b 001
        //    4-Bit                          0
        //    2/4zeiliges Display                1
        //    5x7 Dots Zeichen                 0
        //    unerheblich                       00
        //    also                    0b 0010 1000
        //    muss übertragen werden
        
        //    zunächst das höherwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        //    Befehl schreiben
        //    also R/W = 0, RS = 0
        //    also PC6 = 0, PC7 = 0
        
        //    vereinfachte Schreibweise
        PORTC = 0x02;
        PORTD = 0x02;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    zunächst das niederwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        
        //    vereinfachte Schreibweise
        PORTC = 0x08;
        PORTD = 0x08;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
    
        //    Display/Cursor            0b 0000 1
        //    Display an                         1
        //    Cursor an                          1
        //    Cursor blinken                       1
        //    also                    0b 0000 1111
        //    muss übertragen werden
        
        //    zunächst das höherwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        //    Befehl schreiben
        //    also R/W = 0, RS = 0
        //    also PC6 = 0, PC7 = 0
        
        //    vereinfachte Schreibweise
        PORTC = 0x00;
        PORTD = 0x00;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    zunächst das niederwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        
        //    vereinfachte Schreibweise
        PORTC = 0x0f;
        PORTD = 0x0f;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
    
    
        //    Modus festlegen                    0b 0000 01
        //    Cursorposition inkrementieren              1
        //    Displayinhalt fest, Cursor schieben           1
        //    also                    0b 0000 0111
        //    muss übertragen werden
        
        //    zunächst das höherwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        //    Befehl schreiben
        //    also R/W = 0, RS = 0
        //    also PC6 = 0, PC7 = 0
        
        //    vereinfachte Schreibweise
        PORTC = 0x00;
        PORTD = 0x00;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    zunächst das niederwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        
        //    vereinfachte Schreibweise
        PORTC = 0x07;
        PORTD = 0x07;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
    
        //    Display löschen                    0b 0000 0001
        //    muss übertragen werden
        
        //    zunächst das höherwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        //    Befehl schreiben
        //    also R/W = 0, RS = 0
        //    also PC6 = 0, PC7 = 0
        
        //    vereinfachte Schreibweise
        PORTC = 0x00;
        PORTD = 0x00;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    zunächst das niederwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        
        //    vereinfachte Schreibweise
        PORTC = 0x01;
        PORTD = 0x01;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        //    zusätzliche Wartezeit für Löschen
        delay(4000);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
    
        //    Cursor Home                    0b 0000 001
        //    unerheblich                               0
        //    also                        0b 0000 0010
        //    muss übertragen werden
        
        //    zunächst das höherwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        //    Befehl schreiben
        //    also R/W = 0, RS = 0
        //    also PC6 = 0, PC7 = 0
        
        //    vereinfachte Schreibweise
        PORTC = 0x00;
        PORTD = 0x00;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    zunächst das niederwertige Nibbel an DB7 bis DB4
        //    also PC0 bis PC4
        
        //    vereinfachte Schreibweise
        PORTC = 0x02;
        PORTD = 0x02;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        //    zusätzliche Wartezeit für Löschen
        delay(4000);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause1);
        
        //
        //    Initialisierung ist damit abgeschlossen
        //
        
        //    kleinen Text ausgeben
        //    also Daten schreiben
        //    R/W = 0, RS = 1
        //    also PC6 = 0, PC7 = 1
        
        //    Buchstabe 'H' übertragen
        //    also 0b 0100 1000
    
        //    auch hier zuerst höherwertiges Nibbble übertragen,
        //    allerdings mit gesetztem PC7
        
        //    also zuerst 0b 1000 0100
        //    vereinfachte Schreibweise
        PORTC = 0x84;
        PORTD = 0x84;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann 0b 1000 1000
        //    vereinfachte Schreibweise
        PORTC = 0x88;
        PORTD = 0x88;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
    
        //    Buchstabe 'a' übertragen
        //    also 0b 0110 0001
    
        //    auch hier zuerst höherwertiges Nibbble übertragen,
        //    allerdings mit gesetztem PC7
        
        //    also zuerst 0b 1000 0110
        //    vereinfachte Schreibweise
        PORTC = 0x86;
        PORTD = 0x86;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann 0b 1000 0001
        //    vereinfachte Schreibweise
        PORTC = 0x81;
        PORTD = 0x81;
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung auf high legen
        //    also PC5
        PORTC |= (1 << PC5);
        PORTD |= (1 << PD5);
        //    Warten damit die Flanke sicher entsteht
        delay(100);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
        //    dann die Enableleitung wieder auf low legen
        //    also PC5
        PORTC &= ~(1 << PC5);
        PORTD &= ~(1 << PD5);
        //    Warten damit die Flanke sicher gefallen ist
        delay(200);
        
        //    Verzögerung zum Debuggen
        delay_ms(Pause2);
        
    
    
    
        //    Hintergrundbeleuchtung an
        PORTC = 0x10;
        PORTD = 0x10;
        
        while (1)
            {
            }
            return 0;
        
        
    }
    Wie Du siehst wird hier die komplette Initialisierung in der main() Funktion abgearbeitet. Wie im Kopf zu lesen ist, habe ich damals mein LCD an den Port C angeschlossen und zur Kontrolle acht LEDs an Port D angeschlossen. Wenn Du nun D verwendetest müsste das Programm sogar ohne Änderungen bei Dir laufen. Allerdings muss natürlich die Taktfrequenz richtig angegeben sein.

    Es ist übertrieben detailliert kommentiert, war mir damals bei der Fehlerbehebung eine große Hilfe.

    Nun hoffe ich, dass es auch Dir hilft.

    gutes Gelingen

    Uwe
    Legasteniker on Board!
    gefundene Rechtschreibfehler dienen der Belustigung des Lesers und dürfen von diesem behalten werden.

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Zitat Zitat von robotka Beitrag anzeigen
    ... die 4 Datenleitungen also vom Display Data5-Data8 habe ich nicht auf Masse gelegt ...
    Hallo robotka,

    ich sehe im Datenblatt von Reichelt nicht, dass dieses Display im 4-Bit-Modus angesteuert werden kann. WENN das so angesteuert werden kann, dann sind aber die Datenbits DB4 bis DB7 üblich (leider kenne ich DEIN Display nicht, meine, HD44780er, laufen mit diesem 4Bit-Modus), siehe hier - klick. Dummerweise sehe ich auch dazu nix im Datenblatt.

    Ein Datenbit Data8 gibts nicht, die Zählweise geht von 0 bis 7!

    Wenn Du die Datenleitungen Data5-Data8, vermutlich aber DB4-DB7 meinst, auf Masse legst, dann könnte das genau der falsche Übertragungszweig sein . . . oder dieser Modus ist eben nicht möglich.
    Ciao sagt der JoeamBerg

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Thorben W
    Registriert seit
    17.02.2012
    Ort
    Niedersachsen
    Beiträge
    108
    Hallo,
    beim Asuro wurde auch ein Display mit 4bit betrieben die haben es so gemacht
    Klicke auf die Grafik für eine größere Ansicht

Name:	DIS_asuro.png
Hits:	6
Größe:	6,7 KB
ID:	25118
    (An Pin 7 ist die Hintergrundbeleuchtung)

    Daher denke ich das das Display auch mit 4bit läuft:
    Klicke auf die Grafik für eine größere Ansicht

Name:	DIS.jpg
Hits:	6
Größe:	18,0 KB
ID:	25119
    Das musst ich dann in der Deklaration ändern nur bei dieser Deklaration finde ich diese Stelle nicht.
    Thorben

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. RN-Minicontrol mit RN-LCD-Adapter und DIP LCD-Display 4x20
    Von Neffez im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 8
    Letzter Beitrag: 23.06.2008, 21:15
  2. LCD 4x20 mit KS0070B Chip kompatibel zum HD44780 Chip???
    Von Fighter-2 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 09.11.2007, 16:06
  3. Fragen nach LCD Steuerung KS0070B
    Von denk im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 24.06.2007, 18:04
  4. 8*1 LCD Display mit Bascom?
    Von Powell im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 05.10.2006, 16:51
  5. Probleme mit KS0066U
    Von PhantomET im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 30.05.2005, 06:40

Berechtigungen

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

Labornetzteil AliExpress