Forum: Mikrocontroller und Digitale Elektronik Fehler in der Anzeige bei GLCD


von Achim S. (achims)


Lesenswert?

Hallo
ich verwende das GLCD TG12864B von Pollin und die Datein von Thiele. 
Anzeige erscheint (Schrift) erscheint korrekt.
In der linken Bildhälfte kommen zusätzlich noch kleine Striche und 
einzelne Punkte dazu. Vertausche ich mit CS1/2 die linke und rechte 
Bildhälfte, kommen die zusätzlichen Punkte in die rechte Bildhälfte. 
Auch der Strich zwischen beiden Hälften ist durch fehlende Bildpunkte 
deutlich sichtbar.
Display defekt oder Fehler im ???
achim

von AVR (Gast)


Lesenswert?

Zeile 65 - da ist dein Fehler

von Achim S. (achims)


Lesenswert?

Danke für die Info. Leider sehr dürftig.
Kann den Code auch reinstellen. Wie soll der helfen?
Dieser Code steht gefühlte 20x im Netz. Habe ihn nicht verändert.
Da auf der rechten Seite keine Fehler gezeigt werden, nur auf der linken 
Seite sind Fehler, ist mir die Sache unklar.
Habe das Display getauscht - gleiche Fehler.
achim

von spess53 (Gast)


Lesenswert?

Hi

>Danke für die Info. Leider sehr dürftig.

Du meinst deine Info?

>Dieser Code steht gefühlte 20x im Netz. Habe ihn nicht verändert.

Und jetzt sollen sich alle auf die Suche nach deinem Code machen? 
Außerdem heißt das noch lange nicht, das der Code unproblematisch ist.

>Habe das Display getauscht - gleiche Fehler.

Dann gehe erst mal von einem Fehler in der Software aus. Aus dem Bauch 
heraus würde ich auf auf die CS-Umschaltung tippen.

MfG Spess

von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Hallo
hänge den Code mit ran. Wenn das vertauschen von CS geht und damit die 
beiden Steiten vertauscht werden, kann das dann ein Problem sein?
Es erfolgt ja eine fast korrekte Anzeige damit.
Sorry, weiss nicht wo ich mit suchen anfangen soll
achim

von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Habe ein Bild gemacht mit den Fehlern

von Achim S. (achims)


Lesenswert?

Die Fehler befinden sich nur in der linken Seite. Der Text wird 
angezeigt, aber einige Teile / Striche sind verschoben. Es sind 2 
verschiedene Fonts enthalten, der Fehler ist bei beiden Schriften.
Keiner eine Idee dazu?

von Bernd N (Gast)


Lesenswert?

Sei mal ein bischen großzügiger beim Timing. Sieht mir jedenfalls nach 
einem Timing Fehler aus.

von Michael W. (Gast)


Lesenswert?

Achim Seeger schrieb:
> Die Fehler befinden sich nur in der linken Seite. Der Text wird
> angezeigt, aber einige Teile / Striche sind verschoben

Hä? Ich habe von diesen Dingen ja keine Ahnung, aber wie kommst Du 
darauf, daß der Fehler auf der linken Seite ist? Er ist über die 
komplette Anzeigenbreite zu sehen... es befinden sich 'ungewollte' Pixel 
an etlichen Stellen.

von Achim S. (achims)


Lesenswert?

Die Fehler kamen immer auf der linken Seite. Drücke ich mehrfach Reset 
wechseln die Pixel und verteilen sich neu.

Habe im Netz gelesen. Da sind schon einige Fehlerangeben auf Timing. 
Einige sagen auch, die Frequenz niedriger machen. Der Vorschlag ist 
nicht schlecht. Da ich mit 16M arbeite, müssen wohl einige delay rein. 
Eigentlich wollte ich keine delay nehmen. Wie macht man dann sowas?
achim

von Michael W. (Gast)


Lesenswert?

Achim Seeger schrieb:
> Die Fehler kamen immer auf der linken Seite. Drücke ich mehrfach Reset
> wechseln die Pixel und verteilen sich neu.

