4インチ 800x480ピクセル 液晶ディスプレイ DUEで目指せ最速 ついに改造個所の登場 

 

 前回で、4インチ液晶ディスプレイとArduino DUEをつないで表示させたが、性能が劣るはずのArduino MEGA2560で繋いだ時と変わらない速度であった。 その理由も前回に書いた。

 

 

 今回は、この液晶ディスプレイとArduino DUEとのつなぎ方を変えて最速を目指そうという企画。 方法は2.5インチ液晶ディスプレイの時と同じで、最適な配線にすること。

ただ、ノーマルのDUEでは最速を目指せないので、今回は私キャッスルが自ら改造したDUEを使っている。 DUEの改造については以前書いているので、そちらを見てもらいたい。

 

 

まずは配線だが、下図のとおりに配線する。 データ線は16本あるので大変だし間違えやすいが、頑張って接続してくれい。

 

 

 「なにが改造DUEだよ。 そんなもん持ってねーよ。 改造したくねーよ。」という人も一定数いるかもしれない。 もし万が一ノーマルDUEでやりたいという人がいたら、最速ではなくなるが下図のとおりに接続するとよい。

 

 

 そしてプログラムだが、改造DUEノーマルDUEとで若干プログラムを変える必要があるので、例によってLcd_Write_Bus関数の中でどちらかを選択してもらいたい。

void Lcd_Write_Bus(unsigned int d)
{
//**Arduino 改造DUE ではこちらを使用**//
  REG_PIOC_ODSR = d << 2;             //
////////////////////////////////////////

//**Arduino ノーマルDUE ではこちらを使用**//////////////////
  REG_PIOC_ODSR = (d << 2 & 0x3fc) | (d << 4 & 0xff000);  //
////////////////////////////////////////////////////////////

  REG_PIOA_CODR = 1 <<  16;
  REG_PIOA_SODR = 1 <<  16;
}

void Lcd_Write_Com(unsigned int VH)  
{   
  REG_PIOA_CODR = 1 <<  24;
  Lcd_Write_Bus(VH);
}

void Lcd_Write_Data(unsigned int VH)
{
  REG_PIOA_SODR = 1 <<  24;
  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)
{
  digitalWrite(A3, HIGH);
  delay(10); 
  digitalWrite(A3, LOW);
  delay(100);
  digitalWrite(A3, HIGH);
  delay(50);

  digitalWrite(A2, HIGH);
  digitalWrite(A0, HIGH);
  digitalWrite(A2, LOW);
  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;
  REG_PIOA_CODR = 1 <<  23;

  l = l + x;
  Address_set(x, y, l, y);
  j = l * 2;
  for(i = 1; i <= j; i++)
    Lcd_Write_Data(c);
  REG_PIOA_SODR = 1 <<  23;
}

void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c)                   
{	
  unsigned int i, j;
  REG_PIOA_CODR = 1 <<  23;

  l = l + y;
  Address_set(x, y, x, l);
  j = l * 2;
  for(i = 1; i <= j; i++)
    Lcd_Write_Data(c);
  REG_PIOA_SODR = 1 <<  23;
}

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;
  REG_PIOA_CODR = 1 <<  23;

  Address_set(0, 0, 479, 799);
  for(i = 0; i < 480; i++)
    for(m = 0; m < 800; m++)
      Lcd_Write_Data(j);
  REG_PIOA_SODR = 1 <<  23;
}

void setup()
{
  Serial.begin(9600);

  REG_PIOC_PER = 0x000ffffc;
  REG_PIOC_OER = 0x000ffffc;

  REG_PIOA_PER  = 0x01c10040;
  REG_PIOA_OER  = 0x01c10040;
  REG_PIOA_SODR = 0x01c10040;

  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);
}

 実行すると、Arduino DUEボードに直差しの時は6秒であったが、改造DUEボードにつなぎ直したら、1.8秒になった。 約3倍速くなった。 2.4インチディスプレイの時は1秒切る速さだったが、さすがに5倍広いディスプレイだとこんなもんなのかな。

 

 ノーマルDUEではどうなるかだが、改造DUEでは1.8秒であったが、ノーマルでは1.85秒・・・。 えっ・・・

こんなん誤差の範囲じゃん。

 

改造した意味・・・・・・。

(心の中で何かが折れた気がした)