JeyBee
02.06.2010, 13:17
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/ks0108-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):
#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
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/ks0108-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):
#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