Forum: Mikrocontroller und Digitale Elektronik Wie muss man Pervasive Displays beschreiben?


von Wolle G. (wolleg)



Lesenswert?

Ich beziehe mich auf die angehängte Anleitung. (4P018-00_03_G2.....)
Die Initialisierung (Thema: Suche Lösungsvorschlag  zur Initialisierung 
eines  Pervasive Displays ) habe ich jetzt erfolgreich? gemeistert, 
sodass es mit dem Abschnitt 5 weiter gehen soll.
Speziell geht es um das 2,7" Papier (S. 23)
Einige Fragen: a) Was ist z.B. mit 1 hoch st, 33 hoch rd  und 44 hoch th 
gemeint?
         b) Wie muss (kann) man
Example:
D(263,y) = Black  (B) = 11
D(261,y) = White (W)= 10
D(259,y) = Nothing(N) = 00
D(257,y) = Black  (B) = 11
1st Data Byte = 11,10,00,11

in eine Befehlsfolge wandeln?
SPI soll in der Art verwendet werden, wie in  "Suche Lösungsvorschlag 
zur Initialisierung eines  Pervasiven Displays" bereits beschrieben.

von spess53 (Gast)


Lesenswert?

Hi

>Speziell geht es um das 2,7" Papier (S. 23)
>Einige Fragen: a) Was ist z.B. mit 1 hoch st, 33 hoch rd  und 44 hoch th
>gemeint?
>         b) Wie muss (kann) man
>Example:
>D(263,y) = Black  (B) = 11
>D(261,y) = White (W)= 10
>D(259,y) = Nothing(N) = 00
>D(257,y) = Black  (B) = 11
>1st Data Byte = 11,10,00,11

>in eine Befehlsfolge wandeln?

Wo steht das genau im Datenblatt?

MfG Spess

von elo (Gast)


Lesenswert?

spess53 schrieb:

> Wo steht das genau im Datenblatt?
>
> MfG Spess


Seite 29

von Markus F. (mfro)


Lesenswert?

spess53 schrieb:
> Einige Fragen: a) Was ist z.B. mit 1 hoch st, 33 hoch rd  und 44 hoch th
>>gemeint?

"1st, 33rd, 44th" heißt "first, thirtythird, fortyfourth".

Sprich: "erstes, dreiunddreißigstes, vierundvierzigstes" (Byte).

von Jim M. (turboj)


Lesenswert?

wolle g. schrieb:
> Einige Fragen: a) Was ist z.B. mit 1 hoch st, 33 hoch rd  und 44 hoch th
> gemeint?

Das der OP seinen Englisch Grundkurs wiederholen muss. Ohne diese 
Grundlagen ist das Verständnis eines Datenblatts nicht möglich.

von Markus F. (mfro)


Lesenswert?

Jim M. schrieb:
> Das der OP seinen Englisch Grundkurs wiederholen muss.

Sehr dünnes Eis...

http://www.das-dass.de/

von Wolle G. (wolleg)


Lesenswert?

spess53 schrieb:
> Wo steht das genau im Datenblatt?

elo schrieb:
> Seite 29

peinlich, peinlich.  Aber elo hat die richtige Seite gefunden.

Jim M. schrieb:
> Das der OP seinen Englisch Grundkurs wiederholen muss. Ohne diese
> Grundlagen ist das Verständnis eines Datenblatts nicht möglich.

und nun?
Wie muss man denn mit ausreichenden Englischkenntnissen das Beispiel 
(example) von S. 29 deuten?

von Wolle G. (wolleg)


Lesenswert?

Wahrscheinlich bin ich ein weiterer Exot, der sich mit e-paper 
beschäftigt.
Vielleicht hat jemand einen Hinweis oder ein Programmschnipsel, wie man 
den Abschnitt 5 (ab Seite 25)  als Programm schreiben kann.
Wie schon gesagt, Initialisierung funktioniert und der Rahmen lässt sich 
bei mir jetzt auch schon EIN und AUS schalten.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also zu S29

du sendest die ersten 33 Byte, jedes Byte enthält die Information von 4 
Pixeln (2Bit pro Pixel),
in dem Durchlauf werden nur die Informationen für die ungeraden Pixel 
übertragen. Dann kommen 44Byte Scandaten 2Bit pro Zeile macht 4 Zeilen 
pro Byte mal 44 = 176 Zeilen, wofür das genau da ist versteh' ich auch 
nicht auf Anhieb, würde erst mal 44x 0xFF senden. Im Anschluss kommen 
noch mal 33Byte für die geraden Pixel der Zeile wie oben Codiert.
Damit hast du 2Bit pro Pixel, sind 4 Pixel pro Byte mal 66 Byte ergibt 
deine 276 Pixel in X-Richtung. Bei den 2Bit für ein Pixel hast du die 
Auswahl zwischen Pixel AN, Pixel AUS und Pixel im vorherigen Zustand 
belassen.

