Forum: Mikrocontroller und Digitale Elektronik ks0108-atmega32


von Alex P. (dynamo)


Angehängte Dateien:

Lesenswert?

Hallo,

problem: das display gibt müll aus (aber es gibt was aus)

bisher gemacht: wie im anhang hab ich alles verdrahtet, habe die
libs/quellcode von apetech genommen, dann aus der ks0108.h die Ports
für data auf A und Ports für command auf B gestellt, in der makefile
hab ich meinen quarz mit F_CPU=16000000 angegeben/den mikrocontroller
aus atmega32 gesetzt, flashen funktioniert, an den ports wird auch was
ausgegeben (oszi zeigt das) und das display zeigt blöcke oder einzelne
punkte an.

selber hab ich angst, dass: das kabel vom atmega zum display zu lang
ist (ca 30cm), ich falsch verdrahtet habe (deswegen anhang), der
"reset" vom display falsch verdrahtet ist(liegt im moment auf
Vdd=+5V)

hier die belgung des ks0180-displays:
1:Vdd
2:Vss
3:V0
4:DB0
5:DB1
6:DB2
7:DB3
8:DB4
9:DB5
10:DB6
11:DB7
12:CS1
13:CS2
14:Reset
15:R/W
16:D/I
17:EN
18:VEE
19:LED+
20:LED-

aus der kd0108.h:

#define LCD_CMD_PORT    PORTB  // von A auf Command Output Register
#define LCD_CMD_DIR    DDRB  // 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

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


was mach ich falsch?
kann mir einer weiterhelfen und sich den schaltplan mal anschauen?

mfg

dnm

von Marko (Gast)


Lesenswert?

wenn mist ankommt hats meistens n timingproblem ...
häng mal n paar nops rein, vor allem beim
E-Puls

von Marko (Gast)


Lesenswert?

fährst du den mit den vollen 8 bit an?
ich verwende meist nur den 4-bit modus, das spart pins
am mega.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Das ist nicht zufällig das C-File von M.Thiele?
das lief bei meinem 128x64-Display fast auf Anhieb. Allerdings ist mein
Command-Port auf Port C.
Ich hatte Probleme mit dem Reset. Habe diesen an das System-Reset
angeschlossen (MCU) und es funktionierte.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Warum verbindest Du  Pin1 mit Pin 14 und dann mit GND?
Irgendwie werde ich nicht so schlau aus deinem Plan (fehlende
Konnektoren)! Ich würde den RESET nicht von vornherein auf GND ziehen.
Bei mir funktioniert das Display nicht wenn ich dies tue. Ich habe es
gerade ausprobiert.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

hast Du auch die Reihenfolge der datenleitungen eingehalten? DB0 Anzeige
mit PA0 des Controllers?

von Alex P. (dynamo)


Angehängte Dateien:

Lesenswert?

"wenn mist ankommt hats meistens n timingproblem ...
häng mal n paar nops rein, vor allem beim
E-Puls"
was sind nops?

"fährst du den mit den vollen 8 bit an?
ich verwende meist nur den 4-bit modus, das spart pins
am mega."
ich hab alle 8 in der reihenfolge wie im plan angeschlossen und das *.c
-file von F. Thiele verwendet

"Allerdings ist mein
Command-Port auf Port C.
Ich hatte Probleme mit dem Reset. Habe diesen an das System-Reset
angeschlossen (MCU) und es funktionierte."
so hab ich es jetzt,es ist jetzt wie im (neu angehängten) plan
angeschlossen, bringt aber keine verbesserung, jetzt wird gar nichts
mehr ausgegeben

"hast Du auch die Reihenfolge der datenleitungen eingehalten? DB0
Anzeige
mit PA0 des Controllers?"
jop

ich hatte den reset vorher also auf 5 volt(hatte mich im plan
verzeichnet), ihr habt den reset auf dem reset vom mcu? wo soll ich
weitersuchen? die kabellänge ist wirklich kein problem? (30cm)

vielen vielen danke schonmal!!

dnm

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Im Plan erkenne ich, dass Du PA7 mit DB0 (Anzeige) angeschlossen
hast.Dies wäre, wenn es so verbunden wurde, falsch! Hast Du wirklich
die Datenleitungen korrekt verbunden? Liegt der Fehler in deiner
Zeichnung oder deinem Aufbau?
Ansonsten zeig doch mal dein Programm (Hauptprogramm genügt).

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Die Kabellänge ist bei mir auch nicht viel kürzer und es gibt keine
Probleme!

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Du musst naürlich auch darauf achten, ob der Reset High- oder Low-aktiv
ist. Bei meinem Display ist er High-aktiv!!! Es wäre (so wie Du es
angeschlossen hast)  ständig zurückgesetzt.

