- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 10

Thema: LCD Display ansteuern

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117

    LCD Display ansteuern

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Zusammen

    Ich versuche verzweifelt ein 4*20 Zeichen LCD Display (das von Robotikhardware) auf einem Mega32, welcher mit 6MHz getacktet ist und auf dem RN-Control sitzt anzustuern.
    Damit es für den Anfang einmal möglichst simpel wird verwende ich den 8-Bit breiten Bus.

    Verkabel habe ich das ganze so:
    Den ganzen Daten-Bus auf PORTB
    RS auf PORTD Pin 0
    R/W auf PORTD Pin 1
    E auf PORTD Pin 2

    Mein C Programm sieht bis jetzt so aus:
    Code:
    #include <avr/io.h>
    #include "bit.h"
    
    // config
    #define F_CPU		16000000
    
    #define CONT_DDR	DDRD
    #define	CONT_PORT	PORTD
    #define CONT_E		2		// Enable (fallende Flanke)
    #define CONT_RS		0		// L:Befehl / H:Daten
    #define	CONT_RW		1		// H:Read / L:Write
    #define DATA_DDR	DDRB
    #define DATA_PORT	PORTB
    
    void sleep(void){
    	int i;
    	for (i=0; i<200; i++){}	
    }
    
    void sleep_long(void){
    	int i,j;
    	for (i=0; i<100; i++)
    		for (j=0; j<100; j++){}
    }
    
    void init(void){
    	CONT_DDR = 0x07;	// Ausgänge
    	DATA_DDR = 0xff;	// Ausgänge
    	b_setL(CONT_PORT,CONT_E);	// E nicht setzen
    	b_setL(CONT_PORT,CONT_RS);	// RS nicht setzen
    	b_setL(CONT_PORT,CONT_RW);	// RW nicht setzen	
    	DATA_PORT = 0xff;
    }
    
    void lcd_send(uint8_t data){
    	DATA_PORT = data;	
    	b_setH(CONT_PORT,CONT_E);
    	sleep();
    	b_setL(CONT_PORT,CONT_E);
    	
    	DATA_PORT = 0xff;
    }
    
    void lcd_init(void){
    	lcd_send(0x34);	// 8-Bit Datenlänge
    	sleep_long();
    	lcd_send(0x09);	// 4 Zeilen Modus
    	sleep_long();	
     	lcd_send(0x0F);	// Display on, Curser on, Blink on
    }
    
    int main(void){
    	init();
    	lcd_init();
    	
    	for(;;){}
    	
    	return 0;	
    }
    Leider sehe ich auf dem Display gar nix. Ich müsste doch mindestens den blinkenden Curser sehen, oder?

    Jemand eine Idee, was ich falsch mache?

    cumi

    <edit>
    ah, ja, was ich noch vergessen habe. b_setH(b,n) setzt einfach das n-te Bit vom Byte b auf 1. b_setL auf 0.
    </edit>

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Leider sehe ich auf dem Display gar nix.
    gar nichts ist schlecht, Du müßtest zumindest volle Vierecke sehen, so sieht es nähmlich aus wenn das Display eingeschaltet , aber noch nicht initialisiert wird.
    Spannungsversorgung , kontrast ok ?

    Deine Init Routine, ist sie denn richtig ?
    4 Zeilen Modus? Ich kenn nur 1 oder 2 Zeilen Modus...
    schick mal ein Link auf das Dattenblatt, kann man vielleicht mehr dazu sagen...

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Die Warteschleife tut nicht, was sie soll.

    Aber da ist wohl noch mehr faul...
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    danke für deine hilfe!

    Die Vierecke sehe ich natürlich schon, wenn ich den Kontrast entsprechend einstelle.

    Die Init-Rutine habe ich dem Datenblat abgeschrieben.

    Ist leider zu gross, als Attachment. Kannst es aber hier herunterladen:
    http://www.shop.robotikhardware.de/s...products_id=80

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    zur Warteschleife: Danke für den Artikel, doch irgendwie funktioniert das schon, denn ich habe schon Programm geschrieben, die genau so LEDs blinken lassen.
    Aber ich versuchs mal so wies im Artikel steht.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    hat niemand mehr eine idee?

    hätte mir sonst jemand einen code (in C) , um ein solches display anzusteuern? Dann kann ich einmal vergleichen...

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Hast du den Kontrast gecheckt? Wenn der nicht stimmt ist auch allen schwarz.
    Disclaimer: none. Sue me.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    ich hab ihn so eingestellt, dass die rechtecke nicht schwarz und nicht weiss sind. also sie sind jetzt so hellgrau.

    Ich denke, dass das Problem irgendwo bei der Programmierung liegen muss. Denn dazu habe ich auch im Datenblatt nicht viel gefunden. Ich habe das einfach so geschrieben, wie ich dachte, dass es wohl funktionieren würde. Und alle Warte-Zeilen extrem hoch eingestellt. Kann es sein, dass diese Zeiten auch nicht zu hoch sein dürfen?

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Naja, wenn Du doch die Vierecke siehst, dann klappt Dein Init nicht,
    so wie der Sprinter schon sagte, mach mal eine vernünftige Delay, schau mal util/delay.h _delay_loop_2 ist sehr interessant.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.10.2005
    Ort
    Zürich
    Beiträge
    117
    ok, danke für den tipp. schau mir diesen delay mal an.

Berechtigungen

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

Labornetzteil AliExpress