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

Thema: KS0108 mit ATmega16

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277

    KS0108 mit ATmega16

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Moin

    Ich habe hier ein 128 x 64 Pixel Grafik-LCD mit zwei KS0108 Controllern drauf.
    Das LCD wollte ich auf einem Steckbrett mit einem ATmega16 (16MHz) in C in Betrieb nehmen.
    Für diesen Zweck wollte ich die GLCD-Routine von ape nehmen.

    http://www.mikrocontroller.net/topic...-glcd-routinen

    Ich habe also das LCD an den Controller angschlossen, alle mir nötig vorkommenden Änderungen vorgenommen, geflasht und -> fail.

    Das LCD bleib immer "schwarz", also alle Pixel sind an. Ist das ein Zeichen dafür, dass das LCD nicht mal initialisiert?


    Zur Pinbelegung:
    Verstehe ich das richtig, dass in der ks0108.h davon ausgegangen wird, dass die Pins "kontinuiertlich" sind? Also dass man zwei Ports hat, und bei den Datenleitungen wird immer 0-7 verwendet?


    Hier meine ks0180.h (an der ks0108.c habe ich nichts geändert):
    Code:
    #include <inttypes.h>
    #include <avr/pgmspace.h>
    
    #ifndef	KS0108_H
    #define KS0108_H
    
    // Ports
    #define LCD_CMD_PORT		PORTD		// Command Output Register
    #define LCD_CMD_DIR			DDRD		// Data Direction Register for Command Port
    
    #define LCD_DATA_IN			PINA		// Data Input Register
    #define LCD_DATA_OUT		PORTA		// Data Output Register
    #define LCD_DATA_DIR		DDRA		// Data Direction Register for Data Port
    
    // Function Paramters
    #define INCREMENT_X			0
    #define NO_INCREMENT_X		1
    
    // Command Port Bits
    #define D_I					0x00		// D/I Bit Number
    #define R_W					0x01		// R/W Bit Number
    #define EN					0x02		// EN Bit Number
    #define CSEL1				0x03		// CS1 Bit Number
    #define CSEL2				0x04		// CS2 Bit Number
    
    // Chips
    #define CHIP1				0x00
    #define CHIP2				0x01
    
    // Commands
    #define LCD_ON				0x3F
    #define LCD_OFF				0x3E
    #define LCD_SET_ADD			0x40
    #define LCD_SET_PAGE		0xB8
    #define LCD_DISP_START		0xC0
    
    // Fill Modes
    #define BLACK				0xFF
    #define CLEAR				0x00
    
    // Uncomment for slow drawing
    // #define DEBUG
    
    struct displayPos 
    {
    	uint8_t x;
    	uint8_t y;
    	uint8_t page;
    };
    
    struct font 
    {
    	uint8_t width;
    	uint8_t height;
    	PGM_P charData;
    };
    
    // Function Prototypes
    void ks0108Enable(void);
    void ks0108Fill(uint8_t mode);
    void ks0108GotoXY(uint8_t, uint8_t);
    void ks0108Init(void);
    void ks0108SetDot(uint8_t, uint8_t);
    void ks0108ClearDot(uint8_t, uint8_t);
    void ks0108PutChar(char c, struct font font);
    void ks0108NewLine(uint8_t fontHeight, uint8_t offset);
    void ks0108PutString(char *string, struct font font);
    void ks0108PutStringP(PGM_P string, struct font font);
    char ks0108ReadData(uint8_t incXAdd);
    void ks0108WriteCommand(uint8_t cmd, uint8_t chip);
    void ks0108WriteData(uint8_t data);
    
    #endif

    Ich habe die Leitungen DB0-DB7 des LCDs an PA0-Pa7 angeschlossen.
    Die CMD-Leitungen sind entsprechend an PD0 - PD4 angeschlossen.
    Reset habe ich extern mit einem Pullup nach Vcc versehen und einem 100nF KerKo nach Masse.


    Wo ist mein Fehler?


    Greez Jey

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Dass der Code 2 Ports will, stimmt. Darum hab ich das Zeug für dieses Display auch selber geschrieben, so dass ich bei den Control-Pins nicht den gleichen Port haben muss. Nur beim Datenport lass ichs bei nem zusammenhängenden Port, da hier dann das lesen/setzen schneller geht.

    Wie sieht denn die Beschaltung vom Kontrast-Pin des LCD aus?
    Wenn alle Pixel an sind, ist der vermutlich auf Vollgas aufgedreht.
    Ein nicht initialisiertes LCD zeigt entweder nichts oder "Brösel".
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    okay, erstmal danke für die Antwort, Jaecko. Jedoch habe ich den Fehler gefunden.... Ich habe das LCD um 180° falsch angesteckt gehabt. Also wo Pin 1 ist war 20 und umgekehrt... ich hab mich echt schong ewundert, wieso das teil 1.2A zieht o.O.

    -> Das LCD läuft einwandfrei und hat die Folterung mit der Verpolung heil überstanden!

    Danke


    Greez Jey

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Na dann hoffen wir mal, dass der andere Chip das überlebt hat.
    Bei 1.2A dürfte da doch der ein oder andere Teil etwas warm geworden sein.
    (Einfach in der Software mal testen: CSEL1/CSEL2 bzw. CHIP1 und CHIP2 austauschen)
    #ifndef MfG
    #define MfG

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.02.2007
    Beiträge
    277
    Sry, hab den Beitrag editiert, läuft jetz alles Einwandfrei!


    Danke für deine Mithilfe!

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad