Forum: Mikrocontroller und Digitale Elektronik Block Transfer Engine RA8875


von Lisa (Gast)


Lesenswert?

Hallo,

ich beschäftige mich mit der Block Transfer Engine des RA8875 Display 
Controllers.

Es ist ein Beispiel gegeben, dass ein schwarz-weiss Bild (also 1 Bit 
konvertiert) in den Speicher schreibt und via BTE auf einer anderen 
Position auf dem Display wieder ausgibt:

Das sieht im Code wie folgt aus:
1
unsigned char Pic1[1500];
2
3
        BTE_Source(0,0,0,0);//BTE starting Position
4
        BTE_Size(120,100);//BTE size Setting
5
        Write_Dir(BTE_FUNCTION_CON1,0x78);//
6
        Write_Dir(BTE_FUNCTION_CON0,0x80);//BET open
7
        Chk_Busy();
8
        LCD_CmdWrite(0x02);//start write data
9
        for(i=0;i<1500;i++)
10
         {
11
            LCD_DataWrite(Pic1[i]);
12
            Chk_Busy();
13
          }
14
         Chk_BTE_Busy();
15
        delay_millis(200);
16
17
18
        //////////BTE color expansion moves
19
        BTE_Source(0,300,0,80);//BTE starting position
20
        BTE_Size(120,100);//BTE size setting
21
        Write_Dir(BTE_FUNCTION_CON1,0xC2);  
22
        Write_Dir(BTE_FUNCTION_CON0,0x80);      //BET open
23
        delay_millis(200);

Es handelt sich hierbei um ein 120x100 Pixel Bild, welches an der 
Position 0,0 angezeigt wird und dann nochmal via BTE an der Position 
300,80.
Dies funktioniert auch soweit.

Jetzt habe ich dasselbe Bild mit 16 Bit konvertiert (also ebenfalls 120 
x 100 Pixel) und bekomme ein Array der Form:
1
unsigned char Pic1_16[24000]; 
2
3
...
4
5
for(i=0;i<24000;i++)
6
         {
7
            LCD_DataWrite(Pic1_16[i]);
8
            Chk_Busy();
9
          }
10
...

Es kommt jedoch nichts sinnvolles heraus.
Jemand eine Idee woran dies liegen könnte?
MFG

von Philipp K. (philipp_k59)


Lesenswert?

Ich habe mich zwar nie direkt mit BTE befasst.. Wechselst Du da zwischen 
1bit mit Color Expansion und 16bit? Im Ram sollten beide Bilder 15bit 
BRG liegen(oder wie das auch immer war), vielleicht fehlt da ein 
Registerwechsel der Sourcequelle auf 15/16Bit.

Wäre schön wenn Du mal die Register hinter Deinen Vars aufschreiben 
würdest.

