OLED RS0010 library Arduino

  • Moin

    mich nervte etwas, dass an meinem SWR Abschätzteil das Display aus unerfindlichen Verarmungswahngründen ohne Beleuchtung gekauft wurde ... und hab mir jetzt ein neues bestellt. Leider nicht richtig hingeschaut und ein OLES 2x16 Modul mit einem Controller RS0010 besorgt (Raystar RS0010 16x2bl EH1602A Rev J), der natürlich über kein library für den Arduino verfügt, das adafruit library zu einer gleichmässigen schwarzen Färbung führt (soll angeblich funktionieren), wohingegen das standardmäßige LiquidCrystal library den Text anzeigt, aber lustig munter hin und her springt und lustige Zeichen dazwischen produziert.

    Leider scheint bei dem Teil keine I2C oder SPI Schnittstelle vorhanden zu sein und nur 4 oder 8 bit Übertragung möglich ist.


    Hat jemand ne schlaue Idee. Ich bin für das Teil definitiv zu doof.

  • Hallo,

    wo genau ist jetzt Dein Problem ?. Ich habe mir das Datenblatt nicht angesehen aber ich gehe davon aus, dass diese Displays parallel angesteuert werden.

    Über einen Anschluss wird zwischen Code Register und Daten Register umgeschaltet und dann ein Byte oder 2 4-Bit Nibbles übertragen.

    Such mal nach "Arduino 4 bit display". Ich kann Dir auch ein paar C Code Zeilen zukommen lassen wenn Du nicht weiterkommst.


    73

    Rainer

  • Moin Rainer

    das Problem scheint in der Initialisierung des OLED Displays zu liegen, deshalb springt die Anzeige und produziert merkwürdige Zeichen. Irgendwie gibt es da wohl keine wirklich sinnvolle Lösung. Eine Möglichkeit soll sein die Initialisierung Arduino OLED zu separieren, dafür gibt es ein Library nebst Schaltbild, leider hab ich keinen entsprechenden MOS Fet zur Hand.

    Ansonsten ist das Display eine ziemliche Enttäuschung, angegeben von Raystar ist es mit SPI Schnittstelle ... soweit so gut, nur ist selbige nicht dokumentiert. Für das Display gibt es seitenlange Erörterungen wie daneben es ist, das mit einem Arduino zu verbinden zu wollen nebst "kleinen" Ungenauigkeiten zwischen Beschreibung des HErstellers zur Realität des gebauten Teils (Beispiel SPI Schnittstelle)

    Naja, ich habe das Teil nicht in der Bucht für 2 Teurofünfzig bestellt, sondern bei einem Händler, von dem ich eigentlich glaubte, er würde keinen Schrott verkaufen, wobei in seinem Katalog das Ding auch nur mit OLED 16x2bl beschrieben ist und ich positiv davon ausgegangen bin, dass Händler ein Produkt verkauft was auch mit seinen anderen Produkten wie Arduino etc irgendwie kompatibel zu machen ist ... Naja. Werd das nächste mal in Berlin mal wieder in das Ladengeschäft gehen und das ausdiskutieren.

  • Hallo,

    hast Du den genauen Typ ?

    Wenn es dieses hier ist , das wird parallel angesteuert (Hitachi HD44780 kompatibel), siehe LiquidCrystall- Library.

    73

    Heribert

  • hm Heribert

    ja, den hab ich, wobei statt C am Ende, ein A.


    Der HD44780 wird als nahezu kompatibel angegeben ... eben halt nur nahezu. Funktionierte leider nicht.


    Ich hab jetzt die LiquidCrystal etwas modifiziert (stammt nicht von mir, sondern copy and past ...) und der Text springt nicht mehr. Soweit so fein, allerdings blinkt es im Takt des eingestellten delays, was etwas nervt. Läßt man das delay weg, blinkt es heftigst schnell.

  • Das "blinken" könnte man als LCD -> ClrScreen() in deinem Programm finden.


    Ich habe so einige HD44780 kompatible Libs unter und für LunaAVR programmiert, sowie auch den WS0010 Chip mit verschieden Schnittstellen (3) verwendet.

    Der WS0010 hat eine spezielle Initialisierung, die man unbedingt einhalten muss. Auch ist ein Soft-Reset über eine erneute Initialisierung des Chips ist nicht einfach.

    Erst das genaue lesen diverser Datenblätter brachte eine Lösung.

    73 de Uwe
    DC5PI

    Einmal editiert, zuletzt von DC5PI ()

  • yep Uwe,

    liegt am clear screen und die spezielle Initialisierung ist das "kleine" Problem, wobei ich, wie gesagt, zu doof dazu war das selber hin zu bekommen und mir nur copy and paste was brachte. Zu dem Soft-Reset, der wird in einem Vorschlag mit einem Mos Fet gelöst, siehe hier: https://github.com/rimksky/WinstarOLED


    Zu dem "blinken" werde die Ausgabe in eine Schleife packen, die nur dann geändert wird, wenn sich VSWR ändert, ansonsten halt die Ausgabe konstant halten.

  • Hi,


    ich mache das Schreiben von neuen Werten so: Angenommen die Ausgabe hat max. 6 Zeichenplatz, dann lösche ich diesem Bereich erst durch Ausgabe von 6 Leerzeichen (Space) anschließend, wird das Datum formatiert ausgegeben. So entstehen keine "ghost" Zeichen im LCD.

    73 de Uwe
    DC5PI

  • Hi Uwe,

    ausprobiert, geklappt, für gut befunden, lass ich so ;)


    Gruß

    Peter

  • Hallo Peter,


    ich versuche noch eine Methode des LCD Updates zu beschreiben.


    Angenommen den LCD hat 2 Zeilen * 16 Zeichen = 32 Zeichen und das Programm läuft im 1ms Zeitintervall.

    Das bedeute jeder Thread wird genau alle 1ms ausgeführt.


    Neu: ein Thread ist der LCD Update, er arbeitet laufend und gibt nacheinander (alle 1ms) ein Zeichen aus.

    Die Zeichen stehen im SRAM und bilden das LCD virtuell im SRAM, hier 2 Zeilen x 16 Zeichen, ab.


    Diese sind als Array mit 2 Zeilen x 16 Spalten als vLCD(x,y) organisiert und auf diese ist der Zugriff sehr einfach.


    Alle LCD Ausgaben über ein Programm erfolgen dann nur noch in das virtuelle LCD!


    Über ein LCD Update muss man sich keine Gedanken mehr machen, denn 32 ms sind alle Zeichen ausgegeben.

    Auch ist für das normale Schreiben eines Zeichen auf das reale LCD keine Wartezeit mehr einzuhalten, das sind i.A. ca 50µs, da das nächste Zeichen im diesem Beispiel erst nach weiteren 1ms erfolgt.


    Wie dargestellt, schreiben die neue LCD Ausgaberoutinen nur noch in das SRAM und das erfolgt immer mit maximaler Geschwindigkeit.


    Einige LCD Funktionen, wie .SetCursor(y,x), .ClearScreen() oder .Home() werden einfach Simuliert und schreiben weiterhin nun noch in das SRAM LCD_virtuell(x,y).


    .SetCursor(y_new,x_new) verändert den Schreibzeigervektor (x_current,y_current) = (x_new, y_new)

    .ClearScreen() schreibt 0x20 in alle Speicherzellen und verändert den Schreibzeigervektor (x,y) nicht.

    .Home() hingegen ruft .ClearScreen() auf und verändert den Schreibzeigervektor (x_current,y_current)=(0,0).


    Beim Schreiben der Zeichen vom SRAM auf das LCD, muss man nur die Überläufe der Zeilen- und Spaltenadressierung beachten.

    Zeile: x E {0,..,15} und Spalte: y E {0,1}


    Anm.: Pseudo C.


    Bsp. Vektorschreibweise:

    byte x_write = 0, y_write = 0;

    byte x_read= 0, y_read = 0;


    set_Cursor(y, x) {

    x_write = x;

    y_write = y;

    }


    write_vLCD(ch) {

    vLCD(x_write, y_write) = ch;

    if(++ x_write > 15) {

    x_write = 0;

    if (++ y_write > 1) {

    y_write = 0;

    }

    }

    }


    byte read_vLCD() {

    byte ch;

    ch = vLCD(x_read, y_read);

    if(++ x_read > 15) {

    x_read = 0;


    if (++ y_read > 1) {

    y_read = 0;

    }

    }

    return ch;

    }


    write_to_LCD(y, x, ch) {

    LCD.setCurosr(y, x);

    LCD.writeChar_noWait( ch );

    }

    Ein Mensch kann maximal 3 - 4 LCD Updates pro Sekunden wahrnehmen, also 333 ms bis 250 ms für den gesamten LCD Inhalt.

    73 de Uwe
    DC5PI