Jump to content

Midibox 128 V3 2x ST7920 Display


Keksdose_Stefan
 Share

Recommended Posts

Hallo, ich suche nach einem Treiber für meine Midibox 128.

Ich besitze 2 Displays mit einem ST7920 Controller.

(DATA-VISION14032 Display)

Sie haben eine Auflösung von 140 x 32 Pixel und bieten Text und Grafikmodus.

Die Textausgabe läuft einwandfrei.

Wechsel des Displays über MIOS32_LCD_DeviceSet(xXx);

Aber will ich Grafik ausgeben mit dem Befehl BitmapPrint, kommt da leider nichts sinnvolles.

Habe schon die verfügbaren Treiber durchgetestet, bei manchen kommt wildes Zeug auf dem Bildschirm an.

Allerdings dann auch nur der erste.

lcdbitmap1 = MIOS32_LCD_BitmapInit(bitmap_array, 140, 32, 140, 1);

lcdwerte.lcd_type=MIOS32_LCD_TYPE_GLCD_SSD1306 ; <war der letzte Type den ich getestet habe

lcdwerte.num_x=18;

lcdwerte.num_y=2;

lcdwerte.width=140;

lcdwerte.height=32;

lcdwerte.colour_depth=1;

MIOS32_LCD_DeviceSet(0);

MIOS32_LCD_ParametersSet (lcdwerte);

MIOS32_LCD_DeviceSet(1);

MIOS32_LCD_ParametersSet (lcdwerte);

Ausgabe:

MIOS32_LCD_DeviceSet(0); //LCD 1

MIOS32_LCD_GCursorSet(0, 0);

MIOS32_LCD_CursorSet(0, 0);

//for (i=0; i<560; ++i) MIOS32_LCD_BitmapPixelSet(lcdbitmap1,i,i>5,1);

for (i=0; i<560; ++i) bitmap_array=85; //Fülle Bild mit 01010101 Muster.

MIOS32_LCD_BitmapPrint(lcdbitmap1);

MIOS32_LCD_DeviceSet(1); // LCD 2

MIOS32_LCD_GCursorSet(0, 0);

MIOS32_LCD_CursorSet(0, 0);

MIOS32_LCD_BitmapPrint(lcdbitmap1);

Aber ich brauche jetzt einen LCD Treiber für ST7920.

Mfg Stefan.

Mein Projekt besteht aus: 1 x LPC1769, 4 x DOUT, 4 x DIN, 1 x AINSER 64, 2 x LCD.

Edited by Keksdose_Stefan
Link to comment
Share on other sites

Hallo,

schoenes Projekt, unbedingt veroeffentlichen sobald es fertig ist! :)