von Alex P. (dynamo)


Lesenswert?

zeichnung war falsch, gestern abend schnell zusammengeschustert, sry
die datenleitungen sind genau verdreht angeschlossen, hab grad
überprüft.

das hauptprogram sieht so aus:
/*
 * 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:    KS0108 Library Demo Program
 *
 */

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

#include "ks0108.h"
#include "arial_bold_14.h"
#include "corsiva_12.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);
  // Set a position
  ks0108GotoXY(15,10);
  // Print some text
  ks0108Puts_P(PSTR("KS0108-Treiber"));
  // a nice little round rect
  ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK);

  // Once again :)
  // Select a font
  ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
  // Set a position
  ks0108GotoXY(5,30);
  // Print some text
  ks0108Puts_P(PSTR("http://www.apetech.de\nmailto:me@apetech.de";));

  while(1);
}

auf dem datenblatt ist das lcd mit dem lpt verbunden und dabei ist
reset fest auf 5V, das wäre dann doch quasi activ high, oder? über
einen widerstand auf masse gäbe es dann ein reset, oder?
wieso ist das beim lpt-anschluss dauerhaft auf 5V?

dnm

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Wenn es dauerhaft auf High liegt, dann ist der Reset eher Low-aktiv,
sonst wäre das Display ja ständig zurückgesetzt. Das Reset ist nur
wenige mikrosec aktiv und dann nicht mehr. Es muss also beim
Einschalten kurz auf low gezogen werden (wenn es Low-aktiv ist)und geht
dann auf High (RC-Kombination).
Das Programm läuft so wie es ist bei mir auf dem Display.
Ich kann von hieraus nicht sagen was es noch sein könnte. Wie gesagt an
der orginalen Software liegt es nicht. Es handelt sich wohl eher um ein
schaltungstechnisches Problem.
Welches Grafik-Display(!!!) hast Du denn angeschlossen (128x64)?

von Alex P. (dynamo)


Angehängte Dateien:

Lesenswert?

ich habe das AG12864 B-TMI-V

wie würde so eine rc-kombination aussehen?
könntest du mir da eine kleine skizze machen?

ich hoffe, ich hab das jetz verstanden: wird der reset am auf
ground(low) gesetzt, wird er ausgelöst, den rest der zeit soll er auf
high(+5V) sitzen.

kann das ganze problem noch am reset hängen?

im anhang ist mal die beschaltung mit dem lpt meines displays, so wie
es im datenblatt steht.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Den Reset hast Du eigentlich gecheckt (Low-aktiv) indem Du das Display
auf den Reset des MCUs gelegt hast. Und nach der Schaltung die Du im
Anhang hast ist das Display auch Low-aktiv.
Wäre es High aktiv müsstest Du den R auf GND legen und den C auf +5V.
Also gerade andersrum.
Ich kann per Ferndiagnose jetzt nichts mehr sagen.
Vielleicht nochmal alle Anschlüsse checken (auch auf Durchgang). Kabel
kürzen wenn es geht. Takt verringern (probiere mal den internen 8MHZ
RC-Oszill.-> Fuses setzen). Mein Display läuft auf 8MHz.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Ich habe gesehen das im datenblatt deines Displays die CS Low-aktiv
sind. Die Software steuert, so wie ich es weiss, die CS aber H-aktiv.
Das wär dann dein Problem! CS muss, wenn es mit der Software laufen
soll, H-aktiv abgeändert werden.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Natürlich Low-aktiv! SoRRY!! das heisst Zum Ansteuern des entsprechenden
Chips musst du das Bit löschen nicht setzen(!!!). In der Software ist
das genau andersrum! Da kann also nix bei rauskommen. Das erklärt auch
das deine MCU arbeitet aber nix auf dem Display zu sehen ist.

von Alex P. (dynamo)


Lesenswert?

aus den *.c files gibt es diese abschnitte:

