Forum: Mikrocontroller und Digitale Elektronik KS0108: Warum immer Anzeige auf beiden LCD-Hälften?


von Randy N. (huskynet)


Lesenswert?

Hallo,
ich habe folgendes Display (128x64 Pixel, KS0108 Controller) an meinen 
AT90CAN128 angeschlossen:

http://www2.produktinfo.conrad.com/datenblaetter/175000-199999/181682-da-01-en-GRAFIK-MODUL_STN_BLAU_WEISS_128X64.pdf

Und als Treiber verwende ich den hier Besprochenen:

Beitrag "KS0108 GLCD Routinen"

Nun funktioniert die Ansteuerung prinzipiell schon einmal, jedoch wird 
alles was ich auf den ersten Controller ausgebe (und somit nur auf der 
linken Hälfte erscheinen sollte) nochmal auf der rechten Seite angezeigt 
- ist also doppelt zu sehen. Schreibe ich nur etwas in die rechte Hälfte 
(x >= 64), dann erscheint das auch nur dort. Also ich kann nicht den 
ersten Controller allein ansteuern. Woher kann dieser Effekt kommen? Ich 
hoffe ihr wisst was ich meine - ich experimentiere schon seit Stunden 
und komm einfach nicht auf den Fehler. Es ist bestimmt was ganz 
einfaches. Das kann nur noch was ganz einfaches sein. Ein Kabelbruch 
oder so ;)

Vielen Dank für Hilfe
Randy Nürnberger

von Florian D. (code-wiz)


Lesenswert?

Wie hast Du denn die CS-Leitungen verdrahtet bzw. wie steuerst Du die 
an?

von Randy N. (huskynet)


Lesenswert?

Jeweils eine CS-Leitung an einen Pin des Steuerports (bei mir PORTF). 
Also:

PF0 = Data/Instruction
PF1 = Read/Write
PF2 = Enable Signal
PF3 = Chip Select IC1
PF4 = Chip Select IC2

Und an PORTA hab ich den 8-bit Datenbus hängen.

von Florian D. (code-wiz)


Lesenswert?

... und der Quelltext?

von Randy N. (huskynet)


Angehängte Dateien:

Lesenswert?

Der aus dem Beitrag oben. Hab den Quellcode nochmal angehängt. Hier der 
Header:

#include <inttypes.h>
#include <avr/pgmspace.h>

#ifndef  KS0108_H
#define KS0108_H

// Ports
#define LCD_CMD_PORT    PORTF    // Command Output Register
#define LCD_CMD_DIR      DDRF    // 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
#define RESET        0x05    // RESET 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

von Randy N. (huskynet)


Lesenswert?

Und ein einfaches:

ks0108Init();
ks0108SetDot(0,0);

funktioniert (!), aber zeigt den Punkt eben zweimal an - einmal an (0;0) 
und einmal an (64;0). Wenn ich aber folgendes schreibe:

ks0108Init();
ks0108SetDot(64,0);

DANN erscheint wirklich nur ein Punkt an (64;0).

Muss ich beim Anschließen irgendwas beachten? Habe einfach nen Draht von 
dem Pin zu dem auf dem Grafikmodul gezogen. An der richtigen Stelle sind 
sie alle.

von Florian D. (code-wiz)


Lesenswert?

Liegt bestimmt an der Verdrahtung. Es scheint ja so, dass bei x<64 CS1 
und CS2 gesetzt werden und bei x>=64 nur CS2. Vielleicht ist CS2 immer 
gesetzt. Bist Du Dir sicher, dass Du dich bei den Pins nicht vielleicht 
verzählt hast, so dass z.B. der Reset-Ausgang vom µC mit CS2 vom Display 
verbunden ist?

von Randy N. (huskynet)


Lesenswert?

Hm da haut tatsächlich was nicht hin. Hab, um mal zu messen, ob die Pins 
nicht vielleicht beim Anlöten des AT90CAN128 vielleicht verbunden worden 
sind, mal nur folgendes geschrieben:

DDRF = 0b11111111;
PORTF = 0b01010101;

Und wenn ich messe kommen bei den letzten beiden Pins 5V. Hm ich kann 
nur keine Verbindung erkennen. Also die letzten beiden Pins hängen ja in 
der Luft - sind nur auf der kleinen Leiterplatte festgelötet, aber dann 
ist da kein Draht dran. Komisch.

von Randy N. (huskynet)


Lesenswert?