Du sendest über SPI:
0x0A,0x00, 33 Byte Pixeldaten, 44 Byte Scandaten, 33 Byte Pixeldaten und 
0x02,0x07
Das ganze machst du für jede Zeile also 176 Mal.

Sascha

von Wolle G. (wolleg)


Lesenswert?

Danke, das hilft schon etwas weiter.
Z. Zt. kann ich erst einmal schöne senkrechte schwarze Striche 
"zaubern".
Sieht ähnlich aus, wie ein Strichcode.

von Nosnibor (Gast)


Lesenswert?

Dann wird "scan data" wohl angeben, welche Zeilen durch die Pixeldaten 
geändert werden sollen.
44 x 0xFF ändert alle Zeilen auf einmal, also sehen alle Zeilen gleich 
aus: Strichcode.
1 x 0xFF + 43 x 0x00 sollte z.B. nur die ersten 4 Zeilen ändern.

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

Jetzt kann ich das e-Papier entweder komplett schwarz oder weiß 
beschreiben.

a) Das reicht natürlich noch nicht für meine Anwendung. (es soll mal ein 
EKG geschrieben werden)
Vermutlich liegt mein Problem u.a. in der Zeile -scan Byte- 
(for(s=0;s<44;s++)SPI_8Bit_oCS( 0xff);), welche zwischen den geraden und 
ungeraden Bildpunkten eingebaut ist.
Zunächst: Wie könnte man scan Byte sinnvoll übersetzen?
im Anhang mal das Programmschnipsel „E-Papier beschreiben.h“

b)  als nächstes habe ich versucht, das Bild „Bild_EAlogo1.h“, welches 
als zweidimensionales [Feld] (array) aufgebaut ist, zu verarbeiten.
Dazu wurde eine Funktion, wie in „mit bild 176x33.c“  angeführt, 
geschrieben.
Nun tritt das Problem auf, dass das Programm, wenn 176 Zeilen verwendet 
werden, sich aufhängt.
Bei einem Bild mit versuchsweise nur 48 Zeilen, hängt sich das Programm 
nicht auf.
Weil ich von Programmierung zu wenig Ahnung, die Frage, wie man das 
Problem lösen könnte (z.B. Zeiger ??)
Verwendet wird ein MSP430F1611.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Jetzt kann ich das e-Papier entweder komplett schwarz oder weiß
> beschreiben.
>
> a) Das reicht natürlich noch nicht für meine Anwendung. (es soll mal ein
> EKG geschrieben werden)
> Vermutlich liegt mein Problem u.a. in der Zeile -scan Byte-
> (for(s=0;s<44;s++)SPI_8Bit_oCS( 0xff);), welche zwischen den geraden und
> ungeraden Bildpunkten eingebaut ist.
> Zunächst: Wie könnte man scan Byte sinnvoll übersetzen?
hast du mal den Vorschlag von Nosnibor getestet? Bei genauerer 
Betrachtung scheint das sinnvoll damit anzugeben für welche Zeilen die 
Pixeldaten übernommen werden sollen.

> im Anhang mal das Programmschnipsel „E-Papier beschreiben.h“
Scan soll 11 oder 00 sein, ein senden von 0xaa ergibt 10!

> b)  als nächstes habe ich versucht, das Bild „Bild_EAlogo1.h“, welches
> als zweidimensionales [Feld] (array) aufgebaut ist, zu verarbeiten.
> Dazu wurde eine Funktion, wie in „mit bild 176x33.c“  angeführt,
> geschrieben.
Deine Bilddaten haben 1-Bit pro Pixel, das müsstest vor dem senden auf 
2-Bit erweitern und dann logischer Weise noch erst alle geraden dann 
alle ungeraden Pixel auslesen.

> Nun tritt das Problem auf, dass das Programm, wenn 176 Zeilen verwendet
> werden, sich aufhängt.
> Bei einem Bild mit versuchsweise nur 48 Zeilen, hängt sich das Programm
> nicht auf.
Wie hängt sich auf?
Und irgendwie passt das mit dem 0x0A,0x00 vor den Daten und 0x02,0x07 
nach den Daten zusammen mit deinem CS nicht so recht. Was sind das für 
Daten die bei den SPI16 noch gesendet werden?

> Weil ich von Programmierung zu wenig Ahnung, die Frage, wie man das
> Problem lösen könnte (z.B. Zeiger ??)
Da hast du dir ja gleich was großes vorgenommen!

Sascha

von Wolle G. (wolleg)