Aah - ok. Jetzt hab ich's auf'm Schirm ;-) Wurde aus den bisherigen 
Posts nicht so klar. Wenn ich (als Unwissender) jetzt raten sollte, 
würde ich auch Timing-Fehler nicht ausschliessen wollen...

von Falk B. (falk)


Lesenswert?

@Achim Seeger (achims)

>nicht schlecht. Da ich mit 16M arbeite, müssen wohl einige delay rein.
>Eigentlich wollte ich keine delay nehmen. Wie macht man dann sowas?

Achim, welche Drogen nimmst du schon wieder? WIE lange bastelst du schon 
mit AVRs rum? Und du hast schon wieder vergessen, wie eine _delay_us() 
oder _delay_ms() funktionier?
Das ist einfach nur noch ein Fall für den Psychiologen . . .

von spess53 (Gast)


Lesenswert?

Hi

> Da ich mit 16M arbeite, müssen wohl einige delay rein.
>Eigentlich wollte ich keine delay nehmen. Wie macht man dann sowas?
>achim

Dann aktiviere mal zwischenzeitlich den internen Oszillator und teste 
das ganze bei niedrigerem Takt.

MfG Spess

von Achim S. (achims)


Lesenswert?

Falk sei nicht so hart mit mir. Habe die anderen Fehler allein 
geschafft. Meine damit die änderungen von AVR 4 auf 5 und weiter auf 6. 
Für dich eine Kleinigkeit, für mich ein Problem. Ich weiss wie eine 
delay funktioniert, wie man es schreibt und anwendet. Die Frage müsste 
wohl er lauten, an welche Stelle es muss.
Das Display braucht für die Umschaltung und Darstellung Zeit, steht im 
Netz und verschiedene Angaben dazu, von 1ms bis 50ms habe ich gefunden. 
habe auch gelesen es könnten 450ns sein. Egal es braucht Zeit.
In der Datei ks0108.c erfolgt die Ansteuerung.
achim

von Peter X. (peter_x)


Lesenswert?

Achim Seeger schrieb:
> von 1ms bis 50ms habe ich gefunden.
> habe auch gelesen es könnten 450ns sein.

Warum nimmst du nicht das verfickte Datenblatt des Kontrollers, anstatt 
im Netz nach diversen Delay-Werten zu suchen?

von Achim S. (achims)


Lesenswert?

Ich habe das Datenblatt zum Display mit Kontroller drauf. Besteht aus 
einer Seite und viele Masse drauf. Mehr nicht.

Eine ganz einfache Frage dazu. Im Datenblatt steht LED 5V, auf dem 
Displa sind Widerstände druaf, R8 und R9, und gehen zu der LED. Das sind 
die Vorwiderstände und man braucht keinen externen?

von thosch (Gast)


Lesenswert?

Peter Xuang schrieb:
>
> Warum nimmst du nicht das verfickte Datenblatt des Kontrollers, anstatt
> im Netz nach diversen Delay-Werten zu suchen?

Tja, immer wieder dieselbe (unbequeme) Leier.
Natürlich wäre ganau das die Lösung, aber dazu muß man sich doch 
tatsächlich bequemen, das Datenblatt zu lesen und das Gelesene auch zu 
verstehen.
Da ist es natürlich viel einfacher, 'ne Frage ins Forum zu rotzen oder
lustige Internetsuchen nach Delaywerten zu starten...

von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Das Datenblatt dazu habe ich vorher gelesen. Leider keine Angaben zur 
Zeit.
Bei der LED stehen 5V drin. Mit oder ohne Vorwiderstand?
Hänge es mit ran.

von Peter X. (peter_x)


Lesenswert?

Peter Xuang schrieb:
> Warum nimmst du nicht das verfickte Datenblatt des Kontrollers, anstatt
> im Netz nach diversen Delay-Werten zu suchen?

