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連続ポートを使用するには若干の問題があって、それは次回書こうと思う。