Ich habe mal in das Datenblatt reingeschaut (http://www.crystalfontz.com/controllers/ST7920.pdf)

Es gibt schonmal keinen GLCD Treiber, den Du hier wiederverwenden koenntest.

Das Protokoll ist zum "CLCD" kompatibel (MIOS32_LCD_TYPE_CLCD), und es gibt einen "Extended Mode", mit dem die Grafikfunktionen freigeschaltet werden.

Die entsprechenden Kommandos (die Du aus dem Datasheet entnimmst) lassen sich mit APP_LCD_Cmd() absetzen.

Mit APP_LCD_Data() schreibst Du dann in das Display-RAM

So koenntest Du erstmal herausfinden, ob die Freischaltung des Grafikmodus funktioniert.

In das Display-RAM wuerde ich erstmal ein Muster reinschreiben, bspw.:


APP_LCD_Data(0x01);
APP_LCD_Data(0x02);
APP_LCD_Data(0x04);
APP_LCD_Data(0x08);
APP_LCD_Data(0x10);
APP_LCD_Data(0x20);
APP_LCD_Data(0x40);
APP_LCD_Data(0x80);
[/code]

so kannst Du bei der Gelegenheit auch gleich die Bildschirm-Orientierung (vertikal oder horizontal) ermitteln - und sobald das klar ist, kann ich Dir sagen, welche GLCD-Routinen sich wiederverwenden lassen (bzw. ich koennte Dir dann mal schnell einen neuen GLCD Typ einrichten)

Gruss, Thorsten.

Link to comment
Share on other sites

Also mit APP_LCD_CMD(54) geht Grafik an

APP_LCD_CMD(128+Y);

APP_LCD_CMD(128+X);

APP_LCD_DATA(BilddatenByte);APP_LCD_DATA(BilddatenByte);APP_LCD_DATA(BilddatenByte);APP_LCD_DATA(BilddatenByte);

er fängt dann wieder links an wenn er rechts raus geht aber in der gleichen Reihe

also muß man dann immer neu setzen wenn man tiefer zeichnen will

APP_LCD_Cmd(54); // Grafikmodus

for (y=0; y<32; ++y) // Y=32 Pixel

{

APP_LCD_Cmd(128+y);

APP_LCD_Cmd(128);

for (i=0; i<18; ++i) //X=140 Pixel/8=17,5

{

APP_LCD_Data(bitmap_array);

b++;

}

}

APP_LCD_Cmd(48);/Textmdous

MIOS32_LCD_CursorSet(0, 0);

MIOS32_LCD_PrintFormattedString("Stefan");

Dieser Code gibt die Grafik aus und schreibt meinen Text darüber.

Edited by Keksdose_Stefan
Link to comment
Share on other sites

Machst Du bitte mal ein Foto vom Display wenn folgendes Muster ausgegeben wird:


APP_LCD_Data(0x01);
APP_LCD_Data(0x02);
APP_LCD_Data(0x04);
APP_LCD_Data(0x08);
APP_LCD_Data(0x10);
APP_LCD_Data(0x20);
APP_LCD_Data(0x40);
APP_LCD_Data(0x80);[/code]

So kann ich mir besser vorstellen, wie das Display funktioniert.

Gruss, Thorsten.

Link to comment
Share on other sites

post-10919-0-00987500-1337673791_thumb.j

for (y=0; y<32; ++y)

{

APP_LCD_Cmd(128+y);

APP_LCD_Cmd(128);

APP_LCD_Data(0x01);

APP_LCD_Data(0x02);

APP_LCD_Data(0x04);

APP_LCD_Data(0x08);

APP_LCD_Data(0x10);

APP_LCD_Data(0x20);

APP_LCD_Data(0x40);

APP_LCD_Data(0x80);

}

post-10919-0-08600100-1337673799_thumb.j

APP_LCD_Cmd(128);

APP_LCD_Cmd(128);

APP_LCD_Data(0x01);

APP_LCD_Data(0x02);

APP_LCD_Data(0x04);

APP_LCD_Data(0x08);

APP_LCD_Data(0x10);

APP_LCD_Data(0x20);

APP_LCD_Data(0x40);

APP_LCD_Data(0x80);

post-10919-0-19815300-1337673806_thumb.j

APP_LCD_Cmd(128);

APP_LCD_Cmd(128);

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

{

APP_LCD_Data(0x01);

APP_LCD_Data(0x02);

APP_LCD_Data(0x04);

APP_LCD_Data(0x08);

APP_LCD_Data(0x10);

APP_LCD_Data(0x20);

APP_LCD_Data(0x40);

APP_LCD_Data(0x80);

}

post-10919-0-46107500-1337673812_thumb.j

for (y=0; y<32; ++y)

{

APP_LCD_Cmd(128+y);

APP_LCD_Cmd(128);

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

{

APP_LCD_Data(0x01);

APP_LCD_Data(0x02);

APP_LCD_Data(0x04);

APP_LCD_Data(0x08);

APP_LCD_Data(0x10);

APP_LCD_Data(0x20);

APP_LCD_Data(0x40);

APP_LCD_Data(0x80);

}

}

Am Anfang muß man nur

APP_LCD_CMD(54) schreiben um Grafikdmodus anschhalten

wenn man sendet

APP_LCD_CMD(48) kann man wieder Texte schreiben.

Bild und Text verschmelzen dann.

Also Grafik und Text bleiben auf dem Bildschirm erhalten.

Per Midibefehl kann ich jetzt Grafik und Text übertragen und ausgeben.

Edited by Keksdose_Stefan
Link to comment
Share on other sites

Coole Sache!

Pollin.de bietet die Displays übrigens für 2.95€ an! :-)