Lesenswert?

Sascha W. schrieb:
> Was sind das für
> Daten die bei den SPI16 noch gesendet werden?

Das lässt sich noch leicht beantworten: es wird  0x02, 0x07 gesendet und 
davor  muss jeweils 0x72 (Register) bzw. 0x70 (index) gesetzt werden.
>hast du mal den Vorschlag von Nosnibor getestet?
  Ja, funktioniert bei mir so, dass ich an einer  gewünschten Stelle 
eine Linie (Zeile) schreiben kann.
>Deine Bilddaten haben 1-Bit pro Pixel,
würde ich nicht so sehen: 1 Daten-Byte enthält 4 Bildpunkte zu je 2 Bit 
(11 für schwarz,  10 für weiß), wobei man zunächst die ungeraden und 
nach -scan Byte- die geraden Bildpunkte sendet. (so habe ich es gemacht)
> Wie hängt sich auf?
Nach dem Übertragen des Programms zum µC tut sich nichts. Z.B. , die LED 
grün reagiert nicht. und ein TIMER , der alle 2s eine LED blitzen lässt, 
bleibt aus.
Bei dem Versuch mit nur 48 Zeilen wurden aber Bildpunkte gezeichnet und 
der TIMER lief auch

von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> Was sind das für
>> Daten die bei den SPI16 noch gesendet werden?
>
> Das lässt sich noch leicht beantworten: es wird  0x02, 0x07 gesendet und
> davor  muss jeweils 0x72 (Register) bzw. 0x70 (index) gesetzt werden.
Ok
>>hast du mal den Vorschlag von Nosnibor getestet?
>   Ja, funktioniert bei mir so, dass ich an einer  gewünschten Stelle
> eine Linie (Zeile) schreiben kann.
Ok
>>Deine Bilddaten haben 1-Bit pro Pixel,
> würde ich nicht so sehen: 1 Daten-Byte enthält 4 Bildpunkte zu je 2 Bit
> (11 für schwarz,  10 für weiß), wobei man zunächst die ungeraden und
> nach -scan Byte- die geraden Bildpunkte sendet. (so habe ich es gemacht)
deine Daten haben 33Byte pro Zeile das langt nur für die Hälfte der 
horizontalen Pixel, aber egal da du im Moment für die geraden und 
ungeraden die selben Daten sendest wird das Bild horizontal um den 
Faktor 2 vergrößert.
>> Wie hängt sich auf?
> Nach dem Übertragen des Programms zum µC tut sich nichts. Z.B. , die LED
> grün reagiert nicht. und ein TIMER , der alle 2s eine LED blitzen lässt,
> bleibt aus.
> Bei dem Versuch mit nur 48 Zeilen wurden aber Bildpunkte gezeichnet und
> der TIMER lief auch
Hast du nur die Schleife geändert oder auch die Bilddaten?

um noch mal auf die Scandaten zurückzukommen, du musst die 44Byte 
entsprechend der aktuellen Zeile die du sendest anpassen - also in den 
44 Byte dürfen nur die zwei Bit gesetzt sein die zu der Zeile gehören 
deren Daten du in den 2x33Byte sendest.

Sascha

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

Sascha W. schrieb:
> um noch mal auf die Scandaten zurückzukommen, du musst die 44Byte
> entsprechend der aktuellen Zeile die du sendest anpassen - also in den
> 44 Byte dürfen nur die zwei Bit gesetzt sein die zu der Zeile gehören
> deren Daten du in den 2x33Byte sendest.

Ich habe noch etwas experimentiert und hoffe, das mit den Scandaten 
verstanden zu haben. Es ist mir jetzt möglich, in jede beliebige Zeile 
eine Linie zu zeichnen und denke, evtl. in nächster Zeit auch ein 
komplettes Bild zeichnen zu können.
Unbefriedigend ist aber, dass mit meinem µC und meinem Programm das Bild 
nur 98 Zeilen haben darf. Wie schon gesagt, mit 176 Zeilen will das 
Programm nicht laufen.
In einem Demoprogramm (epaper_pi_130307.tar.gz) wurden Zeiger verwendet. 
Könnte dies zu einer Lösung des Problems führen? wenn ja, wie

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Ich habe noch etwas experimentiert und hoffe, das mit den Scandaten
> verstanden zu haben. Es ist mir jetzt möglich, in jede beliebige Zeile
> eine Linie zu zeichnen und denke, evtl. in nächster Zeit auch ein
> komplettes Bild zeichnen zu können.
das passt doch schon mal
> Unbefriedigend ist aber, dass mit meinem µC und meinem Programm das Bild
> nur 98 Zeilen haben darf. Wie schon gesagt, mit 176 Zeilen will das
> Programm nicht laufen.
du hast meine Frage noch nicht beantwortet, hast du nur die Schleife auf 
98 gesetzt oder auch weniger Bilddaten in dein Array gelegt?
Wenn du nicht noch eine serielle Schnittstelle für Statusausgaben hast 
dann musst du halt mit ein paar Pins wackeln um zu sehen wo dein 
Programm hängenbleibt