Und für 10 €uro kannst du dir einen LA zocken, um dein programmiertes 
Timing zu verifizieren. Lies' halt mal in diesem Forum, was hundert 
andere User an deiner statt gemacht haben. Geduld und aufmerksames Lesen 
und Verstehen ist wohl nicht mehr aktuell.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Das Datenblatt dazu habe ich vorher gelesen. Leider keine Angaben zur
>Zeit.
>Bei der LED stehen 5V drin. Mit oder ohne Vorwiderstand?
>Hänge es mit ran.

Das ist das uninteressante Datenblatt des Displays. Das wichtige 
Dokument ist das Datenblatt des Displaykontrollers -> KS0108B. Dort 
stehen die wichtigen Sachen drin.

Und hast du das

Beitrag "Re: Fehler in der Anzeige bei GLCD"

schon mal getestet?

MfG Spess

von Ralf D. (rad)


Lesenswert?

Achim Seeger schrieb:
> Das Datenblatt dazu habe ich vorher gelesen. Leider keine Angaben zur
> Zeit.

Hmmmm ... grübel ... komisch ...

In dem Datenblatt http://www.lcd-module.de/eng/pdf/zubehoer/ks0108b.pdf 
steht doch alles drin; sowohl die Bustimings als auch die Methode mit 
der man feststellen kann ob der Chip beschäftigt oder bereit ist ...

von Achim S. (achims)


Lesenswert?

Sorry, hatte das Datenblatt zum Display genommen, nicht zum IC. Hatte 
vorher mit der Belegung gekämpft. Mache noch die Beleuchtung fertig und 
dann geht es die Frequenz

von Peter X. (peter_x)


Lesenswert?

Achim Seeger schrieb:
> Mache noch die Beleuchtung fertig und
> dann geht es die Frequenz

Wenn es dann geht, möchten wir aber auch ein Photo davon sehen :-).

von Achim S. (achims)


Lesenswert?

Mach ich gern, aber erst muss es korrekt laufen

von Achim S. (achims)


Lesenswert?

Ein Erfolg ist gerade gekommen. Korrekte Anzeige ohne einen Fehler oder 
falscher Pixel. Es liegt also an der Zeit. Muss noch rauskriegen wie ich 
es dauerhaft oder besser lösen kann. Dann kommt Foto

von Falk B. (falk)


Lesenswert?

In ks1018.c
1
void ks0108Enable(void) {
2
  volatile uint8_t i;
3
  
4
  LCD_CMD_PORT |= 0x01 << EN;            // EN high level width: min. 450ns
5
  asm volatile("nop\n\t"
6
         "nop\n\t"
7
         "nop\n\t"
8
         ::);
9
  LCD_CMD_PORT &= ~(0x01 << EN);
10
  for(i=0; i<8; i++);                // a little delay loop (faster than reading the busy flag)
11
}

Auch ohne Profi-C-Kenntnisse erkennt man, dass drei läppische NOP keine 
450ns Verzögerung ergeben, wenn die CPU mit 16 MHz getaktet wird. Also 
muss hier ein _delay_us(450); rein.
Das Gleiche in der Funktion char ks0108ReadData(uint8_t incXAdd)
Ausserdem sollte man GANZ schnell diesen Müll raushauen, der krampfhaft 
aber keineswegs solide eine kleine Verzögerung machen will.
1
for(i=0; i<8; i++);                // a little delay loop (faster than read
2
ing the busy flag)

Raus damit und ein _delay_us(40) oder so rein.

Das hier auch, das ist Murks.

1
#ifdef DEBUG
2
  volatile uint16_t i;
3
  for(i=0; i<5000; i++);
4
#endif

War jetzt wirklich schwer, diesen geradezu unleserlichen, gar 
kryptischen Hochsprachenquelltext ohne Kommentare zu verstehen . . .

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Falk Brunner schrieb:
> dass drei läppische NOP keine
> 450ns Verzögerung ergeben, wenn die CPU mit 16 MHz getaktet wird. Also
> muss hier ein _delay_us(450); rein.

wie bitte?

16 MHz = 62,5ns

OK 3x sind nur  187,5ns

mit 8x wären es dann 500ns