: Bearbeitet durch User
von Lisa (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Philip, vielen Dank für deine Antwort.

Es wird in dem Register 0x51 (BTE_FUNCTION_CON1) tatsächlich zwischen 
dem 65K Colors Mode und dem 256 Colors Mode umgestellt (siehe Anhang):

So ganz blicke ich leider immer noch nicht durch. Wenn ich jetzt ein 16 
Bit Bild via BTE anzeigen möchte sollte ich vermutlich den 65K Modus 
wählen. Die Beschreibungen der Register aus dem Datasheet habe ich 
angehangen. Es könnte also wirklich sein, dass ich noch auf 16 Bit 
umstellen muss. So ganz verstehe ich aber nicht wie ich das realisieren 
soll. Vermutlich muss dieses ja für das Schreiben, als auch für das 
Lesen gelten?

Die Größen in der Funktion BTE_Size(120,100); muss ich dann nicht 
verändern, weil ich ja nicht die Pixelgrößte des BMPs verändere, sondern 
nur die Farbtiefe. Freue mich über jeglichen Input.


Gruss
1
BTE_Source(0,0,0,0);//BTE starting Position
2
BTE_Size(120,100);//BTE size Setting -> 120x100 Pixel Bild
3
Write_Dir(BTE_FUNCTION_CON1,0x78);//BTE Function Control Register1: Raster setting -> 0b01111000: Bit[7:4] = 0b0111: ~S+~D or ~ ( S?D ) // Bits [3:0] = 0b1000 -> Color Expansion
4
Write_Dir(BTE_FUNCTION_CON0,0x80);//BET open: BTE Function Control Register 0
5
Chk_Busy();
6
        LCD_CmdWrite(0x02);//start write data
7
    for(i=0;i<1500;i++)
8
     {
9
            LCD_DataWrite(Pic1[i]);
10
            Chk_Busy();
11
      }
12
     Chk_BTE_Busy();
13
        delay_millis(200);
14
BTE_Source(0,300,0,80);//BTE starting Position
15
BTE_Size(120,100);//BTE size Setting
16
Write_Dir(BTE_FUNCTION_CON1,0xC2);  // 0b11000000 -> Bit[7:4] = 0b1100: -> Destination Data = Source Data ; Bits [3:0] = 0010b -> Move BTE in positive direction with ROP
17
    Write_Dir(BTE_FUNCTION_CON0,0x80);      //BET open
18
        delay_millis(200);

von Philipp K. (philipp_k59)


Angehängte Dateien:

Lesenswert?

Hm.. ich musste um 65K Bilder in den ram zu schieben diese mit einem 
extra von Ralink bereitgestellten Tool umwandeln.. Du hast das ja 
R5bit-B6bit-G5bit Bit pro Pixel also im Prinzip 16bit und nicht mehr 
1bit oder 1byte pro Pixel. das heisst das Array müsste dann ja größer 
sein.. ungefähr 120*100*2 Byte. Check nochmal die Farbdaten.

Glaub muss auch mal mit BTE anfangen sonst ist der 8875 echt nicht auf 
voller Leistung :D

von Lisa (Gast)


Lesenswert?

Hallo Philipp,
wiederum recht Herzlichen Dank für deine Nachricht.
Mit der BTE habe ich mittlerweile hinbekommen, zumindest ne reine 
Verschiebung eines Bildes nach rechts.

Hast Du dich denn schon genauer mit dem DMA beschäftigt? Bzw. hast Du 
ein Beuspiel wie Du in den DMA schreiben kannst? Wenn ich das richtig 
verstanden habe ist im Sample Code ja nur ein Beispiel gegeben wie man 
aus diesem liest und ein Bild anzeigt. Dies sieht ja in etwa so aus:
1
Write_Dir(FLASH_ROM_CLK,0X00);                          // FLASH frequency setting -> 0xb: SFCL frequency = System clock frequency
2
    Write_Dir(FLASH_ROM_CONFIG,0X87);                       // 0x87 = 0b10000111 -> Bit 7: 1-> SerialFlash/ROM1 selected; Bit 4-3: 0b01 -> 1 Byte dummy cycle; Bit 2: 0b1 -> DMA mode; Bit 1-0: 0b11 -> Dual Mode 1
3
    DMA_Block_mode();                                       // DMA Block Mode
4
    Active_Window(0,479,0,271);                             // 1.
5
    MemoryWrite_Position(0,0);                              // 1.
6
DMA_Start_address_setting(261120*(3-0));                // 3. DMA Start address setting
7
    DMA_block_mode_size_setting(480,272,480);               // 4., 5., 6.
8
DMA_Start_enable();
9
            LCD_CmdWrite(0x02);
10
            for(i=0;i<130560;i++)
11
            {
12
                LCD_DataWrite(logo_480x272[i] >> 8);
13
                Chk_Busy();                                                 // hier SHORT
14
                LCD_DataWrite(logo_480x272[i]);
15
                Chk_Busy();
16
            }
17
    Chk_DMA_Busy();

Falls Du ein Beispiel hast, wie man sauber 65K Bilder in den RAM 
schieben und aus diesem wieder lesen kannst wäre ich sehr dankbar.

von Philipp K. (philipp_k59)


Lesenswert?

Hallo Lisa,

ich mache das mit DMA weil ich im moment wegen Kabelsalat nur SPI 
benutze.
The only source of DMA function in RA8875 is external serial Flash/ROM 
interface. Wegen BTE werd ich wohl mal 20 Kabel mehr anschliessen.

Das heisst ich habe einen Flashrom von Winbond und hinterlege für meine 
Menüs gut durchdacht alle Bilder um diese dann via DMA direkt in den 
Speicher zu laden.. so versuche ich die langsame SPI Übertragung zu 
umgehen.. ich habe das Projekt gerade auf Eis.

Ich habe vor einiger Zeit für die Thematik Flashen und Löten eine kleine 
Anleitung geschrieben(Einfach ein Adapter gebastelt, siehe Bild):
http://huntingforbeer.de/shortener1.php

von Lisa (Gast)


Lesenswert?

Hallo Philipp,

Ok vielen Dank. Jetzt habe ich es verstanden.

1. In Flash EEPROM Bilder hinterlegen
2. Dann diese vie DMA in den Speicher laden.

Wie gesagt hätte ich nicht gedacht, dass Punkt 1. so umständlich sein 
wird.
Danke nochmals

von Philipp K. (philipp_k59)


Lesenswert?

Hallo Lisa, dachte eigentlich bisher BTE mit 8080 Schnittstelle wäre 
unschlagbar, da bräuchte man doch keinen anderen SchnickSchnack mehr?

Zu BTE war mir noch beim lesen des Datasheets aufgefallen das bei einer 
Schnittstelle mit 6800 nur 256 Farben und 8080 erst Operationen in 65K 
unterstützt.

von Lisa (Gast)


Lesenswert?

Hallo,

ich nutze zur Ansteuerung des RA8875 das 3 Wire SPI Interface. Im System 
Configuration Register stelle ich dann eine Farbtiefe von 16 Bit mit 65k 
Colors ein.

Mir sind die Vor- und Nachteile von BTE und Bilder aus dem RAM anzeigen 
noch nicht ganz klar. Wie gesagt kann ich mit BTE ein Bild in der Achse 
verschieben und sozusagen "klonen", d.h. ich zeichen es 1mal und kann 
dann dasselbe Bild direkt wieder an einer anderen Position anzeigen.
Dies ist interessant, wenn ich z.B. eine "Lautstärkereglung" etc. auf 
dem Display visualisieren will.

Per DMA kann ich die Bilder in dem Speicher ja so ablegen, dass ich Sie 
mir jederzeit direkt auf dem Display anzeigen lassen kann.

So wie ich es bis jetzt verstanden habe sollte es also nicht heisen 
Entweder Oder, sondern am besten beides realisieren?

von Philipp K. (philipp_k59)


Lesenswert?

War ein Denkfehler von mir..

Ich habe noch einen Chip früheren Produktdatum der BTE nur mit 8080/6800 
Schnittstelle unterstützt, also nur mit SPI kein BTE.
Einen großen Performance zuwachs der 8080 gegenüber dem SPI soll man 
nicht erwarten.

Laut Datasheet soll man zB in Layer1 aus dem Flash befüllen und via BTE 
in Layer 2 verschieben können.. ich habe noch einige klassen aus dem 
STM32 Beispiel von RAIO selbst zum AVR übersetzt das man auch komplett 
verschiedene Bildrößen aus dem Flash laden kann.. in manchen Libs 
funktioniert nichtmal die Funktion ein Vollbild zu laden. Bin da noch am 
Libs und Funktionen mischen. Die gibt es ja von Adafruit und sumotoy. 
(Fand  ich erst nachdem ich schon das meiste übertragen hatte)

von Philipp K. (philipp_k59)


Lesenswert?

Hätte noch einen Winbond 4MB für 2€ inkl. Versand abzugeben.

von Lisa (Gast)


Lesenswert?

Philipp K. schrieb:
> Bildrößen aus dem Flash laden kann.. in manchen Libs
> funktioniert nichtmal

Danke sehr, bin aber schon gut versorgt.

Habe mir jetzt einen Brenner für das EEPROM besorgt und Bilder aus dem 
Flash via DMA anzuzeigen funktioniert soweit, zumindest wenn due Bilder 
über Alle Pixel gehen. Kannst du mal zeigen, wie du es realisiert hast, 
dass verschiedene Bildgrößen angezeigt werden können?

von Philipp K. (philipp_k59)


Angehängte Dateien:

Lesenswert?

Haste bestimmt schon selbst gelöst.. ich hatte nach Deinem letzten Post 
die Lib benutzt und nix klappte mehr..

Heute rausgekramt und siehe da es funzt wieder!

Hab mal die ergänzte Adafruit Lib mit den DMA Funktionen angehängt.. bei 
width kann es sein das Du 1 abziehen musst.. ich steig durch den alten 
Code selbst nicht mehr durch. (Zu lang drangesessen)

tft.dispicown(StartX,StartY, width,height,StartbyteFlash);

von Philipp K. (philipp_k59)


Lesenswert?

Falls noch interesse besteht habe den code heute noch optimiert und der 
läuft immer besser.

https://www.youtube.com/watch?v=IOPwEN2-QFo

von Falk B. (falk)


Lesenswert?

Dieses Video ist privat.

von Philipp K. (philipp_k59)


Lesenswert?

Autsch Danke, gleich erledigt.

von Falk B. (falk)


Lesenswert?

Für den Anfang OK, aber wie wäre es mit weichem, pixelweisem Scrolling?

von Philipp K. (philipp_k59)


Lesenswert?

Falk Brunner schrieb:
> Für den Anfang OK, aber wie wäre es mit weichem, pixelweisem Scrolling?

Joa, eigentlich ist das nicht das Prinzip des DMA-Transfers würde so 
aussehen und ist ohne ein Delay mit 12 Zeichen immer wieder neu aus dem 
Flash gezeichnet.
https://www.youtube.com/watch?v=_Qeb4vZvz7c

Wie oben schonmal erwähnt müsste man mal ausprobieren mit den DMA-Daten 
in einen unsichtbaren Layer zu schreiben und das dann mit BTE 
rüberkopieren oder die echte Scroll-Funktion zu nutzen.

Mir geht es eigentlich darum kleine wie große Bildbereiche ohne Flackern 
für  eine "graphische" Oberfläche zu füllen um zB eine Wetterstation zu 
designen. Im moment versuche ich noch kleinigkeiten mit Transparenz.

von Falk B. (falk)


Lesenswert?

@ Philipp K. (philipp_k59)

>> Für den Anfang OK, aber wie wäre es mit weichem, pixelweisem Scrolling?

>Joa, eigentlich ist das nicht das Prinzip des DMA-Transfers würde so
>aussehen und ist ohne ein Delay mit 12 Zeichen immer wieder neu aus dem
>Flash gezeichnet.
>Youtube-Video "Ra8875 lauftext"

Ahhhhh, das ist ja mal schön, so wie früher auf dem Amiga 8-0

Jetz nur noch die richtige Richtung und die kleinen Bugs rausmachen.

von Philipp K. (philipp_k59)


Lesenswert?

Habe es endlich geschafft die Sachen die Laufen müssen unter den Libs zu 
tauschen und anzupassen.. die funktionieren ja alle nicht wirklich.

Erinnert mich an eine C64 Demo!

https://www.youtube.com/watch?v=3Kj4yj5m_5E

von Falk B. (falk)


Lesenswert?

TOP!

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.