Hallo Leute, dies ist hier mein aller erster Beitrag in diesem Forum, ich bitte um Nachsicht :-) Seit 2 Tagen versuche ich mein GLCD mit KS0108 erfolglos vom PortC auf PortB "umzuschalten", natürlich mit Anpassung des Codes. Am PortC funktioniert das Display einwandfrei! Ich habe überprüft, ob alle PINs des Atmega8L am PortB funktionieren. Mit dem "Hello World" programm jeden einzelnen PIN am Port B EINZELN aus und eingeschaltet, die LED belegt, dass die Anschlüsse technisch OK sind. das einzige was ich geändert habe ist, das umlöten der GLCD Pins: von PortC0 -> PortB0 von PortC1 -> PortB1 von PortC2 -> PortB2 von PortC3 -> PortB3 von PortC4 -> PortB4 von PortC5 -> PortB5 von PortC6 -> PortB6 natürlich auch die Verbindungen abermals geprüft und durchgemessen, weder Kurzschlüsse, noch sonst irgendwelche Fehler. Im Anhang die .h Datei für die Konfiguration der Ports. Hier habe ich nur // Ports #define LCD_CMD_PORT PORTC // Command Output Register #define LCD_CMD_DIR DDRC // Data Direction Register for Command Port PORTC -> PORTB und DDRC -> DDRB geändert. In der .C Datei sind keinerlei Angaben über die verwendeten Ports oder Pins enthalten! nur die Ausgabe des Displayinhalts... Als Board wird das myAVR Board mit USB ISP Programmer verwendet. Natürlich habe ich auch im Schaltplan geprüft, ob die Ports des PortB anderweitig belegt sind und konnte NICHTS finden. Der PortD wird unverändert für die leitungen D0 bis D7 am GLCD verwendet, ich möchte lediglich die CMD Ports des GLCD von PortC auf PortB legen, damit ich für weitere Tests die ADC Möglichkeiten des PortC frei bekomme. Würde mich freuen, wenn mir jemand helfen kann. PS: Ich beschäftige mich mit Microcontorllern noch nicht einmal eine Woche und hbe ausser HTML Programmiereung auch wenig Berührung mit Programmierung gehabt. Dafür finde ich, dass meine Fortschritte sich sehen lassen können. Bisher ist es mir gelungen, je nach Tastendruck verschiedene Texte (fix) auf dem GLCD anzuzeigen! Im Prinzip ein auf GLCDs angepasstes "Hello World" was mit LEDs geht. Dank der verfügbaren Librarys für das KS0108 von Fabian Maximilian Thiele (Anhang) Als gelernter Radio- & Fersehtechniker habe ich zumindest einige tiefgreifende Kenntnisse im Bereich Digitaltechnik und Elektronik.
Hallo Taner, hast du vllt beim testen deinen ISP Programmer noch angeschlossen ?? unter Umständen macht dieser Probleme Gruß Dennis
Hallo Dennis, ja, der ISP Programmer war noch dran, da ich das ganze Board über USB des ISP versorge. Hmm, sollte ich vielleicht mal ohne probieren (mit externer Stromversorgung). Scheinbar habe ich im Schaltplan nicht gut aufgepasst, die Ports sind wirklich mit dem ISP verbuden... Danke nochmals für den Hinweis! das lässt sich schnell und einfach testen! Gruß Taner
Hallo nochmal, mir ist soeben noch etwas aufgefallen, benutzt du den internen Oszillator oder nen externen ??
Intern, mit allen Frequenzen (1, 2, 4 und 8 MHz) probiert. Doch was auf PortC funktioniert, sollte doch bei PortB auch gehen oder? Gruß Taner
generell ja, ich denke, das es an einem Konfigurationsproblem liegt. Das du an irgendeinem PINC eine alternative funktion hast. könntest du vllt doch mal den ganzen source veröffentlichen ??
Gerne: ks0108.h /* * Copyright: Fabian Maximilian Thiele mailto:me@apetech.de * Author: Fabian Maximilian Thiele * Remarks: this Copyright must be included * known Problems: none * Version: 1.1 * Description: Graphic Library for KS0108- (and compatible) based LCDs * */ #include <inttypes.h> #include <avr/pgmspace.h> #ifndef KS0108_H #define KS0108_H // Ports #define LCD_CMD_PORT PORTC // Command Output Register #define LCD_CMD_DIR DDRC // Data Direction Register for Command Port #define LCD_DATA_IN PIND // Data Input Register #define LCD_DATA_OUT PORTD // Data Output Register #define LCD_DATA_DIR DDRD // Data Direction Register for Data Port // 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 // Colors #define BLACK 0xFF #define WHITE 0x00 // Font Indices #define FONT_LENGTH 0 #define FONT_FIXED_WIDTH 2 #define FONT_HEIGHT 3 #define FONT_FIRST_CHAR 4 #define FONT_CHAR_COUNT 5 #define FONT_WIDTH_TABLE 6 // Uncomment for slow drawing // #define DEBUG typedef struct { uint8_t x; uint8_t y; uint8_t page; } lcdCoord; typedef uint8_t (*ks0108FontCallback)(const uint8_t*); // // Function Prototypes // // Graphic Functions void ks0108DrawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color); void ks0108DrawRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color); void ks0108DrawRoundRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t radius, uint8_t color); void ks0108FillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color); void ks0108InvertRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height); void ks0108SetInverted(uint8_t invert); void ks0108SetDot(uint8_t x, uint8_t y, uint8_t color); #define ks0108DrawVertLine(x, y, length, color) {ks0108FillRect(x, y, 0, length, color);} #define ks0108DrawHoriLine(x, y, length, color) {ks0108FillRect(x, y, length, 0, color);} #define ks0108DrawCircle(xCenter, yCenter, radius, color) {ks0108DrawRoundRect(xCenter-radius, yCenter-radius, 2*radius, 2*radius, radius, color);} #define ks0108ClearScreen() {ks0108FillRect(0, 0, 127, 63, WHITE);} // Font Functions uint8_t ks0108ReadFontData(const uint8_t* ptr); //Standard Read Callback void ks0108SelectFont(const char* font, ks0108FontCallback callback, uint8_t color); int ks0108PutChar(char c); void ks0108Puts(char* str); void ks0108Puts_P(PGM_P str); uint8_t ks0108CharWidth(char c); uint16_t ks0108StringWidth(char* str); uint16_t ks0108StringWidth_P(PGM_P str); // Control Functions void ks0108GotoXY(uint8_t x, uint8_t y); void ks0108Init(uint8_t invert); inline uint8_t ks0108ReadData(void); void ks0108WriteCommand(uint8_t cmd, uint8_t chip); void ks0108WriteData(uint8_t data); #endif ____________________________________________________________________ ks0108.c: /* * Copyright: Fabian Maximilian Thiele mailto:me@apetech.de * Author: Fabian Maximilian Thiele * Remarks: this Copyright must be included * Modified By: Taner Oegretmen, DB1NTO * known Problems: none * Version: 1.1 * Description: KS0108 Library Demo Program * */ #include <inttypes.h> #include <avr/io.h> #include <avr/pgmspace.h> #include "ks0108.h" #include "SC.h" int main(void) { // Wait a little while the display starts up for(volatile uint16_t i=0; i<15000; i++); // Initialize the LCD ks0108Init(0); // Select a font //ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK); ks0108SelectFont(SC, ks0108ReadFontData, BLACK); ks0108ClearScreen(); // Set a position ks0108GotoXY(15,10); // Print some text ks0108Puts_P(PSTR("www.mikrokontroller.net")); // a nice little round rect ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK); }
Was mir gerade noch auffällt, wo hast du denn deinen 8. Pin angeschlossen ?? PORTC hatte ja nur 7 PINS PORTB hingegen hätte 8
Hallo, angeschlossen habe ich ihn so wie in diesem Schaltplan: http://www.scienceprog.com/wp-content/uploads/2007i/Glcd/GLCD_pins.png Es sind an Port C nur die CMD Pins des LCD angeschlossen! Die benötigen nur 5 Pins! PC0 bis PC4 Habe das Analog einfach von PB0 bis PB4 belegt, rest freigelassen... Port D blieb unverändert am PortD (die Datenleitungen des LCD) Gruß Taner
hast du eine möglickeit das ganze zu debuggen ( AVR Studio ), ich vermute fast, das es aufgrund einer alternativen Funktion eines PINs zu tun hat. Vllt ein Timeroverflow oder sowas. was wird den in der SC.h definiert ??
SC.h ist nur eine Schriftart für das Grafik LCD. Ich arbeite mit Mac OS X und AVR GCC (AVRMacPac aktuellste Version) Wo könnte denn so ein PIN noch eine alternative Funktion definiert bekommen? im Makefile? Über die FUSE Bits? Gruß Taner
ja, zb wird der intene oszillator über di fusebit aktiviert bzw. deaktiviert wo befindt sich dein Proz den gerad ?? vllt auf einem Eval Board. Du hat geschrieben, das du es mit sämtlichen internen Kkonfigurationen getestet hast. vllt verwendest du ihn ja gar net den internen und somit sind deine Pins noch als Xtal konfiguriert
Hallo Dennis, im ersten Posting steht das verwendete Board. Es handelt sich um das myAVR USB. Es wird jedoch definitiv der interne Oszillator verwendet, die Fuse Bits habe ich auch schon ausgelesen und habe alle internen Taktraten durchprobiert. Von 1 MHz bis 8 MHz... Gruß Taner
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.