www.mikrocontroller.net

Forum: Projekte & Code KS0108 GLCD Routinen


Autor: ape (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum
Ich hab ein paar C-Routinen zur Ansteuerung eines Grafik LCDs mit
KS0108 Controller (128x64 Pixel) geschrieben, da ich zum einen das
ganze als Übung mit dem avr-gcc benutzt hab und zum andern nirgends was
vernünftiges fertiges gefunden hab.
Ich unterstütze noch keine Grafikfunktionen (also Rechtecke, Kreise,
etc...), aber Texte können in beliebigen Schriftarten dargestellt
werden und pixelgenau positioniert werden (unabhängig von den 8 pixel
hohen pages des display memories)
Ein kleines Beispiel Programm für den mega16 liegt bei. Wenn man das
ganze auf einem mega mit mehr als 8MHz betreiben möchte, muss
mölicherweise die wartezeit in der enable routine verlängert werden
(das busy flag wird nicht ausgelesen)

Weitere Informationen und nen Programm um Schriftarten zu erstellen
gibs auf meiner (Achtung Werbung: :)) neuen Internet-Seite
http://www.apetech.de

Würde mich freuen wenn ein paar von den Gurus die hier unterwegs sind
mal nen Blick drauf werfen könnten und was zu meinem Programmier-Stil
sagen würden :)
Ich komm aus der Java Welt und beschäftige mich erst seit kurzem mit C.
ins besondere Pointer sind mir manchmal noch nen ziemliches Rätsel,
werd mir wohl doch nen Buch kaufen müssen

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schade deine (Achtung Werbung: :)) neuen Internet-Seite ist ja wohl noch
in Arbeit, und rar, kann von minem Browser und Winzip nicht gelesen
werden. (Gibt es eigentlich einen vernünftigen Grund AVR C-Code
komprimieren zu müssen ?  Also ist erst mal nicht mit anschauen
(interessiert mich brennend) . Ich versuches heute abend noch mal von
dem anderem Rechner.

Gruß Bernhard

Autor: ape (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ok hier also nochmal als zip :)
naja sind 6 dateien

fürs display
ks0108.c
ks0108.h

beispiel programm
main.c

2 header dateien mit 2 unterschiedlichen schriftarten
einmal 6x8 pixel und einmal 12x16

und mein makefile is auch noch mit reingerutscht seh ich gerade

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

fuer KS0108-Geschichten verwende ich immer die Lib von Gregor Horvat
(http:\\www.silon.si\grega\index.html), die ich um byteweises
Schreiben ergaenzt habe. Vielleicht bringt sie Dir fuer Kreise,
Rechtecke usw. noch was.

Der Font-Generator ist toll -- damit werde ich am WoE mal herumspielen.
Vielleicht koennen wir ja hier noch ein bisschen Font-Sharing
betreiben?

Gruss,
Dirk

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppala, da gabs wohl nen Umzug:

http://www.indata.si/grega/

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na klar wenn jemand ne hübsche font gebastelt hat kann er sie mir
schicken dann stell ich sie auf die seite dazu

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Update:
Jetzt kann man auch Striche, Rechtecke und Kreise zeichnen. Außerdem
kann die Darstellung invertiert werden.

http://www.apetech.de/glcd.php

mfg
ape

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ape,

gerade mal ausprobiert:

Probleme:

pgm_read_byte heisst bei mir PRG_RDB
Bei den (1 << PIN)-Angaben macht er bei mir Probleme. Ich verwende
dafuer immer sbi(DATAPORT, DATAPIN);, bzw. cbi

Habe es leider noch nicht zum laufen gebracht, aber mal Deine Schriften
in meine Libs eingebaut. Super! Besonders die grosse hats mir angetan.

Gruss,
Dirk

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was benutzen du fürn compiler?
also mit dem aktuellen avr-gcc sollts eigentlich gehen

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr-gcc -v sagt mir:

gcc version 3.3 20030512 (prerelease)

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gcc version 3.3.1

muss wohl aber daran liegen.
in meiner avr-gcc dokumentation ist PRG_RDB() deprecated und man soll
statt dessen pgm_read_byte() verwenden

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, dann weiss ich ja, was ich am Wochenende zu tun habe. Du kennst
nicht zufaellig eine Adresse mit rpm-Paketen? :)

Gruss,
Dirk

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nope
ich schäme mich zwar dafür aber bin im moment windoof user und arbeite
mit WinAVR :)

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dirk

Auf der Grega-Seite steht was von HD61202. Ist das der gleiche
Controller wie der KS0108?

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo emax (toller Nickname btw.!),

ja, die Chips sind baugleich.

Gruss,
Di-vim-rk

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn schon mal einer eine Platine mit geeignetem AVR gebaut, der
nichts anderes tut, als das Display zu managen? Also so eine Art
eigenen Grafikprozessor?

Wenn nicht, dann wäre das doch ein interessantes Projekt.

Dem AVR könnte man Befehle schicken (dazu bräuchte es ein kleines
Protokoll), und dieser müsste sich dann um die Umsetzunmg auf dem
Display kümmern...

Das wäre sicher preiswerter, als ein teures Grafik-Display mit einem
Controller, der solche Befehle bereits "eingebaut" hat.

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Dirk

Danke für die Antwort!

Und auf den Namen emax bin ich auch erst vor ein paar Monaten
gekommen.

 - ohne diesen Editor bin ich:

                          NICHTS!

:-))

Na diejenigen, die damit arbeiten, die wissen schon warum...

e.

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo emax,

ich habe hier so einen "Wollmilchsau"-Platine -- ATMega16,
128x64-Display, TSOP fuer IR, I2C-Bus fuer Thermometer, Flash u.a..

Schoenes Feature: Helligkeitsregelung des LCD ueber PWM, per IR
steuerbar...

Bootloader von Peter (s. Bootloader-Thread im Codesammlungs-Forum) ist
auch drauf.

Bin gerade dabei, ein ordentliches Protokoll fuer den UART zu
schreiben, um die Daten meines VDR auf dem Display zu zeigen. Wenn das
klappt, dann nenne ich das Teil auch noch "eierlegend".

Gruss,
Dirk

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hört sich gut an.

Was ich toll fände wäre, wenn man so ein Display zusammen mit einem
möglichst preiswerten AVR/ATxxxx auf ein Platinchen montiert, um dann
eine eigenständige, autarke und intelligente Grafikeinheit zu haben.

Wenn man bedenkt, was so eine Lösung normalerweise kostet, dann wäre so
ein Board sicher um einiges Preiswerter. Obendrein könnte man die
Firmware (so dürfte man das ja dann wohl nennen) auch noch selber an
seine Belange anpassen.

e.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann immer ran! :)
Is ja nich viel zu nötig. Nen Mega16 sollte genügen, das Grafik-LCD,
vielleicht noch nen serielles EEPROM und nen Stecker für UART oder
irgendeine andere Schnittstelle der Rest is Software. Sollte aber auch
nich allzu schwer zu realisieren sein.

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht fang ich damit mal an.

Vorher ist aber noch ne Stuererklärung zu machen :-((

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich fang grad mit AVR's an und genau sowas wird mein erstes Projekt
:)
ein (halbwegs) intelligentes LCD fuer meinen MP3-PLayer. Na mal sehen
was draus wird :)

Tobias

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

falls du dieses Display fuer einen Yampp Mp3 player nutzen willst
solltest du mal auf die Homepage von Jesper gehen. Da hat jemand das
schon fertig dafuer.


Mfg

Dirk

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

@Ape: Ich habe mir mal deine Headerdatei angeschaut um die Pinbelegung
zum Controller rauszufinden. Leider habe ich nicht herausgefunden an
welchen Pin Reset muss. Kann mir da jemand kurz weiterhelfen?


Mfg

Dirk

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

DataPort = Porta (0...7)

CommandPort = PortD

D/I = Portd.0
R/W = Portd.1
Enable = Portd.2
CS1 = Portd.3
CS2 = Portd.4
Reset = ?

RS ist wohl D/I oder irre ich mich da?


Mfg

Dirk

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Reset hab ich bei mir einfach direkt mit nem 10k widerstand auf vcc
getan. da ich den bisher noch nie gebraucht hab.

D/I legt fest ob Data oder Instructions also Befehle gesendet werden
mfg ape

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

biste einmal so nett und kannste mal schaun an welchen Pin der D/I Pin
vom Controller zum LCD geht. Bei mir im Datenblatt gibt es leider kein
D/I sondern nur GND, VDD, VO, RS, R/W, E , D0 .... D7 , CS1 , CS2 ,
Reset , Vout , LED + , LED -


Ich danke Dir.


Mfg

Dirk

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D/I sollte IMHO dasselbe wie RS (Register Select?) sein.

Gruß,
Dirk

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, DI = RS = REGISTER SELECT.

Über RS wird ausgewählt ob Daten oder Instruktionen gesendet werden.

Autor: Dieter B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  Dirk

D/I = RS

MFG

Dieter

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

also die Routinen funktionieren wunderbar. Ich haette habe da aber noch
kleinere Probleme und hoffe nicht das es am Display liegt.


1. Das LCD ist in zwei Pages unterteilt. Genau in der Mitte der beiden
Pages habe ich keine Bildpunkte

2. Die Backlight LED: fuer diese LED habe ich ein 12 Ohm widerstand
genommen. Leider scheint mir das Display sehr dunkel im Dunkeln kann
man nix sehen :/

Hat jemand Rat ?


Mfg

Dirk

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu 1) also klingt so als würde es an nem software problem liegen, aber
wenn du das alles unverändert übernommen hast sollte das eigentlich
alles funktionieren. tuts bei mir jedenfalls :) möglicherweise nen
timing problem, also der prozessor zu schnell? mit 8MHz und langsamer
sollts aber problemlos gehen.
nur am rande: es sind 2 chips nich 2 pages. eine page ist immer ein 8
pixel hoher streifen.

zu 2) mein display benötigt sowas um die 7V für die
Hintergrundbeleuchtung. bei 5V passiert da noch nich viel. weiß
natürlich nich wies bei deinem ist. aber nen blick ins datenblatt
sollte helfen. oder häng einfach mal nen messgerät dazwischen und guck
wieviel strom die beleuchtung aufnimmt.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,


1.) also dieses Problem scheint an der Software zuliegen... es
funktioniert solange bis ich Buchstaben auf das Display wiedergebe.

2.) die LED scheint wohl kaputt zu sein .... den die
Hintergrundbeleuchtung zieht kein Strom. Mit ein bischen Glueck koennte
es daran liegen das ich nur 5V fuer die led benutzt habe.


Mfg

Dirk

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LEDs sind stromgesteuert, nicht spannungsgesteuert. Also, ob da jetzt 5
oder 7V anliegen ist denen zunächst egal, solange der Strom durch die
LEDs nicht zu hoch wird (sonst kaputt) und die "Forward Voltage"
(Durchlaßspannung der LEDs) überschritten ist (sonst dunkel). Bei den
"typ." HG-Bel. sind das 4.2V (Falls 2 LEDs in Reihe geschaltet
sind).
Also Strombegrenzungswiderstand ausrechnen und dabei auf Ptot achten.
Der 1/4W-Normalwiderstand hält dies u.U. nicht aus.

----, (QuadDash).

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"LEDs sind stromgesteuert, nicht spannungsgesteuert"

Na ohne Spannung geht trotzdem nix. Es sei denn, du hättest da was
Neues entdeckt: Stromfluss unabhängig von der Spannung. Wenn das so
ist, dann lasses mich wissen ....


;-))

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, war so mißverständlich oder wolltest du nur das letzte Wort haben?
;)

----, (QuadDash).

Autor: Stefan Seegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An Dirk:

Wie hast du das mit der Helligkeitsregelung per PWM gemacht ? Der VO
Eingang des Displays wird laut Datenblatt über ein Poti an VOut
angeschlossen, wo -5 Volt rauskommen. Wie hast du das gelöst ? Hättest
du da vielleicht ein Schaltbildchen ?

P.S.
ape: Danke für die Website, die ist super! ...übersichtlich und alles
brauchbar was drauf ist.

Stefan

Autor: Dirk Wiebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

du meinst sicher die Kontrasteinstellung -- die ist auch bei mir mit
einfachem Trimmpoti geregelt. Die LED-Beleuchtung habe ich mit einem
einfachen Standard-Transistor (BC547) gemacht -- wenn Pegel auf 0, dann
schaltet er durch. Das ganze an einen PWM/Timer-Port gehaengt und
eingestellt.

