秋月のSG12232モジュールユニットを作りました。奥のメモリモジュールのスロッ
トにはまっているのがそれ。テストルーチンもそこそこ動いていそうだけど、
致命的な問題があり、これから考え直しです。
このモジュールはRES#(Low Active。いつもはHighでLowになるとリセット)と、 RES(High Active。いつもはLowでHighになるとリセット)を、そのエッジで 認識して、内部インターフェースを80系と68系でスイッチできる。
この80系というののシグナルタイミングを見ると、RAMのシグナルタイミング、 WE#とOE#と同じ使われ方だ。
ということで、
LCDのコマンド受け付けタイミングはLCDのクロックによるので、連続アクセスには 1usecのdelayが必要。
こうすると、CS6#の一本だけで済むというのにひかれて実装してみた。
タイミング的にはバスコントローラでも駆動できることがわかってこれはラッキー。これでI/Oポートが11本浮いた。

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

このモジュールは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(コマンド/データの切り替え)に。
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。ちょっ と皮膜の溶けがつらい。

