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
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
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
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
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?
Sei mal ein bischen großzügiger beim Timing. Sieht mir jedenfalls nach einem Timing Fehler aus.
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.
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
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...
@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 . . .
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
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
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?
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?
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...
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.
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
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
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 ...
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
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 :-).
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
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
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
@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.
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
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?
Hi
>Würde sagen, es geht ohne Fehler.
Und was war es genau?
Das 'byAS2015' ist ja wohl stark übertrieben.
MfG Spess
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
@ Achim Seeger (achims)
>Warum übertrieben?
Weil DU den Treiber NICHT entwickelt hast!
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
@ 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?
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
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
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
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.