Wegen dem setzen: ich glaub das ist genau invertiert. Also wenn beide 
CS-Leitungen LO, dann sind beide aktiviert, und wenn beide HI, sind 
beide deaktiviert. Oder?

Ich hab jetzt nochmal die beiden CS-Leitungen an die zwei anderen Pins 
umgelötet - mit dem gleichen Ergebnis. Aber es MUSS an der Hardware 
liegen. *seufz

Ich schlaf jetzt erstmal und wenn ich wieder aufstehe, funktioniert es 
;) (Erstaunlicherweise kriegt man wirklich immer die Probleme, die einen 
am Vortag unlösbar erschienen, am nächsten Tag ziemlich flott hin - 
heh). Danke trotzdem für die Hilfeversuche - trotz dass es so spät ist 
:)

von Randy N. (huskynet)


Lesenswert?

OK PROBLEM GEFUNDEN !!! VIELEN DANK :)

Also ich hab jetzt diese CS-Leitungen mal abgelötet und per Hand mal an 
den Pluspol gehalten und siehe da: es geht. Also der AT90CAN128 hat da 
irgendwie ein Problem mit seinen Ports. Entweder da ist was verbunden 
oder k.A.

von Andreas K. (a-k)


Lesenswert?

CS-Signale sind meistens active low, d.h. aktiv=0 inaktiv=1. Ob hier 
auch, ist aufgrund der doch sehr dicken Wälzer von Datasheets wohl nur 
praktisch zu ermitteln. Mindestens bei 
http://www.lcd-module.de/deu/pdf/grafik/j128-6n6.pdf steht das immerhin 
auch so drin.

Dein oben angehängter Code geht freilich von active high aus.

von Spess53 (Gast)


Lesenswert?

Hi

Hast du das JTAG-Interface deaktiviert. PF4 gehört dazu.

MfG Spess

von Randy N. (huskynet)


Lesenswert?

JUHU SUPER DANKE!!

An JTAG lag es - habs ausgeschaltet und es geht!

Allerdings kann ich jetzt den µC nicht mehr programmieren, wenn JTAG aus 
ist (also das Fuse-Bit JTAGEN nicht gesetzt ist). Ich muss das vorher 
immer erst wieder setzen, dann das Programm übertragen, dann wieder 
löschen (verwende PonyProg dazu). Aber JTAG hat doch nichts mit der 
Programmübertragung zu tun, oder? Kann man JTAG auch auf dem µC per 
Software ausschalten?

von Simon K. (simon) Benutzerseite


Lesenswert?

Wenn du per JTAG programmierst hat das schon was damit zu tun ;)

PS: Ja man kann das JTAG per Software ausschalten. Durchsuch das 
Datenblatt mal nach "JTD".. Soweit ich mich erinnere musst du in MCUCSR 
das Bit JTD zwei mal hintereinander setzen.

von Randy N. (huskynet)


Lesenswert?

Hm ich programmiere per ISP.

Aus dem Datenblatt:
"When the JTAGEN fuse is unprogrammed, these four TAP pins are normal 
port pins and the
TAP controller is in reset. When programmed and the JTD bit in MCUCR is 
cleared, the TAP
input signals are internally pulled high and the JTAG is enabled for 
Boundary-scan and programming."

Also muss ich JTD in MCUCR setzen. Nur leider funktioniert das dann 
trotzdem nicht, also das bleibt aktiviert.
PonyProg spinnt jetzt auch irgendwie - jedesmal bringt es jetzt einen 
Übertragungsfehler (auch wenns richtig übertragen wurde).

Naja auch egal erstmal - deaktivier ichs halt jedesmal. Vielleicht löt 
ich das ganze auch nochmal an einen anderen Port...

von Simon K. (simon) Benutzerseite


Lesenswert?

Seite 305 (02/07):
1
In order to avoid unintentional disabling or enabling of 
2
the JTAG interface, a timed sequence must be followed when changing this bit: The application 
3
software must write this bit to the desired value twice within four cycles to change its value. Note 
4
that this bit must not be altered when using the On-chip Debug system.

Sprich:
1
ldi temp, (1<<JTD)
2
out MCUCR, temp
3
out MCUCR, temp
bzw.
1
MCUCR = (1<<JTD);
2
MCUCR = (1<<JTD); //Und hoffen, dass nichts wegoptimiert wird ;)

von Spess53 (Gast)


Lesenswert?

Hi

Am einfachsten wäre es, CS mit einem anderen Pin zu schalten.

MfG Spess

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.