Sim's blog

電子工作はじめてみました

FPLの高速書き込み

2007-04-07 17:21:21 | V850
FPLの設定を変えることで書き込み時間を短縮できることがわかりました。メニューのDevice → Setup (もしくはメニューアイコンのレンチのアイコン)で、フラッシュに書く領域を指定できます。デフォルトはChipになっていて、たぶんChip全体に書き込む設定のようです。Blockに変えてStartとEndを指定してやれば、指定したブロックにしか書き込まないようです。Show Addressをチェックするとブロック単位でなくアドレス単位で選択できるようになります。対応関係からすると1ブロックは28kバイトということになります。


秋月のLCDに出力してみる

2007-04-07 16:52:08 | V850
秋月電子で売っているキャラクタLCDに文字を出力してみました。元ネタはHamayanさんのblogココです。

入出力ポートはどれにしようか迷いましたが連番でとりやすいP9にしました。本当は5V耐圧ということなので5V系で直結できるはずなのですが、怖いので3.3V系にしています。コントラストだけは5V近く必要なので、Hamayanさんの回路図をパクってLTC1144で負電圧を作っています。4.5Vちょいくらいがちょうどいいコントラストでした。

電源投入直後に必要なwaitは3.3Vのせいか15ミリ秒では足りないようです。多い分には問題ないので、100ミリ秒くらい待っています。もっと少なくてもよいかもしれません。

V850用のNECのコンパイラはポートの名前とかを宣言しなくても使えるので便利です。P9Lの最下位bitを0にするにはP9L.0 = 0;のように書きます。ポート名は小文字のp9lだと受け付けてくれません。8bitのポートだとP3.5みたいな書き方ができますがP9のような16bitのポートの場合は上位8bitのP9Hか下位8bitのP9Lに対してしかビット操作ができません。P9H.0 = 1;はset1 0x1, P9Hの1命令にコンパイルされています。

デバッガー(ID850QB-MON)を使うときはJ2とJ3をジャンパーしたままにしないといけないようです。FPLのときはJ3はpushボタンでもよかったのとは違っています。

「F0c34: オンチップ・デバッグで使用する予約領域への書き込みはできません。」というエラーがおきてデバッガーにはいれないことがありました。ソースをちょこちょこ直すと怒られなくなることもあるけど、原因はよくわかりません。

ソースもほとんどパクりです。一応、勉強のためにHamayanさんのソースを元にゼロからリライトしました。
/*
 * 秋月LCD SC1602BS*Bを使ってみる by Sim
 * original by Hamayan
 *
 * pin接続
 * LCD P1  Vcc --- 3.3V
 * LCD P2  GND --- GND
 * LCD P3  Vo ---- -1.6V
 * LCD P4  RS ---- P99 CON1 10pin
 * LCD P5  RW ---- GND
 * LCD P6  E ----- P98 CON1 9pin
 * LCD P7  D0 ---- NC
 * LCD P8  D1 ---- NC
 * LCD P9  D2 ---- NC
 * LCD P10 D3 ---- NC
 * LCD P11 D4 ---- P90 CON1 1pin
 * LCD P12 D5 ---- P91 CON1 2pin
 * LCD P13 D6 ---- P92 CON1 3pin
 * LCD P14 D7 ---- P93 CON1 4pin
 */

#pragma ioreg

#define setE()  P9H.0 = 1
#define clrE()  P9H.0 = 0
#define cmd_mode()  P9H.1 = 0    // RS = 0
#define data_mode() P9H.1 = 1    // RS = 1
#define setD(x) P9L = x

// nミリ秒待つ
void ms_wait(int n)
{
    int i;
    n <<= 11;    // 実測だと1700くらいで1msだった
for(i = 0; i < n; i++) __nop(); } // 4bit送る void send4bit(unsigned char c) { setE(); setD(c); clrE(); } // 8bit送る void send(unsigned char c) { send4bit(c >> 4); send4bit(c); ms_wait(1); } // LCD初期化 void lcd_init(void) { cmd_mode(); clrE(); ms_wait(100); // 15ms待つ send4bit(3); // function set 8bit mode ms_wait(5); // 4.1ms以上待つ send4bit(3); // function set 8bit mode ms_wait(1); // 100us以上待つ send4bit(3); // function set 8bit mode ms_wait(1); // 40us以上待つ send4bit(2); // function set 4bit mode ms_wait(1); // 40us以上待つ send(0x08); // display off send(0x28); // function set 4bit 2line send(0x06); // entry mode send(0x01); // display clear (1.64ms) ms_wait(1); send(0x02); // cursor at home (1.64ms) ms_wait(1); send(0x0c); // display on } // はじまりはじまり void main( void ) { static const char msg[] = "モウスグDOSガウゴキソウデス"; // (C) by Hamayan int i; // CPU初期化 VSWC = 1; WDTM2 = 0; __asm("mov 0x00, r11"); __asm("st.b r11, PRCMD"); __asm("st.b r11, PCC"); while( LOCK ); SELPLL = 1; // I/O初期化 PM9 = 0xfcf0; // P90~P93, P98,P99を出力に指定 PMC9 = 0; // P9は全部ポート PF9 = 0; // P9はCMOS出力 // LCD初期化 lcd_init(); // メッセージ出力 data_mode(); for(i = 0; msg[i] != '�'; i++){ if(i == 16){ cmd_mode(); send(0xc0); // 2行目に移動 data_mode(); } send(msg[i]); } // LEDポート 初期化 PMCT.6 = 0; // 点滅 while(1){ ms_wait(100); PCT.6 ^= 1; } }


4/8 追記ネタ元のHamayanさんのblogへのトラックバックを追加