Sascha

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

Sascha W. schrieb:
> du hast meine Frage noch nicht beantwortet, hast du nur die Schleife auf
> 98 gesetzt oder auch weniger Bilddaten in dein Array gelegt?

Es wurden weniger Bilddaten verwendet.
Das Feld wurde von der Größe [176] [33] auf [98][33] verkleinert.
Im Anhang mal der Bildschirm,  wie er sich zeigt, wenn es Probleme gibt.
Irgendetwas mit der Kopierung in einen Speicher (memcpy)läuft 
wahrscheinlich nicht so, wie es soll.

von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> du hast meine Frage noch nicht beantwortet, hast du nur die Schleife auf
>> 98 gesetzt oder auch weniger Bilddaten in dein Array gelegt?
>
> Es wurden weniger Bilddaten verwendet.
> Das Feld wurde von der Größe [176] [33] auf [98][33] verkleinert.
> Im Anhang mal der Bildschirm,  wie er sich zeigt, wenn es Probleme gibt.
> Irgendetwas mit der Kopierung in einen Speicher (memcpy)läuft
> wahrscheinlich nicht so, wie es soll.

ganz klar, deine Definition der Bildaten als
1
unsigned char const ImageDataPD[96][16]= ...
2
unsigned char PreloadImage[96][16]
landet komplett im RAM des Controllers, und das wird einfach zu viel 
sein. macht bei 176x33 = 5.8kB * 2 >10kB und dein MSP hat nur 10kB!
Du musst die festen Bilddaten ausschließlich im Flash ablegen.

Sascha

von Wolle G. (wolleg)


Lesenswert?

Sascha W. schrieb:
> landet komplett im RAM des Controllers, und das wird einfach zu viel
> sein. macht bei 176x33 = 5.8kB * 2 >10kB und dein MSP hat nur 10kB!
> Du musst die festen Bilddaten ausschließlich im Flash ablegen.
Die Berechnung verstehe ich noch nicht so richtig.
Wenn ich mir zum Beispiel die Datei -Image_EAlogo.h- ansehe, dann ist 
sie als Feld mit 176 Zeilen zu je 33 Spalten aufgebaut, also
33 Spalten zu 1 Byte x 176 Zeilen  = 5,8kB.
Auf S.21 wird zwar ein Speicherbedarf von 11,6kB angegeben, aber dies 
gilt m.E.für 2 Bilder (vorhergehendes/ neues Bild)

> Du musst die festen Bilddaten ausschließlich im Flash ablegen.
Wie ist das gemeint? Was ist der Flash?
Ich kenne z.Zt. den Arbeitspeicher (RAM) und den Programmspeicher. Bei 
dem MSP430F1611 gibt es noch einen nichtflüchtigen Speicherbereich, wo 
man Daten ablegen kann. (nur 2kB)
Es sollen  bei meiner Anwendung keine Bilddaten fest abgelegt werden.
Wie oben schon mal gesagt, soll (kontinuierlich) eine EKG-Kurve 
dargestellt werden. Dazu wird alle 10ms ein Spannungswert (Y-Wert) 
gemessen.
Dass dies nicht ganz unmöglich ist, zeigt ein Beispiel unter 
https://www.youtube.com/watch?v=enzUbiSWenQ  (2,6"), wobei hier 
allerdings die Abtastzeit bedeutend höher gewählt wurde.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> landet komplett im RAM des Controllers, und das wird einfach zu viel
>> sein. macht bei 176x33 = 5.8kB * 2 >10kB und dein MSP hat nur 10kB!
>> Du musst die festen Bilddaten ausschließlich im Flash ablegen.
> Die Berechnung verstehe ich noch nicht so richtig.
> Wenn ich mir zum Beispiel die Datei -Image_EAlogo.h- ansehe, dann ist
> sie als Feld mit 176 Zeilen zu je 33 Spalten aufgebaut, also
> 33 Spalten zu 1 Byte x 176 Zeilen  = 5,8kB.
> Auf S.21 wird zwar ein Speicherbedarf von 11,6kB angegeben, aber dies
> gilt m.E.für 2 Bilder (vorhergehendes/ neues Bild)
Die 11.6 aus dem Datenblatt kommen sicher daher das, wie wir ja 
inzwischen wissen, 2Bit pro Pixel übertragen werden.
In deinem Programm hast du ein Array mit den Daten definiert und ein 
zweites leeres mit der selben Größe, der Speicherplatz wird dafür im RAM 
aber trotzdem reserviert.
Eigentlich sollte der Compiler auch eine Warnung ausgeben.