Gruss,
Dirk

Autor: Darko Sabljo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ape,

Ich benutze momentan deine LIB um mein Display anzusteuern.
Funzt soweit auch einwandfrei!
An dieser stelle erstmal ein daknke für die klasse lib.

Nur hätte ich eine kleine frage:

Deinen Fonteditor ist wie ich die Sache sehe in Java geschrieben.
Wie kann ich das ausführen?
Ist bestimmt ziemlich blöd die Frage.. aber ich bekomms hier nicht hin
auf meiner Kiste :(
Danke
Gruss
Darko

Autor: Darko Sabljo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

hat sich erledigt...
habs hinbekommen, lag daran das mein Java nicht die richtige Path
angabe hatte...

gruss
darko

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
nach langer Zeit des dahinmoderns und nichts tuns, bin ich mal wieder
aus meiner Lethargie erwacht :D

Ich hab die Lib jetzt komplett überarbeitet. Die Grafik-Funktionen sind
etwas mehr geworden, besser strukturiert und können sowohl schwarz als
auch weiß malen. Außerdem habe ich einige Funktionen etwas optimiert
und der Bug in ks0108ReadData() beim überschreiten der Grenze zwischen
den beiden Chips ist behoben (Dank an mthomas).
Außerdem habe ich die Font-Unterstützung komplett erneuert. Der
zugehörige Font-Editor ist jetzt wesentlich komfortabler und kann
direkt System-Fonts importieren. Die einzelnen Zeichen können
unterschiedliche Breiten haben.

Weiter Informationen und die Downloads befinden sich auf meiner
Internet-Seite ( http://www.apetech.de )

mfg
ape

Autor: Dieter Brüggemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ape

Benutze gerade deine neue LIB für den KS0108 in Verbindung mit
deinem Font Tool. Klappt wunderbar.

Leider habe ich Probleme, wenn ich z.B. eine Arial Schrift in Size 12
erstelle unf benutze. Die Zeichen werden dann nicht richtig
dargestellt.
Ebenso alle Schriften, wo die Schriftgrösse nicht ein vielfaches von 8
sind. Es gehen also nur Schriften der Größe 8, 16, 32 ,64.

Ist das so von Dir so gewollt, oder noch ein kleiner Bug ?


MFG
Dieter

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry das ich erst jetzt antworte, hab irgendwie die letzten tage nicht
in dieses Forum geguckt.

Das ist ein Bug :)
Muss ich mir mal nochmal angucken

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So gefixt.
Steht auf meiner Website.

Autor: Dieter Brüggemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke für das Update.

Klappt jetzt ohne Probleme,

MFG
Dieter

Autor: josef01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich möchte gerne die lib von ape für den ks0108 benutzen. leider
arbeite ich mit codevision. kann mir jemand die funktionen nennen, die
in den include files <inttypes.h> und <avr/pgmspace.h>" stehen, die
ich für die ansteuerung des GLCDs brauche?

gruß

josef01

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
in intyypes.h sind nur die Datentypen definiert (also uint8_t, uint16_t
usw...). In der pgmspace.h sind die Prototypen für die Funktionen
definiert die Daten aus dem Flash lesen. Der Codevision-Compiler
verwendet hier leider ein völlig anderes Prinzip um solche Daten aus
dem Flash zu lesen.
Um das ganze nach Codevision zu portieren ist es also nicht damit getan
die entsprechenden Funktionen zu nennen. Du müsstest schon die
ks0108ReadFontData() in der Lib anpassen. Allerdings müsstest du auch
die Headerfiles in denen die Schriften definiert sind auf
Codevision-Standard umbauen.
Es wäre also wahrscheinlich einfacher auf den avr-gcc umzusteigen.

Autor: josef01 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

danke für die info. ich werde es erst mal mit codevision versuchen.

gruß

josef01

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

der font-creator will bei mir nicht laufen, obwohl ich sonst einfach
.jar Dateien starten kann. Es geht nur eine Dialogbox auf mit der
Überschrift 'Java Virtual Machine Launcher' in der steht 'Fatal
exception occured. Programm will exit.' .
Braucht man das JDK? Ich habe nur das j2re1.4.2_01 installiert.

Uwe

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Man braucht lediglich die aktuelle Version der Runtime Environment also
1.5.0

Autor: justo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

kannst du mir sagen, was diese vier funktionen tun? void
ks0108Puts_P(PGM_P str), uint8_t ks0108CharWidth(char c), uint16_t
ks0108StringWidth und uint16_t ks0108StringWidth_P(PGM_P str). ich
verstehe diese funktionen nicht. für ein zeichen bzw. mehrere zeichen
sind doch schon die funktionen int ks0108PutChar(char c) und void
ks0108Puts(char* str) vorhanden.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die Funktion void ks0108Puts_P(PGM_P str)gibt einen String aus, der im
Flash des AVRs gespeichert ist. Wenn man Strings hat deren Inhalt schon
zur Kompilierungszeit feststeht ist es sinnvoll diese ins Flash zu tun,
da auf diese Weise kein SRAM "verbraten" wird. Man benutzt sie so:

#include <avr/pgmspace.h>
#include "ks0108.h"

[...]

void meinBeispielFunktion(void) {
    [...]
    ks0108Puts_P(PSTR("Ein String im Flash"));
    [...]
}

Die Width-Funktionen geben jeweils (wie der Name schon sagt) die Breite
eines einzelnen Zeichens, eines Strings im SRAM und eines Strings im
Flash an. Die Breite der einzelnen Zeichen hängt ja von der verwendeten
Schriftart und nicht zuletzt auch von den Zeichen selbst ab.
Wenn man jetzt z.B. einen String mittig auf dem Display platzieren
möchte kann man einfach schreiben:

PGM_P string = PSTR("Mittiger Text");
uint8_t w = ks0108StringWidth_P(string);
ks0108GotoXY(64-(w<<1), 24);
ks0108Puts_P(string);

Das ganze kann man natürlich auch durch probieren erreichen und würde
dann sogar schneller ausgeführt werden, aber so ist es schon
komfortabler.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh es müsste natürlich heißen:

    ks0108GotoXY(64-(w>>1), 24);

Durch das schieben nach rechts, wird die Breite durch 2 geteilt.

Autor: justo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

vielen dank für die ausführliche beschreibung. eine frage habe ich aber
noch. kann man mit der ks0108Puts_P(PGM_P str) funktion auch variablen
in einem string, wie bei der printf funktion ausgeben?
danke für die mühe.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein um formatierte Strings mit Variablen auszugeben musst du die
Stdio-Funktionen nutzen. Das ist aber auch kein Problem.
Du musst in deinem File nur die stdio.h inkludieren und nach dem Aufruf
von ks0108Init() noch folgende Zeile einfügen:

fdevopen(ks0108PutChar, NULL, 0);

Damit teilst du der stdio-Lib mit welche Funktion sie benutzen soll um
Zeichen auszugeben.

Danach kannst du z.B. printf_P(PSTR("Variable: %d"), meineVariable)
aufrufen, der Text wird dann (mit eingesetzter Variable) auf dem
Display ausgegeben.

Da die stdio-Library allerdings recht groß ist, sollte man schon
mindestens einen mega16 einsetzen, da sonst nicht mehr viel Flash übrig
bleibt.

Autor: justo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

herzlichen dank für deine hilfe.

mfg
justo

Autor: justo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

wärst du nochmal so nett mir folgende programmzeilen zu erklären:
typedef uint8_t (*ks0108FontCallback)(const uint8_t*);
ks0108FontCallback  ks0108FontRead;
variable = ks0108FontRead(variable+variable);

dein programm funktioniert hervorragend, aber einige programmzeilen
verstehe ich nicht.

vielen dank im voraus.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab die Lib so gestaltet das die Schriftarten die verwendet werden
nicht unbedingt im Flash liegen müssen sondern sich auch auf beliebigen
anderen Medien befinden können z.B. ein I2C EEPROM oder auch eine MMC
oder so.
Daher verwendet die Lib zum lesen der Font-Daten eine
Callback-Funktion.  Das "Aussehen" dieser Funktion wird mit Zeile

typedef uint8_t (*ks0108FontCallback)(const uint8_t*);

definiert. Der Nutzer der Lib kann also eine Funktion schreiben, die
als Argument die Adresse des zu lesenden Bytes übergeben bekommt und
dafür das gelesene Datenbyte zurückgibt.

Mit der Zeile

ks0108FontCallback  ks0108FontRead;

wird einfach eine Variable des Typs der Callback-Funktion erzeugt.
Nicht anders als z.B. ein int. Nur das eben in der Variablen nicht eine
Zahl steht sondern die Adresse der Callback-Funktion die aufgerufen
werden soll um die Font-Daten zu lesen.

In der letzten von dir zitierten Zeile wird dann einfach ein Byte der
Font-Daten gelesen. Du hast das etwas unglücklich formuliert, in dem du
alles "variable" genannt hast :) Jedenfalls wird die Callback-Funktion
mit der zu lesenden Adresse aufgerufen und das Ergebnis gespeichert und
später auf dem Display ausgegeben.
Das Konzept der Callback-Funktion erscheint zunächst etwas
gewöhnungsbedürftig, ist aber eigentlich sehr logisch und in Situation
wie diesen äußerst hilfreich.

Ich hoffe ich hab jetzt keine Fehler gemacht, weil es ist spät und ich
hab einen Kater :)

Autor: justo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ape,

danke für die info.

gruß
justo

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre es auch möglich die Schriften  Texte  Bilder etc um 90° gedreht
anzuzeigen? Man könnte sich z.b. eine Art "Handheld" dann basteln !

Grüße
Alex

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
das Drehen der Darstellung in 90° Schritten ist mit dieser Lib nicht
möglich. Das Problem ist das mit einem Daten-Byte das man ans Display
sendet 8 in einer Spalte liegende Pixel gesetzt werden (eine Page).
Dadurch ist eine Drehung wesentlich komplizierter als bei bunten
Displays wo immer nur ein Pixel gesetzt wird.
Unmöglich ist nichts, aber man müsste schon sehr viel Aufwand
investieren und eine komplett neue Lib schreiben, Font-Format anpassen
etc.
Für ein schickes tragbares Gerät würde sich sowieso eher ein buntes
oder zumindest ein Display mit höherer Auflösung anbieten denk ich.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah oki Danke mal für die Info! Ich experimentiere gerade mit Bascom AVR.
Vieleicht pack ich es ja eine geeignete Routine zu basteln :-)

Grüße
Alex

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend ape,

Dein FontCreator finde ich toll. Kann man damit auch 32 x 32 Pixel
große Grafikzeichen erzeugen? Irgendwie scheit dieses bei mir nicht
zufunktionieren. Mache ich da einen Fehler, oder liegt es am Programm?

Viele Grüße und ein Dankeschön an ape!

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
32x32 Fonts gehen eigentlich, diese Größe hab ich selber schon
verwendet.
Für Width, Init Width und Height 32 einstellen, Start Index bei 32
lassen und Char Count so viele wie du halt brauchst.

Wichtig ist das der Start Index bei 32 bleibt, da die Lib, die das
Display ansteuert Zeichen mit ASCII Code kleiner 32 von vornherein
unterdrückt (ist vielleicht noch nicht ganz optimal :)

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich benutze C-Routinen zur Ansteuerung der KS0108 Controller.
Funktioniert sehr schön, nur ein Problem stellt sich bei mir ein.
Das Display ist ja in zwei Teile aufgebaut und genau die mittlere
vertikale Reihe zeigt Fehler indem manche Pixel verschoben werden.
Mir kommt es so vor als wenn ein Geschwindigkeitsproblem vorliegt wenn
vom ersten auf den zweiten controller gewechselt wird, wenn alles
langsamer läuft ist alles tadellos. Ich möchte die LCD-Seiten natürlich
möglichst flackerfrei aufbauen darum soll alles so schnell wie möglich
laufen.
Hat jemand eine Erklärung?

Mfg Michael

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habs gefunden. In der KS0108 Routine die schleife wait a little von
8 auf 10 erhöht.
mfg michael

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mein GLCD mit dem CHIO ks0108 von Powertip PG-12864A an einen
AT90S8535 angeschloßen mit 8 MHZ und den PORT Einstellugen:

#define LCD_CMD_PORT    PORTA
#define LCD_CMD_DIR    DDRA

#define LCD_DATA_IN    PINC
#define LCD_DATA_OUT    PORTC
#define LCD_DATA_DIR    DDRC

