RMC-RA4M1の実力が知れるか?
それでは早速、RMC-RA4M1(rev.2.0)マイコンボードと4.0インチ16bitデータ転送方式TFT液晶ディスプレイを繋いで、どれくらいのスピードで描画できるか実験してみようと思う。
今回の記事は続き物なので、意味がわからない人は最初から読んでもらうとよくわかると思う。
Arduino UNO R4 MINIMAの互換機、RMC-RA4M1(rev.2.0)マイコンボードとはなんぞや、と思った人は、ここから読んでもらうとよいだろう。
RMC-RA4M1と液晶ディスプレイの接続は、もちろん何度も言ってる16bit連続ポートを使うわけだが、この16bit連続ポートは二つ存在する。
P1端子群と、P4端子群の二つだ。
どちらを使ってもいいので、接続図とプログラムはどちらとも掲載することにした。
まずは接続図だが、従来のArduino UNOに搭載されているポートの場合は、ポート番号で書いている。
RMC-RA4M1に新しく搭載されたポートを使う場合は、Arduino IDEにてポート番号も定義されてはいるが全く馴染みがないので、基板上のコネクタ名とピン番号を表記している。
次にプログラムだが、P1端子群使用とP4端子群使用では若干違うので、Lcd_Write_Bus関数の中とsetup関数の中で切り替えられるようにしてある。 使わない方をコメントアウトしてほしい。
あと、とある理由によってシリアルモニターを開かないとプログラムが進まないようにしてあるので、プログラムを実行したらシリアルモニターを開くこと。
この理由は次回にでも。
void Lcd_Write_Bus(unsigned int d) { //**RMC-RA4M1の P1 端子群を使用する場合はこちらを使用**// R_PORT1->PODR = d; // ///////////////////////////////////////////////////////// //**RMC-RA4M1の P4 端子群を使用する場合はこちらを使用**// R_PORT4->PODR = d; // ///////////////////////////////////////////////////////// R_PORT0->PODR_b.PODR14 = 0; R_PORT0->PODR_b.PODR14 = 1; } void Lcd_Write_Com(unsigned int VH) { R_PORT0->PODR_b.PODR0 = 0; Lcd_Write_Bus(VH); } void Lcd_Write_Data(unsigned int VH) { R_PORT0->PODR_b.PODR0 = 1; Lcd_Write_Bus(VH); } void Lcd_Write_Com_Data(unsigned int com,unsigned int dat) { Lcd_Write_Com(com); Lcd_Write_Data(dat); } void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) { Lcd_Write_Com(0x2a00); Lcd_Write_Data(x1>>8); Lcd_Write_Com(0x2a01); Lcd_Write_Data(x1); Lcd_Write_Com(0x2a02); Lcd_Write_Data(x2>>8); Lcd_Write_Com(0x2a03); Lcd_Write_Data(x2); Lcd_Write_Com(0x2b00); Lcd_Write_Data(y1>>8); Lcd_Write_Com(0x2b01); Lcd_Write_Data(y1); Lcd_Write_Com(0x2b02); Lcd_Write_Data(y2>>8); Lcd_Write_Com(0x2b03); Lcd_Write_Data(y2); Lcd_Write_Com(0x2c00); } void Lcd_Init(void) { R_PORT0->PODR_b.PODR2 = 1; delay(10); R_PORT0->PODR_b.PODR2 = 0; delay(100); R_PORT0->PODR_b.PODR2 = 1; delay(50); R_PORT0->PODR_b.PODR1 = 1; R_PORT0->PODR_b.PODR14 = 1; R_PORT0->PODR_b.PODR1 = 0; delay(50); Lcd_Write_Com(0x2800); Lcd_Write_Com(0x3600); Lcd_Write_Data(0x00); Lcd_Write_Com(0x3a00); Lcd_Write_Data(0x55); Lcd_Write_Com(0x1100); delay(120); Lcd_Write_Com(0x2900); } void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i,j; R_PORT0->PODR_b.PODR1 = 0; l = l + x; Address_set(x, y, l, y); j = l * 2; for(i = 1; i <= j; i++) Lcd_Write_Data(c); R_PORT0->PODR_b.PODR1 = 1; } void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i,j; R_PORT0->PODR_b.PODR1 = 0; l = l + y; Address_set(x, y, x, l); j = l * 2; for(i = 1; i <= j; i++) Lcd_Write_Data(c); R_PORT0->PODR_b.PODR1 = 1; } void Rect(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c) { H_line(x , y , w, c); H_line(x , y+h, w, c); V_line(x , y , h, c); V_line(x+w, y , h, c); } void LCD_Clear(unsigned int j) { unsigned int i, m; R_PORT0->PODR_b.PODR1 = 0; Address_set(0, 0, 479, 799); for(i = 0; i < 480; i++) for(m = 0; m < 800; m++) Lcd_Write_Data(j); R_PORT0->PODR_b.PODR1 = 1; } void setup() { Serial.begin(9600); while (!Serial); R_PORT0->PDR |= 0x4007; //**RMC-RA4M1の P1 端子群を使用する場合はこちらを使用**// R_PORT1->PDR |= 0xffff; // R_PFS->PORT[1].PIN[8].PmnPFS_b.PMR = 0; // R_PFS->PORT[1].PIN[9].PmnPFS_b.PMR = 0; // R_PFS->PORT[1].PIN[10].PmnPFS_b.PMR = 0; // ///////////////////////////////////////////////////////// //**RMC-RA4M1の P4 端子群を使用する場合はこちらを使用**// R_PORT4->PDR |= 0xffff; // R_PFS->PORT[4].PIN[7].PmnPFS_b.PMR = 0; // ///////////////////////////////////////////////////////// R_PORT0->PODR_b.PODR14 = 1; R_PORT0->PODR_b.PODR0 = 1; R_PORT0->PODR_b.PODR1 = 1; R_PORT0->PODR_b.PODR2 = 1; Lcd_Init(); } void loop() { unsigned long start = micros(); LCD_Clear(0xFFFF); LCD_Clear(0x0000); LCD_Clear(0xf800); LCD_Clear(0x07E0); LCD_Clear(0x001F); for(int i = 0; i < 300; i++) Rect(random(400), random(400), random(800), random(800), random(65535)); Serial.println(micros() - start); }
このプログラムをRMC-R4M1で実行すると、1ループ処理が終わるのに約2.54秒という結果に。
えええええ、まさかの3秒切り。 しかも大幅に。
前回の記事で私キャッスルの予想は約3.5秒。 どうやっても3秒は切らないだろうと思っていた。 だが結果はまさかの予想以上のスピード。
やはり16bit連続ポートってすごいんだな。
RMC-R4M1マイコンボードの底力を見た気がする。 マジで買ってよかった。
だが、この16bit連続ポートを使用するには若干の問題があって、それは次回書こうと思う。