>> Du musst die festen Bilddaten ausschließlich im Flash ablegen.
> Wie ist das gemeint? Was ist der Flash?
> Ich kenne z.Zt. den Arbeitspeicher (RAM) und den Programmspeicher.
Der Programmspeicher ist der Flash,
In C sollte das dann const char progmem heißen, beschäftige dich dazu 
mal mit C

> Bei dem MSP430F1611 gibt es noch einen nichtflüchtigen Speicherbereich, wo
> man Daten ablegen kann. (nur 2kB)
Das ist dann EEProm
> Es sollen  bei meiner Anwendung keine Bilddaten fest abgelegt werden.
> Wie oben schon mal gesagt, soll (kontinuierlich) eine EKG-Kurve
> dargestellt werden. Dazu wird alle 10ms ein Spannungswert (Y-Wert)
> gemessen.
das ist schon Ok, Aufgrund der verschachtelten Bitzuordnung wirst du die 
Bilddaten aber sicher im RAM puffern müssen.

Sascha

von Wolle G. (wolleg)


Lesenswert?

Sascha W. schrieb:
> In C sollte das dann const char progmem heißen, beschäftige dich dazu
> mal mit C

Ich habe den Eindruck, dass --progmem-- etwas AVR-Spezifisches sein 
könnte.
Gibt es noch andere Möglichkeiten?

von Gogo (Gast)


Lesenswert?

Jim M. schrieb:
> wolle g. schrieb:
>> Einige Fragen: a) Was ist z.B. mit 1 hoch st, 33 hoch rd  und 44 hoch th
>> gemeint?
>
> Das der OP seinen Englisch Grundkurs wiederholen muss. Ohne diese
> Grundlagen ist das Verständnis eines Datenblatts nicht möglich.

+1

von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> In C sollte das dann const char progmem heißen, beschäftige dich dazu
>> mal mit C
>
> Ich habe den Eindruck, dass --progmem-- etwas AVR-Spezifisches sein
> könnte.
dafür kenne ich mich weder mit C noch dem MSP ausreichend aus, aber 
prinzipiell sollte es sowas eigentlich bei allen Architekturen geben bei 
denen das Programm aus einem separaten Speicher und nicht aus dem RAM 
ausgeführt wird.

> Gibt es noch andere Möglichkeiten?
Nein, aber für deine Anwendung ist das ja erst mal kein Problem wenn du 
keine vollformatigen statischen Bilddaten ablegen willst.
Dein Speicher reicht ja um den kompletten Bildinhalt im RAM vorzuhalten 
(mit 1Bit pro Pixel), bei der Ausgabe an das Display musst du halt jeden 
Bildpunkt entsprechend auf die 2Bit umrechnen.

Sascha

von Nosnibor (Gast)


Lesenswert?

wolle g. schrieb:
> Ich habe den Eindruck, dass --progmem-- etwas AVR-Spezifisches sein
> könnte.
> Gibt es noch andere Möglichkeiten?

Da der MSP430 einen gemeinsamen Adressraum für Programm und Daten hat, 
sollte const char reichen. Wenn der Compiler nicht vollkommen 
bescheuert ist, läßt er das Bild dann im Programmspeicher liegen und 
belegt keinen RAM dafür.

von Wolle G. (wolleg)


Lesenswert?

Nosnibor schrieb:
> Wenn der Compiler nicht vollkommen
> bescheuert ist, läßt er das Bild dann im Programmspeicher liegen und
> belegt keinen RAM dafür.

Der Compiler ist nicht bescheuert.
Jetzt bleibt der µC erst einmal nicht mehr hängen.
Am "Rest" kann ich jetzt weiter arbeiten. Danke

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