aber daraus 450µs zu machen finde ich übertieben, nur so um den Faktor 
1000

allerdings ist der Port setzen nicht in NullZeit, evt. würden auch 6-7x 
NOP reichen statt 8x

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@Joachim B. (jar)

>aber daraus 450µs zu machen finde ich übertieben, nur so um den Faktor
>1000

Mensch bist du witzig!

Ja, es sind eher 0,5us. Hier dein Keks.

von Joachim B. (jar)


Lesenswert?

Falk Brunner schrieb:
> Mensch bist du witzig!

ich nicht

du meinst wirklich das " _delay_us(450);"

nicht µs heisst sondern ns ?

wenn du meinst......

das schreiben die hier:

void _delay_us   (   double    __us  )

Perform a delay of __us microseconds, using _delay_loop_1().

Falk Brunner schrieb:
> Hier dein Keks

don't drink & write ......

: Bearbeitet durch User
von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Würde sagen, es geht ohne Fehler.
Habe ein Foto als Beweis mit rein gestellt. Habe noch um eine neue 
Funktion und ein paar Schriften erweitert. Mal sehen was noch geht
achim

PS. Der Font Creator geht bei mir nicht. Java?

von spess53 (Gast)


Lesenswert?

Hi

>Würde sagen, es geht ohne Fehler.

Und was war es genau?

Das 'byAS2015' ist ja wohl stark übertrieben.

MfG Spess

von Achim S. (achims)


Lesenswert?

Warum übertrieben? Ich freue mich einfach das es geht.
Es lag an der Zeit. Wahrscheinliches Hauptproblem ist die Umschaltung 
CS1/2 und die Sachen von Falk. Mache mich an dias nächste
achim

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>Warum übertrieben?

Weil DU den Treiber NICHT entwickelt hast!

von Achim S. (achims)


Lesenswert?

Im Text zum Prg steht drin wer es geschrieben hat. Den Autor scheint es 
seit 2007 nicht mehr zu geben. Seit dem haben sich einige dran versucht 
und selber genutzt. Aber keiner hat das Prg weiterentwickelt.
Egal, ich freue mich trotzdem, das es geht und werde es weiter 
verwenden.
achim

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>und selber genutzt. Aber keiner hat das Prg weiterentwickelt.

Wozu, es tut was es soll.

>Egal, ich freue mich trotzdem, das es geht und werde es weiter
>verwenden.

Wie hast du das Timing angepasst? Einfach den CPU-Takt verringert?

von spess53 (Gast)


Lesenswert?

Hi

>Im Text zum Prg steht drin wer es geschrieben hat. Den Autor scheint es
>seit 2007 nicht mehr zu geben.

Meine, selbst geschriebene, Software für den KS0108B/HD61202 habe ich 
1999 das letzte mal geändert. Und mich gibt es auch noch.

MfG Spess

von Achim S. (achims)


Lesenswert?

Hallo Spess
das ori war für AVRStudio 4 oder so geschrieben. Dadurch mussten 
verschiedene Dinge angepasst werden. Hatte zu Anfang ca 30 
Fehlermeldungen. Hängt auch nit dem AVR Studio 6 zusammen.
Nach den Hinweisen von Falk konnte ich auch die letzten Sachen ändern.
Die Frequenz habe ich weiter bei 16 M gelassen. Habe die NOP geändert, 
Datenblatt zum KS0108 gelesen (so weit möglich)und Zeiten geändert und 
getestet. Nach ca 50 Abstürzen des mk2 und Neustart konnte ich die 
Zeiten soweit eintragen, das sich der AT1284p mit angeschlossenen 
Display programmieren lässt. Wie oben beschrieben, ging das zeitweise 
nicht. Bin jetzt an den bmp dran. Mal sehen ob die auch laufen
Ich sage nicht das ich den Treiber geschrieben habe, die Aufschrift auf 
dem Display stammt von mir
achim

von spess53 (Gast)


Lesenswert?

Hi

