Forum: Mikrocontroller und Digitale Elektronik Grafik LCD am PortC geht am Port B nicht! atm8 & KS0108


von Taner S. (db1nto)


Angehängte Dateien:

Lesenswert?

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.

von Dennis U. (atmegadennis)


Lesenswert?

Hallo Taner,

hast du vllt beim testen deinen ISP Programmer noch angeschlossen ??

unter Umständen macht dieser Probleme

Gruß

Dennis

von Taner S. (db1nto)


Lesenswert?

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

von Dennis U. (atmegadennis)


Lesenswert?

Hallo nochmal, mir ist soeben noch etwas aufgefallen,

benutzt du den internen Oszillator oder nen externen ??

von Taner S. (db1nto)


Lesenswert?

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

von Dennis U. (atmegadennis)


Lesenswert?

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 ??

von Taner S. (db1nto)


Lesenswert?

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);

}

von Dennis U. (atmegadennis)


Lesenswert?

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

von Taner S. (db1nto)


Lesenswert?

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

von Dennis U. (atmegadennis)


Lesenswert?

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 ??

von Taner S. (db1nto)


Lesenswert?

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

von Dennis U. (atmegadennis)


Lesenswert?

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

von Taner S. (db1nto)


Lesenswert?

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
Noch kein Account? Hier anmelden.