Den "Rest" habe ich Angriff genommen, komme aber nicht so richtig 
weiter.
Jetzt hängt es zunächst  an der Zeilenauswahl (bzw. Linienauswahl)
Ich beschreibe erst einmal, wie ich den im Anhang dargestellten 
Programmabschnitt dargestellt habe und wie ich das Flussdiagramm 
gedeutet habe
Zunächst wird SPI (0A, 00) gesendet.
Dann werden die ersten 33 ungeraden  4-fach  Bildpunkte (je 1 Byte) 
gesendet.
Dann folgen insgesamt 44 scan-Byte, wodurch entweder die Zeilen (auch 
Linien) ein- oder ausschaltbar sind.
Danach kommen wieder 33 gerade 4-fach Bildpunkte (je 1 Byte).
Das wiederholt sich 44 mal (176 Linien/4 = 44 Zeilen )
Damit ist das e-Papier 176x264 bei mir voll.
Was mache ich falsch?
Ich will ja jeden einzelnen Bildpunkt darstellen können, d.h. ich muss 
die 4 Linien, die sich in einer Zeile befinden irgendwie einzeln 
ansprechen.
nächstes Problem: Von dem Feld der Datei: Bild_EAlogo5_44x33.h wird 
immer nur die 1. Zeile ausgelesen bzw. in den Zeilen dargestellt.
Wie könnte man das Problem lösen? bzw. was ist an meinem Gedankengang 
falsch?
Hoffentlich habe ich mich ausreichend verständlich ausgedrückt.

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Zunächst wird SPI (0A, 00) gesendet.
> Dann werden die ersten 33 ungeraden  4-fach  Bildpunkte (je 1 Byte)
> gesendet.
Ja

> Dann folgen insgesamt 44 scan-Byte, wodurch entweder die Zeilen (auch
> Linien) ein- oder ausschaltbar sind.
Jain, mit den 44Byte wählst du aus in welche Zeilen die 2x 33Byte 
übernommen werden.
Das schein als eine Art Kompression der Übertragung gedacht zu sein du 
kannst so das komplette Display oder einen beliebigen rechteckigen 
Bereich in einem Durchlauf löschen.

> Danach kommen wieder 33 gerade 4-fach Bildpunkte (je 1 Byte).
> Das wiederholt sich 44 mal (176 Linien/4 = 44 Zeilen )
wenn jede Zeile was anderes enthalten soll brauchst du 176 Durchläufe

> Damit ist das e-Papier 176x264 bei mir voll.
wenn das Display schon nach 44 Durchläufen voll ist hast du die Zeilen 
nicht einzeln ausgewählt.

> Was mache ich falsch?
> Ich will ja jeden einzelnen Bildpunkt darstellen können, d.h. ich muss
> die 4 Linien, die sich in einer Zeile befinden irgendwie einzeln
> ansprechen.
abhängig davon in welche der in einem Byte zusammengefassten 4 Zeilen du 
schreiben willst musst du 0xC0, 0x30, 0x0C oder 0x03 senden

> nächstes Problem: Von dem Feld der Datei: Bild_EAlogo5_44x33.h wird
> immer nur die 1. Zeile ausgelesen bzw. in den Zeilen dargestellt.
d.h. in allen Zeilen dargestellt? Das liegt einfach daran das du mit 44x 
0xff dem Display in jedem Durchlauf sagst das es die gerade 
angelieferten Pixel in alle Zeilen übernehmen soll

Prinzipiell könnte man eine Funktion schreiben die ein einzelnes Pixel 
setzt oder löscht, das wird natürlich sehr ineffizient.
**X-Koordinate
*Bit 0 entscheidet darüber ob die Daten für das Pixel im ersten oder im 
zweiten Block übertragen werden (gerade/ungerade)
*Bit 2+1 entscheiden über die Position der Pixelbits innerhalb des Bytes
*Bit 7-3 entscheiden über das Byte in welches die Daten müssen
Die Farbe des Pixels gibt den Zustand der Pixelbits vor
**Y-Koordinate
*Bit 1+0 entscheiden über die Position der Zeilenbits innerhalb des 
Bytes
*Bit 7-2 entscheiden über das Byte in welches die Bits müssen

Wenn du ein Diagramm oder Schrift zeichnen willst wird es effizienter 
den betroffenen rechteckigen Bereich im RAM mit 1Bit/Pixel zu puffern, 
dort hineinzuzeichnen und den Bereich dann komplett an das Display 
auszugeben. Die rechnerei s.o. brauchst du natürlich trotzdem.

Sascha

: Bearbeitet durch User
von Wolle G. (wolleg)


Lesenswert?

Sascha W. schrieb:
> Prinzipiell könnte man eine Funktion schreiben die ein einzelnes Pixel
> setzt oder löscht, das wird natürlich sehr ineffizient.
so ähnlich mache ich es ja bei einem "normalen" LCD. Aber da muss man 
nicht ein ganzes Bild schreiben, sondern das geht hier punktweise.

"Neue" Idee (für mich), um einzelne Linien zu berechnen:
Rest (Modulo) aus Division berechnen.
Z.Zt. nur Idee. Beispiel:

48/4 = 12 Rest 0 -->  Zeile 12 Linie 1
50/4 = 12 Rest 2 -->  Zeile 12 Linie 3
51/4 = 12 Rest 3 -->  Zeile 12 Linie 4
52/4 = 13 Rest 0 -->  Zeile 13 Linie 1

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> Prinzipiell könnte man eine Funktion schreiben die ein einzelnes Pixel
>> setzt oder löscht, das wird natürlich sehr ineffizient.
> so ähnlich mache ich es ja bei einem "normalen" LCD. Aber da muss man
> nicht ein ganzes Bild schreiben, sondern das geht hier punktweise.
das ganze Bild auch nicht, aber eine Zeile, und der Transfer ans Display 
macht halt 110 Datenbytes.
> "Neue" Idee (für mich), um einzelne Linien zu berechnen:
> Rest (Modulo) aus Division berechnen.
> Z.Zt. nur Idee. Beispiel:
>
> 48/4 = 12 Rest 0 -->  Zeile 12 Linie 1
> 50/4 = 12 Rest 2 -->  Zeile 12 Linie 3
> 51/4 = 12 Rest 3 -->  Zeile 12 Linie 4
> 52/4 = 13 Rest 0 -->  Zeile 13 Linie 1
ja, deine "Zeile" ist dann das Byte (von den 44) und die "Linie" dann 
die beiden Bits in dem Byte
Rest 0 => 0xc0
Rest 1 => 0x30
Rest 2 => 0x0c
Rest 3 => 0x03
für die Reihenfolge will ich jetzt mal nicht die Hand ins Feuer legen - 
hab jetzt nicht noch mal im DB nachgeschaut.

Sascha

: Bearbeitet durch User
von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

Ich kann zwar z. Zt. jede beliebige Zeile oder auch Linie als schwarzen 
Balken darstellen, aber etwas bildähnliches wird es nicht, da es immer 
nur bei einem  Balken (Zeile)  bleibt.
Ich habe mal die Anzahl der Zeilen (Variable i, ursprünglich 176 Linien) 
auf 44 festgelegt, um dadurch nur bei vollständigen Zeilen  (0xFF) 
bleiben zu können.
Da i von 0 bis 43 durchläuft, hatte ich gedacht, dass ab  Zeile 5 alle 
Zeilen schwarz werden.
Ab Zeile 6 bleibt die Fläche aber weiß.
Was könnte falsch sein?
Oder hat jemand ein funktionierendes Beispiel?
Im Anhang mein Programmschnipsel

von Sascha W. (sascha-w)


Angehängte Dateien:

Lesenswert?

wolle g. schrieb:
> Ich kann zwar z. Zt. jede beliebige Zeile oder auch Linie als schwarzen
> Balken darstellen, aber etwas bildähnliches wird es nicht, da es immer
> nur bei einem  Balken (Zeile)  bleibt.
> Ich habe mal die Anzahl der Zeilen (Variable i, ursprünglich 176 Linien)
> auf 44 festgelegt, um dadurch nur bei vollständigen Zeilen  (0xFF)
> bleiben zu können.
> Da i von 0 bis 43 durchläuft, hatte ich gedacht, dass ab  Zeile 5 alle
> Zeilen schwarz werden.
> Ab Zeile 6 bleibt die Fläche aber weiß.
> Was könnte falsch sein?
> Oder hat jemand ein funktionierendes Beispiel?
> Im Anhang mein Programmschnipsel
in der PDF hab ich mal mit Excel nachgestellt was du an das Display 
ausgibst.
Wie du siehst kann das so nicht funktionieren. Erstens beschreibst du 
viele Zeilen doppelt und Zweitens ist die Anzahl der gesendeten Bytes 
für die Zeilen nur 1x 44Byte!

versuch das mal so ...
1
;Zeile zu Linedata
2
int Zeile;
3
4
for (i=0;i<(Zeile>>2);i++) SPI_8Bit_oCS(0x00);//volle 4 Zeilen zuvor
5
SPI_8Bit_oCS(0x03<<((Zeile & 0x03)<<1));
6
for (i=0;i<43-(Zeile>>2);i++) SPI_8Bit_oCS(0x00);//volle 4 Zeilen danach

das hier sollt eine schräges Muster aus 4 Linien (10101010) erzeugen
1
int Zeile,sp,i,cnt;
2
cnt=0;
3
for(Zeile=0;Zeile<176;Zeile++) {
4
  //ungerade 
5
  for(sp=0;sp<33;sp++) {
6
    if (cnt==sp) {
7
      SPI_8Bit_oCS(0xff);
8
    } else {
9
      SPI_8Bit_oCS(0x00);
10
    }
11
  }
12
  for (i=0;i<(Zeile>>2);i++) SPI_8Bit_oCS(0x00);
13
  SPI_8Bit_oCS(0x03<<((Zeile & 0x03)<<1));
14
  for (i=0;i<43-(Zeile>>2);i++) SPI_8Bit_oCS(0x00);
15
  //gerade
16
  for(sp=0;sp<33;sp++) {
17
    SPI_8Bit_oCS(0x00);
18
  }
19
  cnt++;
20
  if (cnt>32) cnt=0;
21
}