// Command Port Bits
#define D_I      0x00
#define R_W      0x01
#define EN      0x02
#define CSEL1      0x03
#define CSEL2      0x04

Das Problem ist aber das es nicht geht. Kann kein Text anzeigen .. kann
keine Punkte malen ... geht nix.
Voran kann es liegen? wo muss ich genauer nachschauen?
An denn Datenleitungen und am LCD kann es nicht liegen den ich habe es
an einem LPT1 ausgang getestet und es funktioniert wunderbar mit dem
Programm: http://www.skippari.net/lcd/ks0108.html

Kann mir einer Helfen hab keine Ideen mehr voran es leigen könnte

Autor: Mike Schaub (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist vielleicht der RESET-Eingang des Grafik-LCD's mit dem
Mikrocontroller verbunden? Wenn ja, könnte es sein das er dauerhaft auf
LOW liegt. Ist mir ebenfalls passiert - habs dann irgendwann gemerkt.

Gruß
Mike

Autor: meysam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thanks

Autor: Fabian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hab mir bei eBucht für kleines Geld neulich auch ein Glcd
ersteigert, und hab dann gestern angefangen es mit nem Mega32 und dem
STK500 anzusteuern.
Leider war ich am Anfang etwas verwirrt, weil das LCD nur 16Pins (+2
für BG) und nicht 18(+2) wie die meisten anderen hat. Nach längerem
Suchen hab ich dann festgestellt, dass mir der RST und Vout fehlt.
Leider war auch Das Datenblatt nicht wirklich aussagekräftig was jetzt
an Vo gehört. Ich bin zwar davon ausgegangen, dass es die
Kontrastspannung ist, aber als ich die über ein Poti zwischen Vdd und
Vss einstellen wollte (wie bei meinem 16x2 Character-LCD) tat sich gar
nix.
Also muss es ne negative Spannung sein...nur woher nehmen, denn dem LCD
fehlt ja der DC-DC.
Zum Glück hatte ich noch nen ICL7660 rumzuliegen. Mit -5V an Vo
funktioniert das LCD jetzt top!
Wollte das nur mal loswerden falls noch jemand mit diesem LCD
(Datenblatt im Anhang) kämpft. Falls jemand noch ne bessere Idee hat,
wo ich die Kontrastspannung her bekomm, gebt laut! ;-)

Danke Ape, super Routinen!

Gruß
Fabian

PS: Kann mir mal wer die Bezeichner Vdd, Vss, Vee, Vo usw
aufschlüsseln? Warum heisst es z.B. hier Vdd und nicht Vcc und was
heisst das dd eigentlich?

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja...ich musste in deiner lib ein paar for schleifen umschreiben:
bei
  for(volatile uint16_t i=0; i<15000; i++);
kam immer
../ks0108Test.c:22: error: 'for' loop initial declaration used
outside C99 mode

geändert in
  volatile uint16_t i;
  for(i=0; i<15000; i++);

ging einwandfrei.

Ich benutze das AVR-Studio4 mit GCC Plugin und bin sehr zufrieden
damit.

Gruß
Fabian

Autor: Manuel Borchers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fabian,

ich weiß nicht, ob deine Frage nach den Versorgungsbezeichnungen noch
aktuell ist, aber vielleicht interessiert es ja auch andere.

Der grundsätzliche Unterschied rühert aus den verschiedenen
Halbleitertechnologien her, also TTL und CMOS.

Bei bipolaren Transistoren sind die üblichen Bezeichnungen ja
Collector, Emitter und Basis.
In TTL-Logik (ausgehend vom Inverter) werden alle Collectoren mit
positiver Versorgung verbunden. Deshalb Vcc. Das V steht für die
Spannung (engl. Voltage) und das doppelte C deutet eben die
Collectorspannung an, doppelt deshalb, weil es eben nicht die
Collectorspannung eines einzelnen Transistors in Bezug zum Emitter ist,
sondern das globale Versorgungsnetz.
Zugehörig zum Vcc ist dann eben Vee für das globale Potential der
Emitter.

Bei MOS-Transistoren heißen nun aber die Anschlüße eben Drain, Source
und Gate. Analog zur Bipolartechnologie heißt deshalb das globale
Drain-Potential Vdd, also positive Versorgungsspannung (oder besser:
das höchste Potential mit dem das IC betrieben wird).
Und Vss eben für das niedrigste Potential am IC, womit die
Source-Anschlüße verbunden sind.

Hoffe ein wenig Licht in die Sache gebracht zu haben.

Gruß,
Manuel

Autor: jafar (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
xx

Autor: Adnane El yadari (simsim)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ape,
bin neu im Bereich mikrocontrollerprogramierung! Kannst Du mir bitte
Dein Schaltplan zur Steuerung des GLCD schiken! Möchte gern die
Pinbelegung zu Deinem Programm verstehen!
Danke

Autor: BlueNature (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Servus!

Hab mit den Informationen hier endlich mein Display zum Laufen
bekommen. Alles ganz nett, nur eben ein Bug den ich nicht erklären
kann. Ich bekomme im 2. Controller die Pages 1-7 nicht angesprochen.
Die linke ist ja genau gleich, nur eben die CS1-LEitung und die
CS2-Leitung anders angesteurt. Hat jemand eine Idee woher das kommen
kann?
Im Anhang habe ich ein Foto meines Displays angehängt das mein Problem
zeigt. Vielen Dank im Vorraus.


Grüße Wolfgang

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

erstmal ein dickes Lob an ape für die lib. ich habe die routinen so gut
wie es ging für codevision umgeschrieben. leider habe ich bei der
textausgabe einen fehler. wenn ich in der 0 page und in der 7 page
einen text schreibe, so wird der text in page 0 durch den text von page
7 überschrieben. ist dies ein bug in meiner software? wäre nett, wenn
mir jemand dazu was sagen könnte.

viele grüße und ein dankeschön im voraus.

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

hier ein bild meines glcds, wo die erste zeile von der letzten
teilweise überschrieben wird.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei 49 download kann mir keiner schreiben, ob der bug auch in der
originalsoftware ist?

viele grüße

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann setz doch mal zum Download nicht nur ein Displaybild, sondern auch
den Quellcode rein! Da wird schon jemand dann antworten! Aber bei einem
Bild kann ich keinen Prog-Fehler finden! Dein Bild ist Code-Technisch
einwandfrei (sonst könnte ich es nicht sehen! ;-) )

Grüße
Alex

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo alex,

vielen dank für deine antwort. hier nun mein quellcode. wenn ich in
eine page zeichen schreibe, so wird die nächste page auch überschieben.
dies fällt normalerweise nicht auf, da die nächste page, wenn gewünscht,
wieder mit zeichen beschrieben wird.

viele grüße

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gast,

der Fehler liegt in der "ks0108WriteData" bei der Second Page. Mit
"ks0108GotoXY" wird dort ein Y-Wert > 63 übergeben, der dann auf 0
zurückgesetzt wird!

Damit ist wieder die oberste Zeile aktiv! Abhilfe schafft eine
entsprechende Abfrage. Kleiner Tipp: Y-Start+Fonthöhe muss kleiner 64
bleiben...

Gruß
Stefan

Autor: Wolfgang Schmid (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Servus!

Möchte meinen aktuellen Stand meiner Version unter BASCOM einmal
veröffentlichen, habe da mit einen Font hinbekommen, im Groben alles am
Laufen. Basis ist ein ATmega8 der alles übernimmt.

Grüße Wolfgang

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo stefan,

danke für die info, werde nächste tage das mal ausprobieren.

viele grüße

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

ich habs gefunden. in der ks0108gotoxy-routine habe ich die abfrage auf
y >63 geändert.
nun habe ich aber ein weiteres problem. wenn ich ein text überschreibe,
werden nur die pixel des neuen texes gesetzt, die noch nicht gesetzt
waren. somit bleibt immer der vorherige text stehen. dies liegt
wahrscheinlich an das ausgelesen des glcdram's. die date wird dann mit
der neuen date verodert. unterbindet man das auslesen des glcdram's,
werden die zeichen nicht mehr korrekt wiedergegeben, wenn man nicht
genau in eine page schreibt. gibt es eine möglichkeit dieses zu
umgehen?
des weiteren möchte ich gerne wissen, wie lange der bildschirmaufbau
bei euerem display dauert?  bei meinem display dauert es ca. 1 sek bei
8mhz cpu clock und ohne pixelfehler, dies finde ich ganz schön lange.

wäre nett, wenn mir jemand helfen könnte.

viele grüße
gast

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gast,

die 2. Frage zuerst (ist leichter ;):
Mit einem 40 MHz uPSD3334 dauerts 4ms... Aber nur wegen Delays für den
Displaycontroller. Ansonsten würde ich es in ~ 1ms schaffen g. Bei
mir sind die Routinen aber so abgeändert, dass ich alle Änderungen im
RAM erledigen und bei Bedarf das Display in einem Rutsch neu
beschreibe.

Die 1. Frage ist schon komplizierter zu erklären:
Ausgang ist ein Zeichensatz mit der Größe 12, der über 3 Pages geht und
z.B. in Zeile 6 anfängt.
Das bedeutet: 2 Pixel in der ersten Page, 8 Pixel in der 2. Page und
die letzten 2 Pixel in der dritten Page.
Ich habe das Problem in 3 Schritten gelöst:
1. Schritt: Auslesen der ersten Page und Maskierung für die oberen 6
Bits und löschen der unteren 2 Bits. Untere 2 Bits mit Inhalt der
ersten 2 Fontpixel füllen.
2. Schritt: Zweite Page auslesen, keine Maskierung notwendig und
schreiben der Pixel 3-10.
3. Schritt: Dritte Page auslesen und Maskierung der unteren 6 Pixel mit
löschen der oberen 2 Pixel. Die obersten 2 Pixel werden dann mit dem
Inhalt der letzten 2 Pixel gefüllt...

Die Originallibs von Ape sind für diese Sonderfälle leider nicht
ausgelegt. Ein erster Workaround ist daher z.B. die betreffenden Pixel
vorab mit fillrect() zu löschen...

Gruß
Stefan

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo stefan,

vielen dank für deine antwort. da ich c-anfänger bin, werde ich das
erstmal mit fillrect() ausprobieren. mein bildschirmaufbau ist mit
deinem verglichen, natürlich viel zulangsam. kürze ich die wartezeit
(ca. 2ms) nach der enable -routine, bekomme ich pixelfehler. eigentlich
sollten 450ns ja ausreichen, warum dann pixelfehler auftreten verstehen
ich nicht. kann es sein, das mein kabel vom stk500 zum glcd mit ca.
10cm länge schon zu lang ist?

gruß
gast

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut Datenblatt hast Du mit den 450ns schon recht. Aber der
Displaycontroller braucht auch noch ein bisschen Zeit. Dafür gibt es ja
ein Busyflag, welches man abfragen kann. Bis Du dies aber erledigt hast,
ist aber wieder Zeit vergangen... Dann kann man halt gleich warten!

Die Kabellänge dürfte eigentlich nicht zu Problemen führen.

Autor: Jörn Kossack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Wolfgang,

schön daß sich auch mal einer zu BASCOM äußert. Ich habe diese Woche
mein erstes KS0108-Display an einem Mega16 angeschlossen und versuche
zuerst mit der enthaltenen KS108.lib zurechtzukommen. Alle
Grafikroutinen wie Linie, Kreis, Punkt setzen funktionieren tadellos.
Dagegen bekomme ich kein einziges Zeichen auf dem Display dargestellt,
weder mit den enthaltenen 8x8 Font noch den 16x16 Font. Es läuft ein,
zwei sekunden ein wildes Pixelmuster über das Display. Pullups habe ich
sicherheitshalber an allen Leitungen. Ich werde morgen noch mal mein
Glück versuchen. Wenn ich es nicht auf die Reihe bekomme, werde ich es
mit deinen Routinen mal probieren. Vielleicht hat ja ein anderer das
gleiche Problem schon gehabt?
Viele Grüße
Jörn

Autor: Wolfgang Schmid (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Servus Jörn,

hier nochmal alles was ich als Files habe unter BASCOM als ein ZIP. Die
Stacks müssen größer werden damit es die Sub's noch kann, sonst stürzt
der AVR ab. Die Frequenz bei mir war bei ca. 7,3 MHz udn ein ATMEGA8,
aber das siehst du ja in der Config.

Grüße Wolfgang

Autor: Der Techniker (_techniker_)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte auch diese Lib verwenden, habe jedoch ein Problem mit der
Textausgabe.

Konkret: Wenn ich mit dem mitgelieferten Zeichensatz "Corsiva_12" mit
ks0108GotoXY und einer Y-Koordinate mehr als 37 den vordefinierten Text
"http://www.apetech.de\nmailto:me@apetech.de" ausgebe, so verändern
sich pixel in der obersten Zeile.

Theroretisch müsste der Text doch noch unten auf das Display passen?!?

Wie kann ich einen Text ganz unten am Display platzieren?

Habe ich hier einen Denkfehler oder ist das ein Bug?

Im Anhang ein Bild von einer Ausgabe mit ks0108GotoXY(5,37).

Gruß,
Techniker

Autor: Der Techniker (_techniker_)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier ein Bild von einer Ausgabe mit ks0108GotoXY(5,38).

Gruß,
Techniker

Autor: Der Techniker (_techniker_)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nochwas interessantes:

Wenn ich den Text als Invertiert mit Y-Koordinate 37 ausgebe, so wird
mehr Invertiert, als nötig. (siehe Foto)

Gruß,
Techniker

Autor: Der Techniker (_techniker_)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das gleicher hier bei Y-Koordinate 38. (Diesmal alles durcheinander..)

Gruß,
Techniker

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Techniker,

deine Schriftgröße ist zwar 11 Pixel hoch, aber es werden bei den Libs
von Ape immer komplette Pages (8 Pixelreihen) beeinflusst. Dies kannst
Du gut bei den invertierten Zeichen erkennen, da dort volle 2 Pages
beschrieben werden.

Das Display ist ja insgesamt in 8 Pages aufgeteilt mit der Startzeile
0. Die Libs von Ape springen bei Zeilenwechsel immer um die Höhe des
Zeichensatzes, in diesem Fall also 11 Pixel. Damit liegt beim Start mit
Y=37 die zweite Zeile bei Y=48. Weiterhin werden für jede geschriebene
Zeile aber 16 Pixel beeinflusst. Das funktioniert ja auch beim ersten
Fall. Beim Zweiten Fall überschreitest Du aber die letzte Zeile und
landest damit wieder in der ersten Page also der Zeile 0! Dies musst Du
entsprechend abfangen!

Gruß
Stefan

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan!

Hmm...
Ist zwar doof, klingt aber logisch! :)

Bevor ich mich jetzt duch den Quellcode quäle (g) frage ich mal
vorab:

Hat jemand dieses Problem schon behoben? ;)

Noch einen schönen Sonntag.

Gruß,
Techniker

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Techniker,

ich winke mal mit dem Zaunpfahl... g

Da ich die Routinen aber nur als Grundlagen benutzt habe, muss ich
meinen Quellcode selber mal durchstöbern, ob ich was passendes posten
kann. Eventuell liest auch ape den Thread noch mit. Ich habe damals mit
seiner Zustimmung die Routinen verwenden dürfen und 'ne Menge kleiner
Bugs gefunden, die aber aufgrund der Arbeit nicht dokumentiert
wurden...

@ape: Besteht noch Interesse an einer Bugliste, oder ist dieses Projekt
für Dich erstmal erledigt?

Gruß
Stefan

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan:

Wäre nett von dir, wenn du mir deinen Code zu Verfügung stellen
könntest! :)

