081211

|



秋月のSG12232モジュールユニットを作りました。奥のメモリモジュールのスロッ
トにはまっているのがそれ。テストルーチンもそこそこ動いていそうだけど、
致命的な問題があり、これから考え直しです。

このモジュールはRES#(Low Active。いつもはHighでLowになるとリセット)と、 RES(High Active。いつもはLowでHighになるとリセット)を、そのエッジで 認識して、内部インターフェースを80系と68系でスイッチできる。
この80系というののシグナルタイミングを見ると、RAMのシグナルタイミング、 WE#とOE#と同じ使われ方だ。
ということで、
  • H8のRES#を74HC14(シュミットトリガ インバータ。シュミットじゃなくていいんだけど、ボタンのと共用で)で反転させてLCDのRESに。
  • H8のHWR#をLCDのWR#に
  • H8のRD#をLCDのRD#に
  • このLCDはH8のエリア6につなげるとして、CS6#とA0をORして(74HC32)LCDの CS2に。
  • CS6#とA1をORしてLCDのCS1に。(このLCDは左右で二つのコントローラが 入っているので、それぞれのチップイネーブル)
  • H8のA2をLCDのA0(コマンド/データの切り替え)に。
と、つなげてH8のバスコントローラで動かしてみました。3ステート、3ウェイトで。
LCDのコマンド受け付けタイミングはLCDのクロックによるので、連続アクセスには 1usecのdelayが必要。
こうすると、CS6#の一本だけで済むというのにひかれて実装してみた。
void
extlcd_area_init (int area)
{
  uint8_t r = 1 << area;

  *BSC_CSCR |= r; // enable CS#
  *BSC_ABWCR |= r; // 8bit access (data bus: D8-D15)
  *BSC_ASTCR |= r; // 3-state access
  *BSC_WCER |= r; // enable wait state controler
  *BSC_WCR = 3; // programmable wait mode. 3 wait state.
}

inline void
lcd_write (volatile uint8_t *addr, uint8_t data)
{
  *addr = data;
  delay (2);
}

void
extram_init ()
{
#define	MDCR	(volatile uint8_t *)0xffff1
  extlcd_area_init (6);

  // Set address line (A0-A19) output.
  P1->DDR = 0xff;
  P2->DDR = 0xff;
  P5->DDR = 0xff;
  //P5->DDR = 0x01;//use A16 only. A17-A19 are I/O port.

  delay (100000);
  SCI_PRINTF ("hello world. mode=%x\n", *MDCR);
#define	LCD_DATA_0	((volatile uint8_t *)0xc0005)
#define	LCD_DATA_1	((volatile uint8_t *)0xc0006)
#define	LCD_DATA_BOTH	((volatile uint8_t *)0xc0004)
#define	LCD_CMD_0	((volatile uint8_t *)0xc0001)
#define	LCD_CMD_1	((volatile uint8_t *)0xc0002)
#define	LCD_CMD_BOTH	((volatile uint8_t *)0xc0000)

  lcd_write (LCD_CMD_BOTH, 0xe2);//reset
  lcd_write (LCD_CMD_BOTH, 0xaf); // display on

  int i, j;
  uint8_t d;
  for (j = 0; j < 4; j++)
    {
      lcd_write (LCD_CMD_BOTH, 0xb8 | j); // set page;
      lcd_write (LCD_CMD_BOTH, 0); // column 0;
      for (i = 0, d = 1; i < 80; i++, d <<= 1)
	{
	  lcd_write (LCD_DATA_BOTH, d);
	  if (d == 0x80)
	    d = 1;
	}
    }

  SCI_PRINTF ("sleep.\n");
  while (/*CONSTCOND*/1)
    asm volatile ("sleep");
}
これがLCD_DATA_0、LCD_DATA_1がまったく効かずに、LCD_DATA_BOTH(A0,A1、両方ともLowで、LCDの2つのモジュールに同時にCSがかかる)しか効かないんだ。
タイミング的にはバスコントローラでも駆動できることがわかってこれはラッキー。これでI/Oポートが11本浮いた。

LCDモジュールの配線。一見綺麗っぽいけど、モジュールの上に線を乗せ過ぎて しまうと、困った時にとても困ってしまう。橙色のデータラインは外側から 迂回すべきだった。
だんだんコツがわかってきました。まず一方をハンダ付けして、ピンセットで きっちり曲げて、ギリギリでカット。一度上にひっぱりあげて、ピンセットで 押さえながら、皮剥きしてハンダメッキして、ピンセットでつかんでハンダ付 け。ピンセット使ってみたらかなり作業効率があがった。
ジュンフロン線は僕は0.4m/mが一番調子いい感じ。緑のラインは0.32m/m。ちょっ と皮膜の溶けがつらい。