http://www.pollin.de...n_DG_14032.html

Bezüglich der Ausgabe laut Datenblatt werden immer 2 Bytes = 16 Pixel an die aktuelle Adresse geschrieben, wenn Du mal

int x, y;

for (y = 0; y < 32;  y++)

{

   APP_LCD_Cmd(128+y);


   for (x = 0; x < 18; x++)

   {

      APP_LCD_Data(0xFF);

      APP_LCD_Data(0xFF);

   }

}

machst, solltest Du einen "vollen" Screen bekommen, richtig? :-)

Ciao und viele Grüße!

Peter

Edited by Hawkeye
Link to comment
Share on other sites

Ich frage mich wie man die Grafikausgabe noch beschleunigen kann

für ein Bild sind ca. 1000 Midibefehle nötig.

Ich weiß jetzt nur noch nicht woran es liegt.

Midi Protokoll zu langsam, bin ja mit USB verbunden, sollte doch 100 mal schneller sein.

Grafik an sich wenn ich es direkt mache geht ja sehr schnell.

Wenn es nicht anders geht versuche ich die Grafiken so gut wie möglich schon in das Projekt mit reinzuspeichern,

so das ich sie dann aufrufen kann und ich möglichst wenig Miditransfer habe für die Displays.

Dann ist mir noch wichtig zu wissen wie ich die Specialchars erzeuge und wie ich sie ausgeben kann, bzw. welchen Ascii Code sie haben.

Edited by Keksdose_Stefan
Link to comment
Share on other sites

Du hast vergessen, die Vorgeschichte zu erwaehnen - warum und wie moechtest Du das Display ueber MIDI bedienen?

So koennte ich Dir genauere Tips geben.

Deshalb erstmal nur ein allgemeiner Hinweis: dein Rechner bremst die Transfers aus wenn zuviele MIDI Events aufeinmal generiert werden, deshalb ist es ratsam, die Display-Befehle zu streamen.

Wenn Du bspw. den Display-Inhalt in wenige Sysex-Befehle verpackst, dafuer aber wesentlich mehr Bytes pro SysEx Kommando versendest, sollte der Update ziemlich flott gehen.

Unter http://svnmios.midibox.org/listing.php?repname=svn.mios32&path=%2Ftrunk%2Fapps%2Ftutorials%2F025_sysex_and_eeprom%2F findest Du ein Beispiel, wie eingehende SysEx-Streams verarbeitet werden koennen (siehe sysex.c).

Das EEPROM-Geraffel kannst Du aus dem Code entfernen, dann wird er wesentlich uebersichtlicher.

Grundsaetzlich wuerde ich empfehlen, nicht mehr wie 512 Bytes in einen Stream zu packen, da groessere Datenmengen vor allem unter Windows (und hier speziell WinXP) manchmal zu Problemen fuehren.

Ausserdem musst Du dann noch beachten, dass in der Payload nur 7-bit Daten erlaubt sind. Deshalb ist es ratsam, die Bytes nibbleweise (untere/obere 4 bit) zu uebertragen.

Auch das wird im Tutorial gezeigt (SYSEX_FORMAT == 1)

Spezialzeichen werden mit APP_LCD_SpecialCharInit() initialisiert, und mit ASCII Code 0..7 ausgegeben (es sind also nur 8 vorhanden).