if(chip == CHIP1)
{
  LCD_CMD_PORT &= ~(0x01 << CSEL2);  // deselect chip 2
  LCD_CMD_PORT  |= 0x01 << CSEL1;          // select chip 1
}
else if(chip == CHIP2) {
  LCD_CMD_PORT &= ~(0x01 << CSEL1);  // deselect chip 1
  LCD_CMD_PORT |= 0x01 << CSEL2;          // select chip 2

habe sie wie folgt geändert:

if(chip == CHIP1)
{
  LCD_CMD_PORT |=0x01 << CSEL2;    // deselect chip 2
  LCD_CMD_PORT &= ~( 0x01 << CSEL1);  // select chip 1
}
else if(chip == CHIP2) {
  LCD_CMD_PORT |=0x01 << CSEL1;    // deselect chip 1
  LCD_CMD_PORT &= ~( 0x01 << CSEL2);  // select chip 2

hat aber nicht die gewünschte wirkung erbracht.

von Alex P. (dynamo)


Lesenswert?

müssen evtl. alle command ports umgedreht werden?

dnm

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Alles was mit CS zutun hat muss geändert werden. Überall wo das Portbit
zur Aktivierung des Chips (CS1 oder CS2)gesetzt wird muss nun das
Portbit gelöscht werden. Bevorzugst Du eine Hardwarelösung? Dann musst
Du zwischen MCU und Display Inverter für CS1 und CS2 setzen.
Das mit dem CS musst Du auf jeden Fall ändern so wird das nie was.
Eventuell bekommst Du  bei zu hoher Taktung noch Probleme mit dem
Timing. Dann musst Du weitere NOPs (No Operation) einfügen um die
Verzögerung zu erhöhen. Oder Du taktest langsamer (s.o.), wenn das bei
Dir möglich ist. Wenn Du die hohe Clockrate brauchst, ja dann musst Du
die Verzögerungen ändern. Jetzt versuche erst mal die CS-Ansteuerung zu
ändern und dann gehe den nächsten Schritt.

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Steuere aber Reset wie gehabt über die MCU!!

von Alex P. (dynamo)


Lesenswert?

jop, überall, wo das portbit zur aktivierung des chips gesetzt wird,
wird es jetzt gelöscht und umgekehrt. bin das file gerade
durchgegangen. der mcu läuft jetzt mit 8MHz die 16 sind mir nicht so
wichtig. das display bleibt schwarz(blau)

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Ich finde jetzt nichts mehr was es sein könnte (die Ansteuerung von
DI,RW und Enable ist ok zumindest softwareseitig). Das CS musste auf
jeden Fall geändert werden.
Vielleicht hat ja noch ein Anderer eine Idee?

von Alex P. (dynamo)


Lesenswert?

danke trotzdem!
war mir auf jeden fall schonmal eine rießen hilfe! ich schreib hier
rein falls sich was tut!

von Joerg M. (Firma: TU Wien) (pinning)


Lesenswert?

Das wäre nett von Dir zu hören, wenn Du das Problem gelöst hast.
Ich habe schon viele Stunden an diesen Displays verbracht, da muss man
einfach hartnäckig bleiben. Irgendwie verhalten sie doch immer ein
bischen anders, auch wenn der gleiche Controller drauf ist. Ich
probiere dann alles mögliche, denn bekanntlich kann man auch
gelegentlich Pferde kotzen sehen. Vielleicht probierst Du mal einen
anderen Port für die Controllleitungen (PortC) :-)). Ansonsten viel
Glück!

von Alex P. (dynamo)


Lesenswert?

Halli, Hallo

schlagt mich, ich habs nicht anders verdient ;] 1.: es ist nicht activ
low -> ich muß nichts in der *.c ändern
2.: das platinenlayout sollte man des öfteren genau anschauen :], d.h.
2 Leiterbahnen waren miteinander verbunden. tja, so einfach kann es
sein :]

was ich noch alles gemacht hab, war das flachband kabel verkürzen, kann
ein abgeschirmtes kabel einlöten, dann hab ich alles nochmal
durchgemessen und diesmal auch darauf geachtet, dass nah nebeneinander
liegende leiterbahnen nicht miteinander verbunden sind. also tut mir
leid, dass ich hier so viel wind gemacht hab!

und noch mal vielen dank an joerg miehle!

man muß von vornherein alle fehlerquellen beseitigen, das ist mir
wieder einmal klar geworden. jetzt gehts weiter mit programmieren. wer
mein project verfolgen will, kann auf meine homepage gucken:
www.apellex.istgenial.de unter lianlex ist alles drin.

dnm

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.