Sascha

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

Mist, da habe ich doch die falsche Datei angehängt.
Danke für Deinen Entwurf. Den werde ich natürlich mal testen.
Trotzdem im Anhang mal die ursprünglich gedachte Datei, damit man sehen 
kann, was ich gemeint hatte.

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

@Sascha,
das "schräge Muster aus 4 Linien" habe ich getestet. Leider wird nicht 
das gewünschte Muster dargestellt.
Nach dem -loeschen();- (alles weiß) und dem dann folgenden 
-schreiben_sw1();- kann man nur rechts unten in Linie 1 ein Muster mit 4 
Punkten sehen. Der Abstand zwischen den Punkten beträgt 1 Bildpunkt.
1. Punkt von rechts nach links gesehen, könnte Punkt (1, 264) sein. Alle 
weiteren Linien und Zeilen bleiben weiß.
im Anhang die verwendeten Funktionen mit den zusätzlichen Ergänzungen.

Natürlich kann hier auch jede(r) andere mitmischen.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

innerhalb der Zeilenschleife muss natürlich noch das 0x0a,0x00 am Anfang 
und 0x02,0x07 am Ende rein.

Sascha

von Wolle G. (wolleg)


Lesenswert?

Sascha W. schrieb:
> innerhalb der Zeilenschleife muss natürlich noch das 0x0a,0x00 am Anfang
> und 0x02,0x07 am Ende rein.
Beides habe ich doch bereits schon vor dem Test eingefügt.
siehe Anhang

von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> innerhalb der Zeilenschleife muss natürlich noch das 0x0a,0x00 am Anfang
>> und 0x02,0x07 am Ende rein.
> Beides habe ich doch bereits schon vor dem Test eingefügt.
> siehe Anhang
nö, der Start ist vor der Zeilenschleife und das Ende ist innerhalb, 
aber auch noch an der falschen Stelle (darf nicht in der if-Abfrage 
sein).

Siehe Flowchart auf Seite 29,
der Tranfer beginnt für jede Zeile mit dem CMD 0x0A,0x00 
(Displaydaten) und endet für jede Zeile mit dem CMD 0x02,0x07 
(Übernahme der gesendeten Daten)


Sascha

von Wolle G. (wolleg)


Lesenswert?

Sascha W. schrieb:
> nö, der Start ist vor der Zeilenschleife und das Ende ist innerhalb,
> aber auch noch an der falschen Stelle (darf nicht in der if-Abfrage
> sein).

Klasse!  das schräge Muster ist jetzt zu sehen; nur noch etwas blass
Danke!
Das Ende war m. E. richtig.
Jetzt muss ich mir das Ganze noch einmal in Ruhe ansehen, damit ich mal 
eines Tages meine EKG-Kurve darstellen kann.

von Sascha W. (sascha-w)


Lesenswert?

wolle g. schrieb:
> Sascha W. schrieb:
>> nö, der Start ist vor der Zeilenschleife und das Ende ist innerhalb,
>> aber auch noch an der falschen Stelle (darf nicht in der if-Abfrage
>> sein).
>
> Klasse!  das schräge Muster ist jetzt zu sehen; nur noch etwas blass
> Danke!
Na bestens
> Das Ende war m. E. richtig.
Ja hast recht, die if hat ja gar keinen Codeblock

Sascha

von Wolle G. (wolleg)


Angehängte Dateien:

Lesenswert?

So, jetzt bin ich (fast) mit meinem EKG-Gerät bei Verwendung eines 
Pervasive Display fertig.
Kurze Erläuterung:
Die EKG-Kurve wird auf einem e-Papier E2271CS021 abgebildet. Dass die 
Kurve fortlaufend, wie ursprünglich das Ziel war, dargestellt wird, ist 
mir nicht gelungen. Der EKG-Eingangsverstärker ADS1293 wird alle 7ms 
abgefragt. Von dem 24BIT Messwert wird nur das mittlere Byte 
verarbeitet, da es nur
176 Zeilen x 263 Bildpunkte gibt. Es erfolgt eine Nulllageregelung über 
den gleitenden Mittelwert. Die Bildpunkte werden in einem Feld [33][176] 
= (33 Spalten je 8Bit und 176 Zeilen) im Arbeitsspeicher abgelegt und 
danach mit der Funktion „schreiben_zum_E2271“ als gesamtes Bild zum 
Bildschirm E2271 übertragen. Vorher wird der Bildschirm gelöscht (alles 
weiß)
Im Anhang für evtl. Interessierte das Programm eines Programmierlaien.

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.