>Hallo Spess
>das ori war für AVRStudio 4 oder so geschrieben. das ori war für AVRStudio >4 
oder so geschrieben. Dadurch mussten
>verschiedene Dinge angepasst werden. Hatte zu Anfang ca 30
>Fehlermeldungen.

Kommt wenn man fremde libs benutzt.

Mein Original dürfte von AVR Studio 2.xx sein. Allerdings Assembler und 
lässt sich heute noch problemlos assemblieren.

Gilt auch für andere Display-Controller wie HD44780 und Kompatible, 
T6963, SED1520/4520 und diverse DOG-Diplays.

Allerdings würde nie ein 'by...' bei mir erscheinen.

MfG Spess

von BirgerT (Gast)


Lesenswert?

Kenne den Achim ja auch seit längerem, weil wir beide 'nen Nibo2 haben.
Tja, das mit dem "by" bei fremden Programmen find' ich auch aasig..

Für das GLCD vom Nibo2 hatte ich schon eine gebufferte Ausgabe 
programmiert weil die Bibliotheksfunktionen eben so langsam sind.
Den Buffer wollte ich dann per Timerinterrupt an das GLCD ausgeben 
lassen. Beim Testen der Timings bin ich dann drauf gekommen, das dieser 
KS0108 eigentlich flott genug ist, und ein Zwischenbuffer (1024 Byte) 
eher nicht nötig ist - der einzige Vorteil des Buffers war, dass ich den 
Bufferinhalt (die GLCD Grafik) als ASCII Klötze über den UART an 
Puttytel ausgeben konnte.
[[http://www.roboter.cc/index.php?option=com_kunena&view=topic&catid=13&id=2411&Itemid=20#3016]]

Also habe ich mir eine eigene GLCD Lib zusammen gestrickt - hier ein 
Auszug, wie das Schreiben und das Timing bei mir geht:
1
//////////////////////////////////////////////////////////////////////////
2
//
3
//  BT LIB GLCD    Low Level Ansteuerung 128x64 Grafikdisplay mit KS0108
4
//          Beschreibung siehe bt_lib_glcd.h
5
//
6
//  (c) Birger Töpelmann  toepelmann(A)web.de  Version 150115a
7
//
8
//////////////////////////////////////////////////////////////////////////
9
:
10
:
11
//
12
//////////////////////////////////////////////////////////////////////////
13
//
14
//      GLCD STATUS:  Statusbyte lesen und auf !Busy warten
15
//
16
//  ->   (chip & 3) == 0 :  Chip1 Status
17
//    (chip & 3) == 1 :  Chip1 Status
18
//    (chip & 3) == 2 :  Chip2 Status
19
//    (chip & 3) == 3 :  Chip1 Status
20
//
21
//   <-  status   == 0 : Display TimeOut
22
//          1 : Display ist Bereit
23
//    CS = Chipselect (1 o. 2) bleibt stehen
24
//    RS = Registerselect bleibt auf Command
25
//    RW = ReadWrite steht auf Lesen
26
//    Am Datenport kann das Stusbyte gelesen werden.
27
//
28
uint8_t glcd_status(uint8_t chip){
29
30
//  uint16_t timeout = 0; //xffff;
31
//  uint8_t timeout = 0;
32
  uint8_t timeout = 0xff;
33
  
34
  // Chip- u. Register- Select
35
  chip &= 0x03;
36
  if (chip == 2) LCD_CHIP2;
37
  if ((chip & 0x01) == 1) LCD_CHIP1;
38
39
  //
40
  // GLCD Port Status Lesen
41
  //
42
  LCD_RS_CMD;      // Registerselect Command
43
  LCD_RW_RD;      // Richtung lesen
44
  LCD_DATA_OUT = 0;  // Pullup aus
45
  LCD_DATA_DDR = 0;  // LCD Datenbus auf Eingang
46
47
  // Es muss gewartet werden
48
  do{
49
50
    // Enable Signal ein/aus
51
    LCD_EN_H;      // Enable EIN
52
    LCD_EN_DELAY;    // 'ne halbe us warten
53
    LCD_EN_L;      // Enable Aus
54
55
    // Display Status lesen und Busyflag testen
56
    if(!TSTBIT(LCD_DATA_IN,LCD_BUSY_FLAG)) {
57
      return 1;
58
    }
59
    
60
  } while(--timeout);
61
62
  return 0;
63
}
64
:
65
:
66
//
67
//////////////////////////////////////////////////////////////////////////
68
//
69
//      GLCD WRITE: Ein Byte ans Display ausgeben
70
//            Für Kommandos oder Pixeldaten
71
//
72
//  ->   (mode & 3) == 0 : aktueller Chip ist aktiv
73
//    (mode & 1) == 1 : Chip1 Register aktivieren
74
//    (mode & 2) == 2 : Chip2 Register aktivieren
75
//          um an beide Controller die selben Daten zu schreiben
76
//    (mode & 3) == 3 : Chip1 und Chip2 aktivieren
77
//
78
//    (mode & 4) == 4 : Command Register schreiben
79
//    (mode & 4) == 0 : Daten Register schreiben
80
//
81
//  ->  data =   Datenbyte für aktive Adresse oder Befehlsbyte
82
//
83
//    Aktualisiert:
84
//      - CHIPSELECT
85
//      - REGISTERSELECT
86
//      ! ADRESS AUTOINKREMENT glcd_xpos wird nicht aktualisiert
87
//
88
void glcd_write(uint8_t mode, uint8_t data){
89
  //
90
  //  Chip Bereit abwarten, Abbruch bei Timeout
91
  if (glcd_status(mode) == 0) return;
92
93
  // ChipSelect 1 o. 2 bereits mit glcd_status() erledigt
94
  // Sollen beide Chips gleichzeitig beschrieben werden?
95
  if((mode & (uint8_t)3) == 3) LCD_CHIPS;
96
  
97
  // RegisterSelect "Cmd" bereits mit glcd_wait() erledigt
98
  if((mode & (uint8_t)4) == 4) LCD_RS_CMD;
99
  else LCD_RS_DTA;
100
101
  // RW = Schreiben
102
  LCD_RW_WR;
103
104
  // Enable vorzeitig setzen -> spart EN_DELAY
105
  LCD_EN_H;
106
  
107
  // Datenport auf Ausgang
108
  LCD_DATA_DDR = 0xff;
109
  LCD_DATA_OUT = data;
110
  
111
  // Enable Signal ein/aus
112
  //  LCD_EN_H;
113
  //  LCD_EN_DELAY;
114
  LCD_EN_L;
115
116
}
117
:
118
:
119
//
120
//////////////////////////////////////////////////////////////////////////
121
//
122
//      GLCD FILL:  GLCD Speicher mit Bitmuster füllen
123
//      Es werden beide LCD Controller gleichzeitig geschrieben
124
//
125
//    -> data    = 0 Displayspeicherinhalt löschen
126
//
127
void glcd_fill(uint8_t data){
128
129
  // 8 Seiten (Zeilen) pro Controller
130
  for(uint8_t page=0; page<8; page++){
131
132
    // Controller Kommandos Seite und Adresse setzen
133
    glcd_write(4+3, LCD_PAG0 + page);
134
    glcd_write(4+3, LCD_ADR0);
135
    
136
    // Eine Seite hat 64 Spalten (Bytes)
137
    // Das Display macht einen Autoinkrement
138
    for(uint8_t col=64; col>0; --col){
139
      glcd_write(3, data);
140
    }
141
  }
142
  // Erste Seite aktivieren
143
  glcd_gotoXY(0,0);
144
  glcd_row = 1;
145
  glcd_col = 1;
146
}
147
//
148
//////////////////////////////////////////////////////////////////////////
149
//
150
//    GLCD_PIXEL XY:
151
//    Ein Pixelbit auf dem GLCD an der übergebenen Position setzen,
152
//    löschen oder invertieren.
153
//
154
//  ->   x  Pixelspalte 0..127
155
//    y  Pixelzeile 0..63
156
//    val ==  0 : Pixel löschen
157
//    val ==  1 : Pixel setzen
158
//    val == -1 : Pixel invertieren
159
//
160
void  glcd_pixel_XY(uint8_t x, uint8_t y, const int8_t val){
161
  //
162
  uint8_t data, mask;
163
  uint8_t chip = 1;
164
165
  // Wertebegrenzung
166
  if(x > 127)  x -= 128;
167
  if(y > 127)  y -= 128;
168
  if(y > 63)  y -= 64;
169
170
  // Chip- und Command-Select
171
  if(x > 63){
172
    x -= 64;
173
    chip = 2;
174
  }
175
  
176
  // Seite und Byteadresse setzen
177
  glcd_write(4+chip, LCD_PAG0 + y/8);
178
  glcd_write(4+chip, LCD_ADR0 + x);
179
180
  // Byte Dummy Read
181
  glcd_read(chip);
182
183
  // vorhandenes "Nutz-"Byte lesen
184
  data = glcd_read(chip);
185
186
  // Bitmaske mit Bit an Y-Position
187
  mask = 0x01 << (y & 0x07);
188
189
  // nach der vorangegangenen Schiebeaktion müsste
190
  // das GLCD wieder bereit sein, ohne Warten..
191
  
192
  // Adresse Autoinkrement zurücksetzen
193
  glcd_write(4+chip, LCD_ADR0 + x);
194
195
  // Pixelbit setzen
196
  if (val > 0) {
197
    data |= mask;
198
  }
199
  // Pixelbit invertieren
200
  else if (val < 0) {
201
    data ^= mask;
202
  }
203
  // Pixelbit löschen
204
  else {
205
    data &= ~mask;
206
  }
207
208
  // neues Byte schreiben
209
  glcd_write(chip, data);
210
211
}

Mir war bisher auch nur eine GLCD-Lib bekannt, die auch den XOR-Modus 
für die Grafik-/Textausgabe unterstützt - die GFX-Lib von nicai zum 
Nibo2.

Ich habe keine KS0108 Lib gefunden, die Kreise im Xor Modus korrekt 
ausgeben könnte, weil Kreispixel doppelt gesetzt oder gelöscht werden.

Und zu den Timings (Nibo2 ATmega128 16MHz):

Das Warten auf "Ready" sollte man machen, bevor man Daten schreibt oder 
liest, und nicht direkt nach dem Schreiben/Lesen - in einer KS0108 Lib 
habe ich im Kommentar gelesen, dass 1ms Warten schneller gehen soll, als 
das BUSY-Flag abzufragen..Also die Timoutloop zählt bei mir max. 2 
Umdrehungen, dann ist das BUSY weg.

Die Daten werden vom KS0108 (oder SB0108) bei der negativen Flanke von 
Enable übernommen, d. h. ich kann das Enable auf 1 setzen, schon bevor 
ich die Daten am Port ausgebe..
Wenn die Daten am Port anliegen, sind wohl schon 450ns vorüber, und das 
Enable kann wieder auf 0 gesetzt werden.

Man kann die KS0108 auch gleichzeitig beschreiben (CS1 und CS2 
aktivieren).

Auch das Autoinkrement der Adresse innerhalb einer Page kann man prima 
ausnutzen: Adress Command schreiben, Dummyread, Daten Block lesen, Block 
im Buffer bearbeiten, Adress Command schreiben, Daten Block schreiben.

Und was auch gut kommt - wenn die zu setzende Pixeladresse größer "als 
erlaubt" ist, diese nicht auf das Maximum begrenzen, sondern solange den 
Maxwert abziehen, bis eine gültige Adresse rauskommt.
Eine Grafik wird nicht rechts oder unten "abgeschnitten", sondern links 
oder oben fortgesetzt (Wrap Around).

Also Achim, pack Deinen Nibo2 wieder aus, den kann man auch mit anderen 
Libs programmieren - Und der Pieper hängt auch am richtigen Pin ;-)

von achim (Gast)


Lesenswert?

Hallo Birger
Danke für deine Hilfe. Da muss ich erst mal durchsteigen
achim

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.