Falls ja, hier meine eMail: techniker at quantentunnel dot de

Im vorraus schonmal danke! :)

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Hat sich erledigt! ;)

Ich benutze nun die Lib von Holger Klabunde!
Die kann wesentlich mehr Funktionen und funktioniert problemlos!
(..nachdem ich sie für die neue WinAVR-Version angepasst hatte..)

Link: http://www.holger-klabunde.de/avr/KS108.zip

Gruß,
Techniker

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Techniker,
Ich hab mir die Lib von Holger noch nicht angesehn, aber was für
Anpassungen waren denn nötig? Willst du nicht deine angepasste Version
mal hier zur Verfügung stellen?
Ich hab bisher die Lib von Ape benutzt und kaum probs damit...ausser
das bei meinem Display scheinbar /CS1 und /CS2 vertauscht sind... aber
is ja kein ding.

Gruß
Fabian

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fabian!

Die nötigen Anpassungen sind nicht wild! ;)
z.B. Die PROGMEM-Schreibweise u.ä. muß einfach geändert werden!

Folge einfach den Comilerfehlern! ;)

Gruß,
Techniker

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat eigentlich schonmal wer mit dem recht hohen Pinverbrauch von GLCDs
Probleme bekommen? Ich hab aktuell ne Schaltung, die ich der
Einfachheit halber mit nem Mega32 aufbauen wollte...ohne das GLCD hab
ich nen Pinbedarf von 23 IOs ... jetzt kommen aber nochmal 13 vom
Display und schon bin ich selbst bei Nutzung des internen Oszillators
bei 36.
An anderer Stelle sparen ginge evtl auch, aber ich will evtl noch
"expandieren".
Gibt es eine Ansteuerung per Schieberegister oder sowas (kenn mich beim
"erweitern" von Ports noch nicht so aus), oder ist das zu aufwändig.
Auf übermässig hohe Refreshraten auf dem Disp kommt es nicht an.

Gruß
Fabian

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fabian:

Genau das habe ich mich auch gefragt. Werde (will) diesbezüglich am WE
mal rumprobieren...

Das Problem: Der Datenbus muß bidirektional sein! :-/

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber es gibt doch so Portexpander die sowohl Seriell beschreibbar ->
Parallele Ausgabe mit Latch, als auch Paralleler Eingang mit Seriellem
Ausgang sind, oder hab ich das jetzt falsch im Kopf.
Das grösste Problem ist denk ich mal das Timing...obwohl wann gelesen
und wann geschriben wird ist ja eigentlich auch ganz klar, und mit der
entsprechenden Leitung die zum Disp geht könnte man doch auch einen
entsprehchenden Expander "polen".

Gruß
Fabian

Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte auch schonmal darüber nachgedacht, die ganze direkte
Ansteuerung des Dispays über einen kleinen extra uC (tiny2313) oder so
zu machen der dann vom Hauptproz nur die Inhalte z.B. per I2C, TWI,
Uart, SPI oder sonst wie bekommt. Hätte den vorteil, dass auch die
Kabellängen zum Disp nicht so begrenzt wären...
Gibts sowas vieleicht schon...ich will ja nicht das Rad neu erfinden.

So, genung theoretisiert...nach der nächsten Klausur wird sich
beschäftigt.

Gruß
Fabian

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ...
also bin frisch von assembler auf c umgestiegen ... jetzt muss ich mich
erstmal halber zurechtfinden ... dabei hab ich n problem ... ich möchte
mit der glcd-routine n string + variable ausgeben ... und ich bekomms
einfach nicht gebacken ... hät da einer n ganz kleines beispiel für
mich?

greez
alex

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat mal jemand darüber nachgedacht vektororientierte schriftdateien
einzusetzten??? so das die Font Pixel quasi on-the fly errechnet
werden, so das quasi schriftart/größe und sonst eigenschaften variiert
werden können, ohne lästiges hexdateien erzeugen????

Martin

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!?

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin:
Bis jetzt noch nicht.
Kannst aber gerne damit anfangen! ;)

Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
naja,

zumindest läuft schonmal mein PLED Display mit den Basisfunktionen.

man kann zumindest schonmal einen zuvor erstellten font übergeben. aber
diese vektorsache ist reizvoll...

martin

Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich würde das ganze gern aufbohren, strichdicke variieren, dreiecke
zeichnen... also ein wenig mehr in richtung objekte gehen...

vor allem, reiterkaten, buttons und routinen für ellipsen, transparente
schrift, transparenter hintergrund usw.. das konzept ist soweit schon
fertig,

probleme gibts derzeit beim kreise zeichen mit breiterer strichdicke
... kreis im kreis führt zu löchern, ab und an...

und dreiecke..

ein strich mit winkelangabe und zeichenabschnitt wäre auch nicht
schlecht, also mittelpunkt, gesamtlänge, und ab wann er gezeichnet
werden soll, um zb ein ziffernblatt éiner analogen uhr zu erstellen...

martin

Autor: Martin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...ach ja, das display ist übrigens mit einem pt6807 bestückt und u.a.
auch bei lc-design erhältlich..

der betrachtungswinkel, sowie der kontrast ist meines erachtens nach
recht herausragend...

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagt mal Leute,
wo hänge ich denn DB0 - DB7 ran, an PORTB oder PORTC?

Grüße
Marco

Autor: Ronald H. (do7rh)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Nabend zusammen,

nach einigen Tagen nun, die ich am testen bin komme ich einfach nicht 
weiter.
Ich habe ein KS0107 kompatiebels GLCD. Das "Datenblatt", wenn man das so 
nennen kann, habe ich angehängt.
Zu meinem Problem.

Ich habe einen mega16.
An Port A sind D0 - D7
An Port D2 bis D6 sind die Command Anschlüsse.
Was ist mit dem Reset? Ich habe ich mal mit an den Reset vom µC gehängt.
Nachdem ich nun zum testen das ks0108test auf dem µC gespielt habe, 
passiert außer einem kleinen Flackern auf dem Display bei einem Rest mal 
rein gar nichts.
Habe auch schon versucht den RESET auf +5V zu legen -> ohne Erfolg.
Nun einmal zu der Belegung:
PA0  D0
PA1  D1
PA2  D2
PA3  D3
PA4  D4
PA5  D5
PA6  D6
PA7  D7
PD2  D/I (RS)
PD3  R/W
PD4  E
PD5  CS1
PD6  CS2
PD7 war als Reset vorgesehen, hängt aber nun in der Luft

exakt so habe ich es auch in der ks0108.h definiert:


#define LCD_CMD_PORT    PORTD
#define LCD_CMD_DIR    DDRD
#define LCD_DATA_IN    PINA
#define LCD_DATA_OUT    PORTA
#define LCD_DATA_DIR    DDRA
#define D_I      0x02
#define R_W      0x03
#define EN      0x04
#define CSEL1      0x05
#define CSEL2      0x06


Oder gibt es doch gewisse unterschiede zwischen dem KS0107 und dem 
KS0108?

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ronald,

KS0107 (Zeilen) und KS0108 (Spalten) sind normalerweise immer zusammen 
verbaut.

Wie sieht es denn mit der Kommunikation aus? Wie schnell ist dein 
Mikrocontroller? Das Display kann je nach uC recht "träge" sein! Bei mir 
musste ich etliche NOP's einfügen um die Abfrage des Busybit zu sparen.

Gruß
Stefan