Die werden nur von CLCDs unterstuetzt.

Im Graphik-Modus muesstest Du die Zeichen direkt ausgeben, wie bspw. ueber die APP_LCD_BitmapPrint() Funktion

Dieser Modus wuerde Dir dann auch weiterhelfen, groessere Bild-Fragmente im Core zu speichern, und ueber einen speziellen SysEx-Befehl zu platzieren.

Gruss, Thorsten.

Link to comment
Share on other sites

Uebetraegst Du nun einzelne MIDI Events oder SysEx Streams?

Mit welchem Programm werden sie gesendet, welches Betriebssystem, welche Updaterate wird angestrebt?

Ohne diese Angaben ist es wirklich schwierig, Dir weiterzuhelfen...

Gruss, Thorsten.

Link to comment
Share on other sites

Noch mache ich es per Midi Events.

Ich steuere mein Gerät über Delphi und auch Blitz Basic 3D.

Mein Gerät ist eigentlich eine DJ Console.

ich kann es mal grob erklären.

Mit dem Gerät habe ich die Möglichkeit:

- 4 Decks direkt anzusteuern

- 2 Touchsensitive Jogwheels (capazitiv) + Beleuchtung (32 Leds die den ungefähren Drehstatus anzeigen)

- Patterneditor mit 16x8 LEDs ( sind mit 24 Tasten ansteuerbar 8 Reihe 16 Spalte)

- eingebaute (The Maschine)

- 33 Encoder (inklusive Tastfunktion)

- 16 Touchsensitive Tasten (capazitiv) ich nenne sie Hotpads

- 2 Displays

- Sampleplayer

- fast alle Tasten sind mit Leds bestückt

- 2 Helligkeitssensoren

- zusätzlich noch Beleuchtung mit warmweißen Ledstripsegmenten am Gerät

Alle Ausgänge sind mit Transistoren versehen.

Ich habe mal eine alte Konzeptgrafik hinzugefügt.

Warscheinlich werde ich 10 Fader statt 5 verwenden.

Zum Thema Grafik, ich möchte einfach alle Möglichkeiten ausschöpfen, die es gibt.

Die Sysex schaue ich mir noch an, scheint aber einfach zu sein.

Mit Hilfe eines virtuellen Midi Treibers kann ich die Console auch mit mehreren Programmen gleichzeitig betreiben.

Achso ich verwende Windwos 7 Ultimate 64 Bit.

post-10919-0-85157600-1337846675_thumb.j

post-10919-0-36797000-1337847456_thumb.j

post-10919-0-30177500-1337849404_thumb.j

post-10919-0-18655100-1337850651_thumb.j

post-10919-0-25247900-1337850658_thumb.j

post-10919-0-36165900-1337850665_thumb.j

post-10919-0-69190400-1337850671_thumb.j

Edited by Keksdose_Stefan
Link to comment
Share on other sites

Danke fuer die Hintergrundinformationen!

Die Hardware sieht ja schonmal ziemlich gut aus! :thumbsup:

Ein Tip zum Thema "virtueller MIDI Treiber": der wird zu einer zusaetzlichen Latenz sorgen, die man umgehen koennte, indem USB fuer mehrere MIDI Ports konfiguriert wird.

Einfach folgendes in Dein mios32_config.h File einbauen:


#define MIOS32_USB_MIDI_NUM_PORTS 4
[/code]

kompilieren, aufladen, und danach den USB Stecker raus, und wieder reinstecken.

Anschliessend sollten unter Windows 4 getrennte Ein- und Ausgaenge sichtbar sein.

Evtl. wirst Du auf den USB MIDI Bug von Win7 stossen, der sich jedoch mit dem Korg USB Treiber umgehen laesst:

Fuer mich waere es interessant zu wissen, ob sich die Performance mit diesem Treiber verbessert (auch wenn Du noch nicht auf SysEx umgestiegen bist)

Gruss, Thorsten.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...