PW160128LCD設定編 [MSP430]
例のパラレル/シリアルインタフェースを持つ、16階調グレースケール 160×128ピクセルLCDの設定を幾つかいじってみました。
![]() |
まずこれは、昨日作成したBMP変換ツールで出力したデータをそのまま転送した物。 この状態を正常としますね。 |
![]() |
初期化コマンドの一部を変更するだけで、画面を上下反対にできます。 |
![]() |
これまた初期化コマンドの一部を変更するだけで、ネガにもできます。 |
よくできておりますね。
※コントラストについて。
コントラストは電源電圧に大きく依存します。初期化コマンドの一部にboostが有るのですが、これでLCDコントラスト電圧をどれ位発生するのかを決める事ができます。
勿論発生電圧が高い方がコントラストが大きくなるのですが、このLCDを3V程度で動作させる時は×4で動かしています。
さて、SPYBIWIREで動かすと、電源電圧が3.6Vとなってしまい(既に定格オーバーと言う話も)、SPYBIWIREで動かした設定を電池駆動に適用するとコントラストが小さく、よく見えません。
boostをいじると極端にコントラストが変ってしまうので、biasをいじる方が良さそうです。
以下に初期化コードを書いてみます。
//ソフトウエアリセット
SPI_Write( CMD_MODE, 0xf0 ); //bank0
SPI_Write( CMD_MODE, 0x81 ); //software reset
ms_wait( 50 ); //50ms待ちに入る
//EM65101のEEPROMからの読み出し
SPI_Write( CMD_MODE, 0xf2 ); //bank2
SPI_Write( CMD_MODE, 0x53 ); //read extension command
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
SPI_Write( CMD_MODE, 0x52 ); //read extension command
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
SPI_Write( CMD_MODE, 0x51 ); //read EEPROM CV5~CV4
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
SPI_Write( CMD_MODE, 0x50 ); //read EEPROM CV3~CV0
SPI_Write( CMD_MODE, 0x00 ); //read data from EEPROM
us10_wait(); //10μsのソフトウエアwait
us10_wait(); //10μsのソフトウエアwait
SPI_Write( CMD_MODE, 0x06 ); //finish reading data from EEPROM
//EM65101のパラメータ設定
SPI_Write( CMD_MODE, 0xf0 ); //bank0
// SPI_Write( CMD_MODE, 0xb5 ); //booster=6x
SPI_Write( CMD_MODE, 0xb3 ); //booster=4x
SPI_Write( CMD_MODE, 0x8a ); //power circuit ON
SPI_Write( CMD_MODE, 0xc8 ); //1/12 bias(電源電圧が3.6Vの時のバイアス)
// SPI_Write( CMD_MODE, 0xc6 ); //1/12 bias(電源電圧が3Vの時のバイアス)
SPI_Write( CMD_MODE, 0xa8 ); //128duty
SPI_Write( CMD_MODE, 0x90 ); //128duty
SPI_Write( CMD_MODE, 0x73 ); //X,Y address auto increment
SPI_Write( CMD_MODE, 0x00 ); //Start X address = 00
SPI_Write( CMD_MODE, 0x10 ); //Start X address = 00
SPI_Write( CMD_MODE, 0x20 ); //Start Y address = 00
// SPI_Write( CMD_MODE, 0x51 ); //Display ON(倒置)
SPI_Write( CMD_MODE, 0x59 ); //Display ON(通常)
SPI_Write( CMD_MODE, 0x69 ); //REV=1,REF=1(ネガ)
// SPI_Write( CMD_MODE, 0x60 ); //REV=0,REF=0(ポジ)
SPI_Write( CMD_MODE, 0xf1 ); //bank1
SPI_Write( CMD_MODE, 0x23 ); //Contrast value=0x3a
SPI_Write( CMD_MODE, 0x1a ); //Contrast value=0x3a
SPI_Write( CMD_MODE, 0x40 ); //OSC = 1x
SPI_Write( CMD_MODE, 0x58 ); //Booster frequency = 6KHz
SPI_Write( CMD_MODE, 0x64 ); //RM=8x
SPI_Write( CMD_MODE, 0xf2 ); //bank2
SPI_Write( CMD_MODE, 0xe3 ); //whole picture setting
SPI_Write( CMD_MODE, 0xf0 ); //bank0
結局のところコントラストは電源電圧に依存してしまうので、もっとも良いのは電源電圧をモニタして、その電圧によって初期化パラメータを変えるのが良いでしょう。
電池駆動システムを考える時、割と電源電圧とか、ボード上の温度とかの情報が欲しくなります。
この点、MSP430にしろ、HCS08にしろ、内部のA/Dコンバータの一部の入力にこれらの入力があり、とても重宝します。
逆にR8Cなんかも電池駆動ソリューションを目指してはいるのでしょうけれど(例えば秋月で売り出したR8C/29シリーズ)、内部に電圧や温度を計測する要素が無い。非常に残念です。
試しにコマンドラインツールを作ってみた [MSP430]
Windows ビットマップファイルをPW160128LCDに最適化したデータに変換するプログラム。MSP430のアセンブラのテーブルを生成する。
一応2色(白黒)、16色(グレースケール)に対応している、、、筈だ。
しかしサイズが8で割り切れない時の対処を行っていないので、更なる煮詰めが必要。
/* ------------------------------------------------------------------------ */
/* Windows ビットマップファイルをMSP430のASMソースに変換する。 */
/* */
/* 変換出来るフォーマットはWindows BMP、2色と16階調グレースケールです。 */
/* 上記のフォーマットは、大概のペイントツールで可能でしょう。 */
/* Copyright (C) 2007 - by hamayan */
/* ------------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
typedef struct /*ビットマップファイルヘッダー*/
{
char bfType[2]; /*認識文字*/
char bfSize[4]; /*ファイルサイズ*/
char bfReserved1[2]; /*予約1*/
char bfReserved2[2]; /*予約2*/
char bfOffBits[4]; /*ピクセルデータまでのバイト数*/
} BITMAPFILEHEADER;
typedef struct /*ビットマップ情報ヘッダー*/
{
char biSize[4]; /*BITMAPFILEHEADERのサイズ*/
char biWidth[4]; /*ピクセルデータの幅*/
char biHeight[4]; /*ピクセルデータの高さ*/
char Planes[2]; /*カラープレーン数*/
char biBitCount[2]; /*色数*/
char biCompression[4]; /*圧縮形式*/
char biSizeImage[4]; /*ピクセルデータのサイズ*/
char biXPelsPerMeter[4]; /*水平解像度*/
char biYPelsPerMeter[4]; /*垂直解像度*/
char biClrUsed[4]; /*使用カラー数*/
char biClrImportant[4]; /*重要なカラー数*/
} BITMAPINFOHEADER;
typedef struct /*カラーパレット*/
{
unsigned char rgbBlue; /*青の輝度*/
unsigned char rgbGreen; /*緑の輝度*/
unsigned char rgbRed; /*赤の輝度*/
unsigned char rgbReserved; /*予約*/
} RGBQUAD;
typedef struct /*ファイル全体のフォーマット*/
{
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
RGBQUAD rgb[1];
} BITMAPFILEFORMAT;
int main( int argc, char *argv[] )
{
char *FileBuffer;
unsigned char *bmp,data,bit_chk;
int i,j,k,width,line,shift;
long FileSz,curpos;
BITMAPFILEFORMAT *head;
RGBQUAD *rgb;
FILE *in,*out;
if( argc != 2 && argc != 3 )
{
printf( "Parameter Error\n" );
return EOF;
}
if( argc == 2 ) out = stdout;
else
{
out = fopen( argv[2], "w+t" );
}
/*引数のファイルをOPENする。*/
if( (in = fopen( argv[ 1 ], "rb" )) == NULL ) return EOF;
/*ファイルのサイズを取得する。*/
curpos = ftell( in );
fseek( in, 0, SEEK_END );
FileSz = ftell( in );
fseek( in, curpos, SEEK_SET );
FileBuffer = malloc( FileSz + 1 );
/*ファイルの内容を取込み*/
fread( FileBuffer, 1, FileSz, in );
/*ファイルの内容を取り込んだので、CLOSEする。*/
fclose( in );
/*ファイルの情報を表示する。*/
head = (BITMAPFILEFORMAT *)FileBuffer;
/*意匠表示と擬似命令*/
fprintf( out,
";* ------------------------------------------------------------------------ *\n"
";* 画像データテーブル *\n"
";* designed by hamayan *\n"
";* Copyright (C) 2007 - by hamayan *\n"
";* ------------------------------------------------------------------------ *\n\n"
"\tNAME bmp_data_table\n"
"\tRSEG DATA16_C\n"
"\tEXPORT PixWidth\n"
"\tEXPORT PixHeight\n"
"\tEXPORT PixColor\n"
"\tEXPORT Graphic\n\n"
);
fprintf( out, ";\tGraphic Info\n" );
fprintf( out,
";\tType:%c%c*\n"
";\tFile size=%ld*\n"
";\tOffset=%ld*\n\n",
head->bf.bfType[0],head->bf.bfType[1],
*((long *)head->bf.bfSize),
*((long *)head->bf.bfOffBits)
);
fprintf( out,
";\tHeader size=%ld\n"
";\tWidth=%ld\n"
";\tHeight=%ld\n"
";\tPlanes=%d\n"
";\tCount=%d\n"
";\tImg size=%d\n"
";\tX pics=%ld\n"
";\tY pics=%ld\n"
";\tColor Used=%d\n\n",
*((long *)head->bi.biSize),
*((long *)head->bi.biWidth),
*((long *)head->bi.biHeight),
*((short *)head->bi.Planes),
*((short *)head->bi.biBitCount),
*((long *)head->bi.biSizeImage),
*((long *)head->bi.biXPelsPerMeter),
*((long *)head->bi.biYPelsPerMeter),
*((long *)head->bi.biClrUsed)
);
fprintf( out,
"PixWidth:\tDW\t%ld\n"
"PixHeight:\tDW\t%ld\n"
"PixColor:\tDW\t%ld\n",
*((long *)head->bi.biWidth),
*((long *)head->bi.biHeight),
*((long *)head->bi.biClrUsed)
);
#define BITCOUNT (*((short *)head->bi.biBitCount))
#define OFFBITS (*((long *)head->bf.bfOffBits))
#define HEIGHT (*((long *)head->bi.biHeight) - 1)
/*縦横サイズの調整*/
width = *((long *)head->bi.biWidth); /*横方向のbyte数を計算*/
width = ((width - 1) * BITCOUNT / 8) + 1;
line = (((width - 1) / sizeof(long)) + 1) * sizeof(long);
/*左下を原点にしている為に、上下方向のみ入れ替えが必要となる。*/
/*画像データをASMソースファイルに変換する。*/
fprintf( out, "\n;\tparameter width = %d height = %d line = %d\n", width, HEIGHT + 1, line );
fprintf( out, "Graphic:\n" );
for( i = HEIGHT; i >= 0; i -= 8 ) /*逆順に廻して行く*/
{
bmp = (unsigned char *)head + (i * line) + OFFBITS; /*パレット番号が登録されたテーブルから読み出し*/
for( j = 0; j < width; j++ )
{
fprintf( out, "\tDB\t" );
for( k = 0,bit_chk = 0x80; k < 8; k++ )
{
data = ( *(bmp - (line * 0)) & bit_chk) ? 0x01 : 0x00;
data |= ( *(bmp - (line * 1)) & bit_chk) ? 0x02 : 0x00;
data |= ( *(bmp - (line * 2)) & bit_chk) ? 0x04 : 0x00;
data |= ( *(bmp - (line * 3)) & bit_chk) ? 0x08 : 0x00;
data |= ( *(bmp - (line * 4)) & bit_chk) ? 0x10 : 0x00;
data |= ( *(bmp - (line * 5)) & bit_chk) ? 0x20 : 0x00;
data |= ( *(bmp - (line * 6)) & bit_chk) ? 0x40 : 0x00;
data |= ( *(bmp - (line * 7)) & bit_chk) ? 0x80 : 0x00;
bit_chk >>= 1;
if( k != 7 )
fprintf( out, "0x%02X,", ~data & 0x00ff );
else
fprintf( out, "0x%02X\n", ~data & 0x00ff );
}
bmp++;
}
putc( '\n', out );
}
for( i = HEIGHT; i >= 0; i-- ) /*逆順に廻して行く*/
{
fprintf( out, ";\t" );
bmp = (unsigned char *)head + (i * line) + OFFBITS; /*パレット番号が登録されたテーブルから読み出し*/
for( j = 0; j < width; j++ )
{
for( k = 0; k < 8; k++ )
{
fprintf( out, "%c", (*bmp & (0x80 >> k)) ? ' ' : '*' );
}
bmp++;
}
fprintf( out, "\n" );
}
fprintf( out, "\n\tEND\n\n" );
/*意匠表示*/
fprintf( out,
"\n"
";* ------------------------------------------------------------------------ *\n"
";* end of file *\n"
";* designed by hamayan *\n"
";* Copyright (C) 2007 - by hamayan *\n"
";* ------------------------------------------------------------------------ *\n\n"
);
if( argc == 3 ) fclose( out );
free( FileBuffer );
return 0;
}
/* ------------------------------------------------------------------------ */
/* Copyright (C) 2007 - by hamayan */
/* ------------------------------------------------------------------------ */
MSP430F2274 + LCD Gadget その後 [MSP430]
![]() |
![]() |
まあ、やりたい事、やらなければならない事の上に、風邪をこじらせて見たりと、なかなか開発が進まないのですが、F2274オルゴール計画の第一歩として16階調グラフィックLCDに写真を表示する所までは来ましたよ。
写真に写っているのはET2007の時のパスカルさん。
元はWindowsのBMP形式、16色グレースケール、圧縮無しで作成したバイナリファイルを、MSP430用のアセンブラのテーブルに変換してプロジェクトに取り込み、プログラムでグラフィック領域のデータを読み込み、このLCDのデータフォーマットに変換して転送と、結構面倒な手続きで表示しています。
実はこの写真、左右、上下方向が逆になっているんです。
まあビットマップデータに関しては、MSP430で変換処理をやらせるより、従来も使った、パソコン上でLCDに最適化したデータに変換しておいてから、MSP430に転送する方式が良いですね。
なんせ、4KbyteしかCソースコードを記述できないので、あらゆる所でケチったコードを書かないと。
※パラレルでも、シリアルでもインタフェースできるこのLCD(変換アダプター付き)、是非パスカルさんの所で買ってみてください。
http://passworld.co.jp/index.php?lang=JP&lieu=Accueil
MSP430に限らず、便利に使えますよ。だって秋月のあの諧調無しのLCDが2100え※*?¥@dsk・s;
ATS2007へのお誘い [MSP430]
ATS2007
いやしかし、こちらへの参加はスケジュールの都合で無理、、、っぽい。
じゃあ何を!ですが、パスカルさんが、サードパーティベンダーとして出展、公演を行いますので、是非お会いしてきてください。
で、写真の基板も、「行くなら持って行って!」と渡してしまったので、もしかしたら当日見る事が出来るかもしれません。
まあ、パターン失敗しているので修正が入り、ちょっと恥ずかしいのですが。
私の方も、先日パスワールドさんから購入した液晶と、この基板を接続して、何か作ろうかと思っています。
F2274にはOP-AMPが内蔵されているので、OP-AMPで加算回路を構成し、タイマーで3つ位の音を同時に発生させ、合成、それでスピーカーを鳴らす、”絵の出るオルゴール”辺りが最初の目標かな。
そこで、バイナリデータをASMソース化するツールを作らねばならない事に繋がると。
新しいGadgetを入手 [MSP430]
パスワールドさんから写真のGadget(ソロバン開発ボード、グラフィック液晶各種)を入手しました。
もうグラフィック表示し放題です。
下敷きになっているのは、例の日経ソフトウエアです。
ファミレスで音声用レコーダーを挟んだ形でインタビューされたので、どの様な記事になるのか興味津々でしたが、流石に上手くまとめられていますね。
コメントにはFTF Design Challenge Japanに付いての紹介までされていて、これ(FTF2008 Design Challenge Japanに付いて)ってメディアがこの事に付いて紹介したのはWEBも含めて初めてではないのかな?。
優勝賞金が1万ドルなんだからもっとメディアで取り扱っても良いのに、汎用OSプログラミング専門雑誌に抜かれるなんて。
一つ確認した事 [MSP430]
MSP430用のIARのキックスタート版では、Cソースに由来するコードサイズの上限が4Kbyteなのですが、じゃあコードではないconstデータはカウントされるのか?ですが、カウントされるみたいです。
つまりコードは小さくとも、constデータが大きければ制限が掛かってしまいます。
と言う訳で、配列をアセンブラコードで出力するツールを作った方が良さそう。
そうかPRESI DIPかぁ [MSP430]
そうかぁPRESI DIPってメーカーでハーフピッチのヘッダー、ソケットを製造しているのね。
MSP430のEZ430-F2013の回路図に掲載されている部品名をぐぐっても、ぐぐってもそのメーカーとか売っている所を見つけられず、ほとんど諦めていましたが、、、。やっぱり「三人寄らば文殊の知恵」と言うか、ネット上だとちゃんと知っている人も居る訳で、情報提供してくれる方は本当に有り難い。(と言ってもこっちに情報を貰った訳ではないけれどね。)
物を入手できるかもしれないとなると、明かりが見えてきたと言うか、ちょっとでも動き出す事ができるかも。
http://www.k-tokiwa.co.jp/product.php?series_id=3759&maker_id=84
ただ標準品が25ピンと50ピンで、今回欲しいのは6ピン、これはEZ430-F2013では4ピンしか使っていないが、430RFでは6ピン仕様となっているので、6ピン位まで対応できるかな?と言う思惑からです。
http://www.ti.com/corp/docs/landing/ez430tool/index.htm?DCMP=MSP430ez430RFTools&HQS=Other+OT+eZ430-RF
いずれにしてもF2xxxシリーズは、主力をF22xx、F23xxシリーズにして来るでしょうから。
取り敢えず常盤商工には在庫を聞いてみました。
1000個単位とかだったらどうしよう、、、充分あり得るなぁ。
それでLEDを光センサーとして使ったら 続き [MSP430]
例のいきなりZIPファイルがダウンロードされてしまうリンク先のプロジェクトですが、ez430-F2013でもそのまま動作したと報告もらいました。
お持ちの方は試してみて!。
※容量性PADもなんか考えてみます。
MSP430入門セミナー関連の話題(ちょっとだけ) [MSP430]
入門セミナーでデモを行っていたプロジェクトが以下のリンクから落とせます。
いきなりzipファイルをダウンロードしちゃいますが(笑)。
http://www.ti.com/lit/zip/slac136
開発ツールの割り引きキャンペーンが行われています。が、購入するには受講者番号が必要です。
https://www.extra-web.net/tij/tool-discount/
※どうですか!。