Autor: Ronald H. (do7rh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

also ich habe das GLCD an einem Mega32 mir 8MHz.
Habs dann mal mit der Lib von http://www.holger-klabunde.de ausprobiert 
und es läuft. Muss mal schauen, wo der Fehler liegt. Denke mal das ich 
was mit dem Reset nicht Richtig gemacht habe. Mit der Geschwindigkeit 
hatte ich auch so einige Probleme, die aber jetzt beseitigt sind.
Werde am Wochenende mal mit der Lib von ape testen.

Vielen Dank


Ronald

Autor: rob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

wenn ich die Lib unter Avr Studio laufen lasse erhalte ich immer eine 
oder mehrere Warnungen:
../ks0108Test.c:33: warning: pointer targets in passing argument 1 of 
'ks0108SelectFont' differ in signedness

Eigentlich macht die Warung nix aus aber trotzdem würd ich gern wissen 
was das bedeutet.


Ansonsten tolle LIB :D

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
static uint8_t Arial_Bold_14[]...
void ks0108SelectFont(const char* font, ...

ks0108SelectFont(Arial_Bold_14,...

Arial_Bold_14 ist ein uint8_t*, die Funktion hätte aber gerne einen 
char*.

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Wenn du das änderst, dann teile gleich auch noch die 
<fontname>.h-Dateien in eine .c-Datei und eine .h-Datei auf. Bei 
größeren Projekten mit mehreren Dateien, die <font.h> includieren, 
landet der Font sonst mehfach im Flash. Und wer will das schon.

Oliver

Autor: Manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen!

möchte das thema noch mal "aufwärmen" :D
kann mir bitte jemand von euch erklären wie ich eine grafik auf das glcd 
bekomme?

würde mich über eine antwort freuen!

viele grüße
manu

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anschliessen.
GLCD-Testprogramm compilieren und flashen.
(evtl. Reset.)

Fertig.

Oliver

Autor: Speedy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hi,

wahrscheinlich immer wieder ein Problem, aber mein Anfangsbild sieht 
total kacke aus...

siehe anhang

außerdem versuche ich ein kreis zu zeichnen den man auch ansatzweise 
sieht, aber irgendwie passts nicht so.. kennt jemand das Problem?

programmiert habe ich unter BASCOM und die ks108.lib ist eingebunden.

(aufgefallen ist mir auch das das display direkt nach dem einschalten 
solch ein wirrwarr hergibt, muß ich das vielleicht noch irgendwie 
initialisieren? seit die lib drin ist funktioniert initlcd nicht mehr.)

danke
Speedy

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würds mal mit Sram leeren probieren (mit 0en vollschreiben)

Autor: Speedy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
nö, sram ist es nicht,

Kontrast richtig einstellen und mit cls arbeiten, dann funktionierts 
auch schon!

aber vor allem ist CS1 und CS2 an den Displays vertauscht!

das ärgert mich am meisten!
kann man aber einfach in der Software den PIN tauschen, dann hat man 
auch kein Wirrwarr mehr auf dem Display! siehe Bild!

nur wie funktioniert das mit Grafiken auf dem Display??

bekomme da immernoch nur schrott angezeigt???

Autor: Speedy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar, habe nicht gesehen das man beim speichern der Grafik "SED 
Series" anklicken kann...

nun funktioniert es...

Speedy

Autor: Rocky98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist eigentlich http://www.apetech.de down?

wollte die letzte Version der Lib ausprobieren.

kann evtl. jemand den letzten Stand zur Verfügung stellen

rocky98

Autor: Oliver (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
bitte sehr

Autor: Rocky98 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Oliver:

Danke

Autor: Tobias Tetzlaff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich komme irgendwie nicht zu dem Font Generator von 
http://www.apetech.de.

Kann mir evtl. jemand den richtigen Link, oder eine Zip zur verfügung 
stellen?

Danke im voraus....

Gruß Toby

Autor: Nik Bamert (nikbamert)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe Ape hat nichts dagegen, aber da seine Homepage allem Anschein 
nach nicht online ist, hab ichs mal als Anhang reingehängt. So weit ich 
weiss benötigt man das Java Runtime Environment (JRE) und muss dann die 
start.bat ausführen, damit das Programm startet.

Autor: Lasse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

dank des Postings der Sourcen konnte ich das Ganze bei mir auch mal 
ausprobieren. Mit der Schrift klappts noch nicht so ganz, da meckert der 
AVR-Compiler noch, daß er char* nicht nach uint8_t* konvertieren könnte, 
aber egal, das kriege ich noch hin.

Was mir mehr Kopfzerbrechen macht ist der Pinverbrauch. Ich habe das 
Display an einem Arduino-Board hängen (www.arduino.cc) und damit sind 
auch schon alle Pins weg die ich da zur Verfügung habe.
Daher meine Frage, wie ließen sich am geschicktesten einige Pins 
einsparen? CS1/CS2 habe ich schonmal über einen Inverter zusammengelegt. 
Macht einen Pin weniger. Aber um das DCF-Modul, LEDs und Schalter 
dranzuhängen reichts leider noch nicht.
Am sinnvollsten wäre es wohl, die Datenbits über ein Schieberegister 
seriell rauszuschieben. Hat das schon jemand gemacht? Was nehme ich da 
am besten als Baustein?

Gruß
Lasse

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
74HC595 oder ähnliches
hatte ich auch schon mal dran gedacht, nur zur Realisierung kam's noch 
nicht.

Gruß
Fabian

Autor: Lasse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mir das nochmal angeschaut. Aber es bräuchte ein Schieberegister 
auch ein Schieberegister für den Rückweg, da die Lib an einigen Stellen 
wieder Daten aus dem Display ausliest. Also nicht ganz so einfach/billig 
zu machen.

Autor: Lasse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Problem, daß ich noch habe ist, daß bei mir die meiste Zeit nur die 
Rechte Displayhälfte funktioniert. Gelegentlich (Strom weg, STrom wieder 
dran) wird das ganze Display angesteuert und die Textausgaben sind 
sauber zu lesen. Das funktioniert dann auch bis ich den Strom wieder 
wegnehme, kann also nicht am Display liegen.
Woran könnte sowas liegen?
Ich verwende einen Atmega168 (Arduino)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht kann man ja eine eigene Erweiterung für ein Display basteln. 
Beispielsweise eine kleine "Grafikkarte" oder eine Schieberegister mit 
der Möglichkeit Daten einzulesen und auszulesen. So teuer ist ein 
tiny2313 nicht, und mit internen Takt ist die Beschaltung dann genauso 
einfach wie ein HC595. Man sendet ihm beispielsweise über SPI was an den 
Ports anliegen soll, oder liest den Port über SPI aus. U.u. bekommt man 
sogar die low-level-routinen zur Ansteuerung des Displays hin...und wenn 
dann noch Platz im kleinen Flash ist, dann kann man auch ncoh richtige 
Zeichen/Schreibfunktionen implementieren.

Autor: Mario Grafe (mario)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

an alle die schon längere Erfahrung mit dem KS0108-LCD haben:

Ich habe kürzlich ein solches LCD ersteigert, angeschlossen und 
funktioniert auch prima. Ich benutzte die Library von 
http://www.indata.si/grega/.

Meine Frage ist folgende:
Gibt es eine Möglichkeit, bestimmte LCD-Bereiche schnell(!) zu löschen, 
um z.B. eine sich ständig ändernde Zahlenausgabe (z.B. ADC-Werte) an 
derselben Stelle zu machen? Mit schnell meine ich das man das löschen 
und neu beschreiben nicht mehr so sehr sieht. Das Display ist relativ 
langsam wenn man ständig bestimmte Bereiche updaten muß.

Mario

Autor: Stefan Rauße (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mario,

wenn Du Dir mal das Datenblatt vom Displaykontroller ansiehst wirst Du 
feststellen, dass ein Taktzyklus min. 1µs dauern muss. Bei der Auflösung 
wäre das Display also netto in ~1ms komplett beschrieben. Durch interne 
Verarbeitung im Displaykontroller dauert das ganze aber länger 
(Stichwort "Busy-Flag") und führt bei mir zu einer Zeit von ~8ms für ein 
komplettes Display.
Damit ist hardwaremässig das Display schnell genug um sogar flüssige 
Bewegungen auf dem kompletten Display anzeigen zu können!
In deinem Fall helfen da nur Softwareoptimierungen wie z.B.
- glcd_delay(1) scheint 8µs zu dauern, da reichen eventuell ein paar 
NOP's
- die Busy-Abfrage (glcd_WaitIfBusy()) vernachlässigen (wenn dein 
Prozessor sowieso nicht zu schnell ist)
- Die Portrichtung vorab einstellen und nicht bei jedem Aufruf in 
glcd_WriteData()
- glcd_ReadData() vermeiden (kostet nur Zeit und ist nur bei 
überlappenden Grafiken / Fonts notwendig...)

Gruß
Stefan

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo gibt es denn aktuellen Code für die Ansteuerung? Die Seite apetech.de 
gibt es nicht mehr, und auch Kombinationen wie .de.vu etc. brachten 
nichts zu Tage.

Autor: MaN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem, das fast nur die rechte Display hälfte aktiv ist, hatte ich 
auch. Musste den Takt auf 4mhz verringern, dann gings wieder. Bei 8mhz 
war es zwar seltener das nur die rechte Seite aktiv war, es kam aber 
auch noch manchmal vor. Aber jetzt ist der Bildaufbau natürlich nicht 
mehr so schnell. Hat da also jemand noch eine andere Lösung? Vielleicht 
weiß ja jemand an welcher stelle man die Wartezeit erhöhen muss erhöhen 
muss?

Autor: MaN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab die Lösung für mein Problem das nur die rechte Displayhälfte 
gezeichnet wird jetzt selbst gefunden.

Ich musste in der Funktion ks0108Enable() ganz an den anfang noch eine 
kurze Pause rein machen. dann werden immer beide Hälften gezeichnet.

Autor: Flo S. (tuxianer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
gibts irgendwo nen Schaltplan zur Verkablung? Also welche Kanäle des 
Displays kommen an welchen pin?

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

schau mal in den Thread: Beitrag "ks0108-atmega32"

Autor: Michael Romaner (mikel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ist es auch möglich unsigned int auf dem LCD darzustellen? ich bekomme 
das irgendwie noch nicht hin.

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Romaner wrote:
> Hallo
>
> ist es auch möglich unsigned int auf dem LCD darzustellen? ich bekomme
> das irgendwie noch nicht hin.

Wie meinst du das genau? Wenn du einen u-int Wert darstellen möchtest 
kannst du dafür die Funktion itoa() verwenden. Die wandelt deinen 
Integer Wert in einen ASCII Wert um, den du dann auf dem Display 
darstellen kannst.

Gruß - Markus

Autor: Zeroeightfifteen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich will nochmal den Beitrag von  Mario Grafe aufgreifen, einen 
Displaybereich schnell zu löschen.
Wenn ich bei jeder Wertänderung den ganzen LCD löschen muss und dann das 
komplette Bild aufbaue, flimmert die Anzeige.

wenn ich Leereichen an die gewünschte Position sende bleiben meine 
Zahlen stehen.

Außerdem verwende ich die Lib von ape (Gast) vom 17.02.2004 15:06 da ich 
die neuere Version nicht zum laufen bekomme.

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich lösche solche Bereiche mit dem FillRect und gebe als Farbe halt 
"WHITE" an.

Beispiel:
ks0108FillRect(3, 10, 10, 8, WHITE)

Das löscht den Bereich ab Punkt 3,10 mit 10 Pixel Breite und 8 Pixel 
Höhe.

Ein Flackern seh ich nicht, allerdings passiert die Aktualisierung bei 
mir nicht so oft.

Gruß - Markus

P.S.
Ich nutze die Lib 1.1 von ape!

Autor: Zeroeightfifteen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

neue Lib funktioniert. das mit ks0108FillRect auch Danke.

Gibt es auch schon die neue Lib in der der Bug mit der 8 Pixel hohen 
Schrift behoben ist? Wenn ich eine 8 Pixel hohe Schrift erstelle im 
FontCreator ist diese nur 6 Pixel hoch. Wenn ich sie dann 10 Pixel hoch 
definiere fängt das LCD eine neue Zeile an und im oberen Rand entstehen 
fehler, wie vorher schon einmal besprochen wurde.

Danke

Autor: Fuchs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin, ist die Lib immer noch die "Referenz" für besagte Displays vom Typ 
KS108?

Autor: Dieter Bohlen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, brauche einen möglichst kleinen Font für die ape-lib, hab mir 
jetzt die dateien hier gesaugt 
(Beitrag "LCD Schriftarten ( Fonts in veschiedenen Größen )") aber das  bringt nur 
Zeichsensalat. Was muss ich tun? Die bei ape mitgelieferte Font12x16 
funktioniert ja auch nicht, die anderen (Corsiva usw. aus der demo.c 
dagegen schon). Oder hat wer ne fertige kleine Schriftgröße für die 
ape-lib?

Autor: Markus _neu (markush)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kommt halt drauf an was du unter klein verstehst?!?

Anbei meine "kleine"! Geht natürlich auch noch kleiner, aber dafür hat 
der gute ape ja auch den FOnt-Generator gestrickt...

Gruß - Markus

Autor: Dieter Bohlen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, hab ihn gefunden den Generator, super sache =), trotzdem danke.

Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

lieg ich richtig in der Annahme das die www.apetech.de nicht mehr 
aktuell ist?

wäre jemand so nett und könnte die "neuere" Version der glcd-routine 
online stellen oder nen link posten, wo diverse bugs schon behoben sind? 
wäre super.


lg martin

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Wi wrote:
> Hallo zusammen
>
> lieg ich richtig in der Annahme das die www.apetech.de nicht mehr
> aktuell ist?

Richtig!


> wäre jemand so nett und könnte die "neuere" Version der glcd-routine
> online stellen oder nen link posten, wo diverse bugs schon behoben sind?
> wäre super.

Die lib selber ist ja hier im Thread verlinkt. Welche diversen Bugs 
meinst du eigentlich?

Gruß - Markus

Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kk bin schon still, hab alles gefunden was ich gesucht hab ^^

trotzdem dank

ahm es gab am anfang probleme zb bei der schriftgröße was ich so gelesen 
hab..aber da hat jemand bereits die neuere version zur verfügung 
gestellt..habs am anfang leider übersehn...der beitrag ist doch recht 
lang ^^, aber sehr interessant...

lg martin

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--


Gruß - Markus

Autor: Manji (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
benutzt jemand die GLCD-Routinen mit einem Pollin Display? Bei mir 
scheint da irgendwie nicht wirklich was zu funktionieren. Es werden nur 
vertikale Balken angezeigt. Die verkabelung habe ich laut ks0108.h 
gemacht. Gibt es beim Compilieren noch irgendwas zu beachten oder müssen 
bei der Pollin Display variante bestimmte pins invertiert werden? Ist ja 
immerhin nur ks0108 kompatibel. Das Datenblatt schweigt sich 
diesbezüglich ja leider aus. Auch der Thread ks0108 an atmega32 war 
nciht wirklich hilfreich. Bin langsam mit emienm Latein am ende. Wäre 
nett wenn hier jemand weiterhelfen könnte.
gretz

Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey

also bei meinem Display sind zb Cs1 und Cs2 low aktiv, das mußte ich 
ändern ( es funzt trotzdem noch net ^^)

Den Reset vom Glcd haste auch auf Vcc gehängt mit Widerstand? oder mitn 
µC verbunden?

Welcher Controller ist beim display dabei?

Ich hätt auch noch ne Frage, bei meinem Display ist der Reset(low aktiv) 
mit dem µC verbunden.

Was muß man dann genau machen? Reichts wenn ich den Reset in der 
Initialisierung kurz auf 0 leg, warte, dann ständig auf 1 leg?


lg

Autor: Sven W. (manji)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> also bei meinem Display sind zb Cs1 und Cs2 low aktiv, das mußte ich
> ändern ( es funzt trotzdem noch net ^^)

Das werd ich mal versuchen. Ob die beiden low aktiv sind oder nicht geht 
halt leider nirgends hervor.

> Den Reset vom Glcd haste auch auf Vcc gehängt mit Widerstand? oder mitn
> µC verbunden?

Der Reset ist bei mir mit dem µC verbunden da er low aktiv ist.

> Welcher Controller ist beim display dabei?

Das müsste ein TG12864B sein wenn ich der Pollin seite glauben darf. Das 
einzige was die dazu schreiben ist das er ks0108 kompatibel ist.

Auf jedenfall schonmal danke für die Antwort.. werde der sache mit CS1 
und CS2 mal nachgehen.

Autor: Martin Wi (martini)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Behandelst du dann den Reset im Programm? Wenn nicht ist der ständig an 
und so kann nie was funktionieren ^^.

Autor: Sven W. (manji)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm nein eigentlich nicht. Programmtechnisch kämpfe ich immernoch mit 
dem Beispielprogramm ;) Der Reset des AVR und der des Display hängen ja 
permanent an 5V und werden eigentlich nie auf Masse gezogen. Damit 
sollte der Reset eigentlich immer "deaktiviert" sein. Auserdem würde ich 
ja sonst keine vertikalen Balken sehen^^

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bis jezt benutze ich die die lib von ape um mit einem mega8515 (8MHz 
quarz) mein glcd anzusteuern. Funktioniert auch recht gut nur dauert der 
Bildaufbau mit ca 1 sekunde doch recht lange. Hat jemand das 
Geschwindigkeitsproblem mit dieser lib schon gelöst?
Gruß Holger

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
???

Die lib verschenkt zwar ein paar Takte beim Lesen von Daten aus dem LCD, 
aber 1s darf der Bildaufbau nicht dauern, bei 8Mhz schon gar nicht.

Hast du

- den debug-Mode per define enabled?
- die Verzögerungszeiten an dein LCD und den Prozessortakt angepasst?
- sicher gestellt, daß dein Prozesoor auch tatsächlich mit 8Mhz läuft?

Oliver

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Debug ist auskommentiert (also nicht aktiv). Der Takt müsste auch 
stimmen da mein kleines Uhrprogramm richtig tickt. In den Funktionen 
ks0108Enable und ks0108DoReadData habe ich jeweils nur noch ein nop und 
die for-schleifen auf 3 durchgänge gekürzt. Weniger geht nicht ohne 
Anzeigefehler. Allerdings sieht man immer noch dass das Bild zeilenweise 
aufgebaut wird. Ich weis ja nicht ob ich da zu hohe Erwartungen hab aber 
eigentlich sollte man da doch theoretisch nichts vom Bildaufbau erkennen 
können oder? Ach so das Display ist übrigends eins vom Pollin LCD-Modul 
TG12864B-13

Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich gerade die gleiche Lib am Wickel habe, allerdings mit einem 
DIP128-6...

Mit 16 Mhz ist der Bildaufbau zwar sichtbar, ich nur gerade so als 
Wischen von oben links nach rechts unten.  Ich würde sagen, der 
komplette Bildaufbau ist in ca. 1/4 Sekunde erledigt.

Die Lib ist default, d. h. signifikante Änderungen habe ich nicht 
durchgeführt.

cu, Michael

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,
schon mal danke für die Infos. Es scheint zumindest so das ich nichts 
falsch gemacht habe aber kann man da nicht noch mehr rausholen?
Gruß Holger

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habs gerade nochmal durch den Simulator gejagt. Das Original, mit 
deinen Änderungen, benötigt bei 8MHz 34,6ms für ein ks0108ClearScreen(), 
also einmal alles schreiben, ohne zu lesen.

Die Ausgabe des Beispieltextes ""KS0108-Treiber" dauert 76.3ms

Was zeigst du denn für Bitmaps an, die 1 sec dauern?

Oliver

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die mühe die du dir gemacht hast!
Mit dem AVR Studio Simulator hab ich mich noch beschäftigt... wär 
vielleicht ganz hilfreich. Bis jetz habe ich nur zum testen mal die 
ganze Seite mit Text vollgeschrieben (ok könnten auch 0.5sec sein). Wenn 
ich dann aber zum beispiel meine Uhr anzeige und immer ein 
ks0108ClearScreen() mache fängt es halt an zu flimmern und wird recht 
blass.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die lib braucht immmer dann viel Zeit, wenn Daten aus den Display 
gelesen werden müssen. Das passiert immer dann, wenn deine Zeichen nicht 
auf einer Zeilengrenze beginnen und enden.

Wenn du Zeichengröße und Position so anpasst, daß du genau in dem 
Byte-Raster der Zeilen bleibst, wird nichts gelesen, und dann geht es 
deutlich schneller.

Was dann noch hilft, ist nur den Bereich zu löschen, in den du schreibst 
(auch da auf das Zeilenraster achten).

Damit müsste zumindest eine normale Uhr mit Sekundenanzeige hinzukriegen 
sein. Bei Millisekunden wirds schwierig :-)

Beim Lesen der Daten lässt sich zwar noch etwas Zeit einsparen (bei 
aufeinanderfolgenden Adressen kann man das Dummy-Read einsparen), aber 
für Filme wirds nie reichen.

Oliver

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok der Tipp mit dem Zeilenraster ist gut dann werd ich mir demnächst mal 
einen passenden font machen.
Gruß Holger

Autor: maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi leute,

ich ahbe hier noch einen alten font aus grauer vorzeit und suche den 
creator dazu...

der hier oft gepostete creator baut ja zeichensätze die bitorientiert in 
bytes abgelegt wird, umd speicher zu sparen, aber es muss auch mal einen 
gegeben haben, der es einfach byte orientiert gemacht hat, hat jemand 
evtl. noch infos dazu, war warscheinlich damals auf der site von ape..

hier der alte font, wie man sieht ist die struktur im kopf auch noch 
etwas anders als bei der "aktuellen" version:
/*
 *
 * Arial Bold 14
 *
 * created with FontCreator
 * written by F. Maxxxxxx Thixxx
 *
 * http://www.apetech.de/fontCreator
 * me@apetech.de
 *
 * File Name           : arial_bold_14
 * Date                : 29.01.2005
 * Font size in bytes  : 8712
 * Font width          : 10
 * Font height         : 14
 * Font first char     : 32
 * Font last char      : 128
 * Font used chars     : 96
 *
 * The font data are defined as
 *
 * struct FONT {
 *     uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
 *     uint8_t    font_Width_in_Pixel_for_fixed_drawing;
 *     uint8_t    font_Height_in_Pixel_for_all_characters;
 *     unit8_t    font_First_Char;
 *     uint8_t    font_Char_Count;
 *
 *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
 *                  // for each character the separate width in pixels,
 *                  // characters < 128 have an implicit virtual right 
empty row
 *
 *     uint8_t    font_data[];
 *                  // bit field of all characters
 */

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

#ifndef ARIAL_BOLD_14_H
#define ARIAL_BOLD_14_H

#define ARIAL_BOLD_14_WIDTH 10
#define ARIAL_BOLD_14_HEIGHT 14

static uint8_t Arial_Bold_14[] PROGMEM = {
    0x22, 0x08, // size
    0x0A, // width
    0x0E, // height
    0x20, // first char
    0x60, // char count

    // char widths
    0x04, 0x02, 0x05, 0x06, 0x07, 0x08, 0x09, 0x02, 0x03, 0x03,
    0x05, 0x08, 0x02, 0x04, 0x02, 0x04, 0x07, 0x04, 0x07, 0x07,
    0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x02, 0x02, 0x07, 0x07,
    0x07, 0x08, 0x0E, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x09,
    0x08, 0x02, 0x07, 0x08, 0x07, 0x0B, 0x08, 0x09, 0x07, 0x09,
    0x09, 0x07, 0x08, 0x08, 0x09, 0x0D, 0x07, 0x08, 0x08, 0x04,
    0x04, 0x04, 0x06, 0x08, 0x03, 0x07, 0x07, 0x06, 0x07, 0x07,
    0x05, 0x07, 0x07, 0x02, 0x03, 0x06, 0x02, 0x0A, 0x07, 0x07,
    0x07, 0x07, 0x05, 0x06, 0x05, 0x07, 0x07, 0x0B, 0x06, 0x07,
    0x05, 0x05, 0x01, 0x05, 0x07, 0x08,

    // font data
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 32
    0xFE, 0xFE, 0x18, 0x18, // 33
    0x1E, 0x1E, 0x00, 0x1E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, // 34
    0x90, 0xF8, 0x9E, 0x90, 0xF8, 0x9E, 0x1C, 0x00, 0x00, 0x1C, 0x00, 
0x00, // 35
    0x18, 0x3C, 0x26, 0xFF, 0x66, 0xCC, 0x88, 0x04, 0x0C, 0x18, 0x3C, 
0x18, 0x0C, 0x04, // 36
    0x1C, 0x22, 0x1C, 0xC0, 0x30, 0x8E, 0x40, 0x80, 0x00, 0x00, 0x18, 
0x04, 0x00, 0x0C, 0x10, 0x0C, // 37
    0x80, 0xCC, 0x7E, 0x72, 0xF2, 0xDE, 0x0C, 0x80, 0x00, 0x0C, 0x1C, 
0x10, 0x10, 0x10, 0x1C, 0x0C, 0x1C, 0x10, // 38
    0x1E, 0x1E, 0x00, 0x00, // 39

..........

so sieht der kopf des aktuellen font tools aus:

   struct FONT {
     // common shared fields
       uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
       uint8_t    font_Width_in_Pixel_for_fixed_drawing;
       uint8_t    font_Height_in_Pixel_for_all_Characters;
       uint8_t    font_Bits_per_Pixels;
                    // if MSB are set then font is a compressed font
       uint8_t    font_First_Char;
       uint8_t    font_Last_Char;
       uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
                    // for each character the separate width in pixels,
                    // characters < 128 have an implicit virtual right 
empty row
                    // characters with font_Char_Widths[] == 0 are 
undefined

    // if compressed font then additional fields
       uint8_t    font_Byte_Padding;
                    // each Char in the table are aligned in size to 
this value
       uint8_t    font_RLE_Table[3];
                    // Run Length Encoding Table for compression
       uint8_t    font_Char_Size_in_Bytes[font_Last_Char - 
font_First_Char +1];
                    // for each char the size in (bytes / 
font_Byte_Padding) are stored,
                    // this get us the table to seek to the right 
beginning of each char
                    // in the font_data[].

     // for compressed and uncompressed fonts
       uint8_t    font_data[];
                    // bit field of all characters


gruß,
m.

Autor: maddin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
..habs schon gefunden, der obere buchstabencode ist ganz normal von apes 
java applikation, die hier auch in der glcd "lib" zu finden ist...

der andere code ist nicht von apes fontgen, ist ein toll von hagen re. 
dann passts...

in meiner simulation läufts....

danke trotzdem,
m.

Autor: maddin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
geile sache...

m.

Autor: Eduard Saib (edy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, Leute
Ich bin hier ganz neu, und habe vor ein par Wochen mich an den GLCD 
128x64 mit ks0108 ran gemacht. Ich benutzt die Lip von ape es läuft 
alles gut und schön, aber ich habe Probleme eine Variable auszugeben.

1)Wenn ich mein Programm von vorne bis hinten mit einer endlosschleife 
durchlaufen lasse dann funktioniert die Ausgabe sehr gut aber es 
flackert ganz häslich. Ich benutze einen Mega8 mit 8Mhz.

2)Wenn ich die Variable x mit einer Endlosschleife versehe dann geht es 
von 100 bis 255 gut dann aber wenn es unter 100 geht zeigt der GLCD 
anstatt 21
plötzlich 210 siehe Anhang. Das verstehe ich nicht.

while(1)
{
  x=ADCH;
  ks0108GotoXY(0,0);
  itoa (x,buffer, 10);
  ks0108PutString(buffer, largeFont);
}

Da brauche ich ein bischen Hilfe.
Es währe schön wenn jemand mir helfen würde.

Danke.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>von 100 bis 255 gut dann aber wenn es unter 100 geht zeigt der GLCD
>anstatt 21
>plötzlich 210 siehe Anhang. Das verstehe ich nicht.

Du musst deine alte Ausgabe erstmal löschen.

Autor: Eduard Saib (edy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich bin auch schon drauf gekommen , aber ich weiss es nicht wie ich 
das anstellen soll

Danke für die Antwort.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ja ich bin auch schon drauf gekommen , aber ich weiss es nicht wie ich
>das anstellen soll

Die alte Ausgabe mit Leerzeichen überschreiben.

Autor: Eduard Saib (edy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Holger.

Klapt alles super.

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich schlag mich nun schon seit 1-2 Wochen mit dem Code rum. Ich bekomme 
es einfach nicht hin einen beliebigen Integerwert auf dem Display 
auszugeben.
Habe int2char-Funktionen auf zig verschiedene Arten probiert aber 
irgendwie gibt er nur wild irgendwelche Zahlen aus.
Habt ihr einen Tip, wie man sowas am besten hinbekommt ? Weil mit den 
Funktionen bekommt man ja nur char ausgegeben. Wäre über ein paar Tips 
sehr denkbar :).

gruß Henning

Autor: Markus _neu (markush)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Henning,

such mal im http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial 
nach "itoa". Das dürfte für dich das richtige sein.

Gruß - Markus

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Markus,

mit der dtostrf-Funktion läufts wunderbar
genial, danke
Henning

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab hier eine Funktion mit der Ihr Werte über 255 anzeigen könnt.
char* DisNum( char* buffer1, long zahl )
{
  // Ausgabe im Format: 1234
  buffer1[0] = '0'+(zahl/1000);
  buffer1[1] = '0'+((zahl%1000)/100);
  buffer1[2] = '0'+((zahl%100)/10);
  buffer1[3] = '0'+(zahl%10);
  buffer1[4] = '\0';
  return buffer1;
}

So wird die Funktion z.B. Aufgerufen
char buffer[6];
...
while(1)
{
  x=ADCH;
  lcd_set_cursor(6,LINE5);
  lcd_puts(my_font, DisNum(buffer, x));
}

Gruß Andreas

Autor: carlo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, kann mir jemand bitte die

pgmspace.h
io.h
inttypes.h

zu verfügung stellen, da mann siese ja braucht oder nich ?

Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
winavr instalieren da ist alles dabei!

Autor: Holger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hat schonmal jemand diese lib auf einem mega32 
1MHz(auslieferungszustand)am laufen gehabt?
Bei mir funktioniert das Testprogramm leider nicht und ich habe die 
Hardware schon mehrfach überprüft. Im Anhang mein AVR-Studio Projekt ( 
Habe da eigentlich nur den Command- und Dataport geändert).
Würde mich freuen wenn jemandem etwas auffällt!
Gruss Holger

Autor: Chris Tian (chris0086)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute ich habe die Bibliothek von Ape aus seinem ersten Post(also 
die Urlib(für mich als Anfänger reichts)) auch auf meinen Atmega32 
laufen, nur leider sieht das das Display so aus wie im angehängten Bild.
Hier mal mei n Quellcode vom main.c
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/delay.h>

#include "ks0108.h"
#include "font12x16.h"
#include "font6x8.h"

const char pgmString[] PROGMEM = "http://www.apeTech.de\n\naffe.t@gmx.de";

int main(void) {
  volatile uint16_t i;
  struct font largeFont, smallFont;

  for(i=0; i<15000; i++);


  largeFont.width = FONT12X16_WIDTH;
  largeFont.height = FONT12X16_HEIGHT;
  largeFont.charData = Font12x16;

  smallFont.width = FONT6X8_WIDTH;
  smallFont.height = FONT6X8_HEIGHT;
  smallFont.charData = Font6x8;

  ks0108Init();

  ks0108GotoXY(20,0);
  ks0108PutString("Ha", largeFont);


  while(1);


habe DB0 -7 an Port A und die Controlleitungen an Port B angeschlossen:
hier der Quellcode:
#include <inttypes.h>
#include <avr/pgmspace.h>

#ifndef  KS0108_H
#define KS0108_H

// Ports
#define LCD_CMD_PORT    PORTB    // 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

// Function Parameters
#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


Könnt ihr mir sagen warum ich diese weißen Streifen habe?

Kann es ein verkabelungsproblem sein, vielleicht Leitungen vertauscht, 
hab eigentlich alles schon 2 mal kontrolliert.
Eigentlich sollte "Ha" da stehen aber es passt nicht so recht.
Wer schön wenn ihr mir helfen könntet

Autor: Denny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

@Christian Hohmann
Tausche mal die CSEL Ports um!
#define CSEL1        0x04    // CS1 Bit Number
#define CSEL2        0x03    // CS2 Bit Number
das war bei mir das Problem!


Hat jemand von euch mal mit dem GLCDFontCreator2 gearbeitet?
Was für Schriften kann man denn da öffnen?
Bei mir passiert da nix.

Hat jemand von euch noch fertige Schriften, die er zur Verfügung stellen 
kann?

Danke
gruß Denny

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hat jemand von euch mal mit dem GLCDFontCreator2 gearbeitet?

Ich

>Was für Schriften kann man denn da öffnen?

Alle installierten Schriften (ist zumindestens unter XP so)

Oliver

Autor: Denny S. (nightstorm99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich unter XP auch schon probiert!
Passiert bei mir nix.

Noch einer eine Idee?

Gruss Denny

Autor: micha (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich versuche gerade meine ersten Schritte mit dem Atmega32 und dem 
TG12864B-13(R)

Angeschlossen hab ich:

Port A -> Daten-Port
DB0..7 -> PA0..7

Port D -> Command-Port
D/I -> PD0
R/W -> PD1
E   -> PD2
CS1 -> PD3
CS2 -> PD4
RST -> über 10K Ohm an VCC

Zum Testen hab ich die Dateien KS0108Test.zip hier aus dem thread mal 
aufgespielt.

Soweit scheint es ja zu funktionieren nur stimmt was mit den Zeichen 
nicht

Ich bin für jeden Tip dankbar.

Grüsse Micha

Autor: zoggl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe den Code zerlegt,verstanden und selber etwas geschrieben, bis 
auf eine Kleinigkeit:
wenn ich ein Byte an Y=1 Page=1 Chip=1 schreibe bekomme ich es nicht 
angezeigt (Der gesamte LCD bleibt ohne Pixel), kann es aber an dieser 
Stelle auslesen.

folgendes habe ich getestet:
als Kontrastspannung habe ich -6V
VCC liegt an (gemessen und der LCD lässt sich ja auch ansprechen)
Reset ist auf H
Led ist über R an VCC und leuchtet.
Status meldet das DB5 auf H (=Display ON) und DB4 auf L (=normal)

ich habe keine Ahnung mehr was ich noch falsch gemacht haben könnte.

sg clemens


main.c sieht so aus:
...
  // Reset
  PORTC = RES;
  busy_reset();
  // display on
  inst(0b00111110,CSL);
  inst(0b00111110,CSR);
  //start line
  inst(0b11000000,CSL);
  inst(0b11000000,CSR);
  //set page
  inst(0b10111000,CSL);
  inst(0b10111000,CSR);
  //set Y adress
  inst(0b10111000,CSR);
  inst(0b10111000,CSL);
  //daten schreiben
  dat(0b10111000,CSL);
  //auf Y=0 springen
  inst(0b01000000,CSL);
  //daten in byte schreiben
  byte=rdat(CSL);
  //senden
  print_byte(byte);
...

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@zoggl

also was ich bei den ks108 displays festgestellt hab (zumindest bei 
meinem crystalfontz) ist das man den kontrast bis wirklich fast an den 
anschlag (also negative spg) drehen muß um überhaupt was zu sehen.
vorher tut sich da nichtmal ne winzigkeit.

hast du bei deinen inst und dat instruktionen auch ein kleines delay 
eingelegt ? soweit ich weiß darf der schreibzyklus nicht schneller (also 
enable leitung setzen und rücksetzen) als 1µs, eher noch langsamer.
aber wenn du sagst das du das datenwort richtig wieder auslesen kannst 
ist entweder die initalisierung falsch oder aber eben der kontrast noch 
nicht richtig ...

Autor: zoggl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, habe ich mit dem oszi nachgemessen. auch die kontrastspannung habe 
ich von min auf max gedreht. was mich aber so wundert ist dass ich des 
byte nachdem ich es geschrieben habe wieder richtig aus dem RAM des LCD 
lesen kann.

kannst du deinen code hier rein stellen, damit ich es damit probieren 
kann? bei den oben genannten quellen fehlt mir entweder eine lib oder 
der compiler schimpft dass er einige befehle nicht kennt.

muss ja nichts aufwändiges sein, ein punkt irgendwo würde mich ja schon 
glücklich machen, damit ich weiß dass mein LCD nicht kaputt ist.

sg clemens

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also den code müsste ich nun tief rauskramen, da ich in meiner 
derzeitigen ansteuerung eines 128x64 displays a) einen anderen 
controller habe (st7565r) und b) die ansteuerung per fpga mache. ich 
kanns dir gerne mal rauskramen, aber eine mal-eben-beispiel-applikation 
hab ich leider nicht ..

Autor: Martin 567 (martink11)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde und C-Kollegen,

ich bin neu hier und habe eine (für euch) einfache Frage:

bitte an alle ich habe die Routinen von ape
es funktioniert eigentlich jede Funktion bis auf die

"int ks0108PutChar(char c);"

ich kann jedenfalls keine Zahlen ausgeben
das einzige was ich geschafft habe ist, dass ich eine float-Zahl in eine 
char umgewandelt habe dann gings komischerweise.

ich habe mal den code angehängt, aber ich würde mich auch um ein kleines 
einfaches Beispiel freuen in dem die putchar verwendet wird.

dürfte eigentlich kein problem sein sonst funktioniert ja auch alles
-text geht
-linie geht
-kreis geht
-recheck geht
-invert geht
........

bei euch geht das ja auch, bitte brauche hilfe!

danke

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>char a=20;
>ks0108PutChar(a);//------------------geht nicht

20 ist kein ASCII Zeichen.
Versuch mal

 ks0108PutChar('2');
 ks0108PutChar('0');

Oder vieleicht mal itoa() oder sowas
um aus der Zahl einen String zu machen.

Ist ja heutzutage nicht mehr erforderlich
das eigene Hirn zu nutzen. Es gibt ja Libs mit
denen man arbeiten kann. Scheisse nur wenn man nicht
versteht was die Libs machen.

Autor: Andreas P. (madmax2006)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

ich denke Du möchstest Zahlen aus einer Variable darstellen.

Das kannst Du über die Funktion "dtostrf" erreichen, was aber einen 
Menge Speicher benötigt.

Du kannst es aber auch mit folgender Methode, und wesendlich weniger 
Resorcen erreichen.

Beitrag "Re: KS0108 GLCD Routinen"

Gruß MadMax

Autor: Martin 567 (martink11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

erstmal danke für die Hilfe,

also das mit der dtostrf hab ich ja schon gemacht aber ich dachte das 
geht nur für float-Zahlen.

ich will nur einen char-wert angezeigt haben bei dem ich den Wert rauf 
und runter regeln kann

normalerweise wenn die funktion putchar heist muss man doch auch char 
ausgeben können

muss man das immer zuerst in string umwandeln

so hab ich bereits eine float umgewandelt:
--------------------------------------------
char e[8];

...
dtostrf(ertragh, 6, 2, e);   //Float Zahl umwandeln in array >> char 
e[7]<<
ks0108GotoXY(59,20);
ks0108Puts(e);
...
--------------------------------------------

so gehts schon aber ich denke mir das muss doch einfacher gehen indem 
ich einfach so hinschreibe wie ich meine.

wenn ich putchar(2);
         putchar(0);
ist das ja wieder sehr aufwendig damit ich eine einstellbare zahl 
bekomme oder

naja also ich probier mal eure vorschläge nochmal aus

danke dafür!!!!

Autor: Martin 567 (martink11)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Holger,
Hallo Andreas


also ich habs jetzt mit hilfe der itoa() gemacht
-------------------------------------------------------
char z[2];
...
itoa(stunde,z,10);
ks0108SelectFont(SC, ks0108ReadFontData, BLACK);
ks0108GotoXY(100,40);
ks0108Puts(z);
--------------------------------------------------------


so gehts
endlich so bin ich zufrieden

danke euch beiden dass ihr euch überhaut mit solchen
anfängern wie mir abgebt

ich schulde euch was!!!!
danke martin!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Ich habe folgendes Problem :

#include <avr/interrupt.h>

int impuls_zahl=0;
int impuls(){
TIMSK3=(1<<TOIE1) | (1<<ICIE1);
TCCR3B= (1<<ICES1)|(1<<CS10);
//sei();<<<<-------
return impuls_zahl;
}


ISR (TIMER3_CAPT_vect)
{
impuls_zahl++;
}

Sobald ich das sei() mit reinnehme, funktioniert das GLCD ks0108 nicht 
mehr.
Ich verstehe nicht warum. Ohne geht´s. Dann aber natürlich andere Sachen 
nicht mehr.

Bitte um Hilfe .

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Falscher Thread
2. Ist der Quelltext nicht vollständig
3. Steht die Lösung mit einer gewissen Wahrscheinlichkeit im Tutorial

Autor: NochEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit der Antwort kann man ja mal richtig was anfangen...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genauso viel wie mit der Frage.

Genau genommen sogar deutlich mehr.
Es stecken nämlich folgende Weisheiten darin:
1. man kapert nicht für ein neues Problem alte Threads
2. Ein Quelltext, von dem die Hälfte fehlt, ist nichts wert
   (von der fehlenden Foramtierung hatte ich gar nichts erzählt)
3. weil es evtl. um ein fehlendes volatile geht, steht die
   Lösung vielleicht im Tutorial, das man gerne lesen darf,
   bevor man fragt.

Autor: NochEinGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versteh zwar immer noch nicht was das mit sei() zu tun habe könnte, aber 
jetzt hab ich zumindest einen Ansatz.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tutorial:

#include <avr/interrupt.h>

Autor: lcd17 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe auch das 128x64 Display von Pollin. Für erste Tests habe ich 
die Lib von Ape verwendet. Das klappt soweit auch ganz gut. Leider 
bekomme ich mehr oder weniger zufällige Pixelfehler und/oder ganze 
Verschiebungen der Schrift, wie auf dem Bild zu sehen.

Woran kann das liegen? Ist bei jemanden schon mal das selbe Problem 
aufgetaucht?


Vielen Dank schon mal

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> 1. man kapert nicht für ein neues Problem alte Threads

Autor: lcd17 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Klaus Wachtler schrieb:
>> 1. man kapert nicht für ein neues Problem alte Threads

Ja aber dieses Thema befasst sich doch mit der Lib von Ape. Warum sollte 
ich ein neues Thema starten, wenn sich mein Problem GENAU darauf 
bezieht??????

Zurück zum Thema: Hat jemand schon ähnliche Erfahrungen mit der Lib von 
Ape gemacht?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lcd17 schrieb:
> Warum sollte
> ich ein neues Thema starten, wenn sich mein Problem GENAU darauf
> bezieht??????

Weil es nichts mit der Originalfrage zu tun hat.
Oder hast du zur Originalfrage einen sinnvollen Beitrag?

Und es gibt auch hier Spielregeln, in denen so etwas steht.

Autor: Android (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

hat jm von euch schon mal das Datenbyte auf PortB des ATMega32 gelegt? 
es geht alles, nur leider das Programmieren per ISP nicht mehr....

Habe dann Widerstände zwischen µC und den betroffenen Datenleitungen 
gesetzt:

MISO braucht keinen Widerstand.
SCK 2,2kOhm
MOSI 2,2kOhm

Nun geh das Programmieren fehlerfrei...jedoch leuchtet Zeile 6, 14, 22, 
... dauerhaft....???

Es scheint am MOSI Pin zu liegen...Gehe ich allerdings mit dem 
WIderstand herunter geht die Programmierung wieder nicht mehr :(


WAS TUN???

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es scheint am MOSI Pin zu liegen...Gehe ich allerdings mit dem
>WIderstand herunter geht die Programmierung wieder nicht mehr :(

Mach 10k Pulldowns an die CS Pins.

Autor: Android (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
>>Es scheint am MOSI Pin zu liegen...Gehe ich allerdings mit dem
>>WIderstand herunter geht die Programmierung wieder nicht mehr :(
>
> Mach 10k Pulldowns an die CS Pins.

Das hat funktioniert! Danke!!!

Fehlt nur noch die Erklärung warum dies so ist?

Autor: Adam P. (adamap)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

habe mein tg12864b-13 display funktionsfähig vor mir liegen, soweit ist 
ja auch alles schön und gut...nun zu meiner frage:

gibt es eine möglichkeit erst die daten in das display ram zu laden und 
dann erst die ausgabe zu aktivieren.

einfaches bsp.: ein "fillrect" zeichen
jedes pixel wird einzeln in das ram geschrieben, wenn das rechteck im 
ram vollständig ist, dann erst ausgeben.

wenn ich das datenblatt des ks0108 richtig verstanden habe, dann ist das 
data latch für das dauerhafte anzeigen zuständig und das display data 
ram zum zwischenspeichern (oder auch zum vorladen)?!

ich möchte damit verhindern, dass ein objekt ausgegeben wird obwohl es 
noch nicht vollständig ist.

hoffe ihr könnt mir da helfen.

gruß
adam

Autor: Wolfgang Schmid (bluenature)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Du schon erkannt hast, es bei der Abtastung aus dem RAM das Display 
ständig aufgebaut, also jede Änderung eines Bytes im RAM ist sofort 
aktiv. Da es keine 2 Pages direkt gibt, kannst du es daher auch nicht 
direkt RAM-Pages switchen.
Es gibt nur eine Möglichkeit den Aufbau zu beschleunigen. Dazu muß man 
im ansteuernden µC ein simultanes RAM-Abbild schaffen. Dieses beschreibt 
man direkt und schickt in gewissen Zeitintervallen bzw. Ereignissen auf 
schnellstem Weg alle RAM-Daten in den Display-RAM. Verhindert Flimmern 
und langsamen Bildaufbau. Kostet aber einiges an RAM (Pixelzahl / 8 
Bytes), was sich aber im Ergebniss auszahlt, wenn dies gefordert ist.

Grüße Wolfgang

Autor: Adam P. (adamap)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nun gut, das mit dem ram abbild ist natürlich eine gute idee, doch mehr 
als 1 byte kann ich doch dann trotzdem nicht aufeinmal übertragen, 
sprich das flimmern würde sich evtl. verringern.
oder habe ich dich da falsch verstanden?

Autor: Wolfgang Schmid (bluenature)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mehr als ein Byte bekommst du parallel je Enable-Takt eh nicht in den 
Display-RAM geschrieben. Wenn du das Ganze jedoch optimal programmierst 
kommst du locker unter 1ms je Transfer weg (Schau dir dazu die 
Pixel-Zeit im Datenblatt einmal näher an). Zudem sind selbst bewegte 
Animationen alle 20ms (50 Frames/Sek) weitaus ausreichend. Da wird dir 
das Display so oder so einen Streich spielen, da die Pixel im Wechsel 
nicht so schnell hinterherkommen und du daher Schlieren sehen wirst. Von 
diesem Aspekt aus ist diese Methodik weitaus angemessen anzusehen.

kurz die Fakten:
----------------
- Direktes Arbeiten im µC-RAM vereinfacht viele Aktionen, da man direkt 
ohne dauerndes Lesen im Display-RAM im µC-RAM die Aktionen und 
Bitoperationen ausführen kann.
- Der Transfer muß eh stattfinden, ob du ihn nun auf einen Rutsch oder 
gestückelt im Algorithmus überträgst ist daher eher unwesentlich.
- RAM-Pages kannst du auf diese Weise auch einfach bauen, einfach 2. 
Array anlegen und hast es schon (so viele wie der µC-RAM reicht).
- Optimierungen der Übertragungen kannst du auch durchführen. Einfach 
Nur Bereiche übertragen die auch geändert wurden (am idealsten 
rechteckiger Bereich). Da sind deiner Kreativ kaum Grenzen gesetzt.
- Aktualisierungen auf diese Weise bei diesem Display sind unter 70ms 
kaum merklich optimaler.
- Viel Erfolg...

Grüße Wolfgang

Autor: Adam P. (adamap)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke erstmal :)

hab noch eine idee, nur bin ich mir nicht sicher ob das evtl. ein 
falscher weg ist:

ich dachte mir, man könnte einen zähler benutzen, der bei überlauf ein 
interrupt auslöst (z.b. jede 40ms).
sollte zu diesem zeitpunkt ein flag gesetzt sein, das ein neuzeichnen 
signalisiert, werden die neuen daten ans display gesendet.

damit hätte ich einen festen zeitpunkt zu dem das neuzeichnen bzw. 
abändern geschieht. frage mich jedoch ob das überhaupt sinnvoll ist.

gruß
adam

Autor: Wolfgang Schmid (bluenature)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Macht man meist so, ist kein Fehler. Nur sollte das Bild natürlich 
komplett aufgebaut sein zum übertragen. Hast du keien freien 
Timer-Interrupt? Würde ebenso genügen...

Grüße Wolfgang

Autor: Adam P. (adamap)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klar...
im moment habe ich noch alles frei, soweit.
hab mir nun überlegt, eine eigene library zu schreiben, mit ram-abbild 
usw.
bis ich die frei verfügbaren lib's angepasst habe, vergeht genau soviel 
zeit :)

aber dann werde ich das direkt so auslegen, dass es mit dem timer 
zusammen passt - weis ja nun, dass die idee garnicht so schlecht war.

danke

gruß
adam

Autor: kruemeltee (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe hier gerade den FontCreator offen und versuche eine Font aus 
einer vorhandenen zu erstellen. Am liebsten windings/webdings aus einer 
.ttf Datei. Leider kam ich da nicht weiter, weiss jemand von euch, ob 
und wenn ja, wie das geht?

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi! ... actually i using your library in my proyect, but i have a doubt 
about that, what is the conection for PIN RESET?

Autor: Corny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Lib scheint ziemlich broken zu sein. Bei mir kommen nur warnings und 
errors beim compile-versuch:

(Long Version: http://pastebin.com/3U3DPL41 )

Short Version:

> avr-gcc --version
avr-gcc (GCC) 4.8.2

> uname -a
Linux foo 3.10.22-1-MANJARO #1 SMP Wed Dec 4 22:15:26 UTC 2013 i686 
GNU/Linux



... glcd_ks0108_v11/ > ls
arial_bold_14.h  corsiva_12.h  ks0108.c  ks0108.h  ks0108Test.c 
makefile  readme.txt
> make


In file included from ks0108Test.c:16:0:
arial_bold_14.h:48:16: error: variable 'Arial_Bold_14' must be const in 
order to be put into read-only section by means of 
'__attribute__((progmem))'
 static uint8_t Arial_Bold_14[] PROGMEM = {
                ^
In file included from ks0108Test.c:17:0:
corsiva_12.h:48:16: error: variable 'Corsiva_12' must be const in order 
to be put into read-only section by means of '__attribute__((progmem))'
 static uint8_t Corsiva_12[] PROGMEM = {
                ^
..............
                ^
ks0108.h:97:16: warning: inline function 'ks0108ReadData' declared but 
never defined [enabled by default]
makefile:376: recipe for target 'ks0108Test.o' failed
make: *** [ks0108Test.o] Error 1
>

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.