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
unsignedcharPic1[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
unsignedcharPic1_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
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.
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
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
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
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
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
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
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.
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?
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)
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?
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);
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.
@ 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.
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