トランジスタ技術2月号の実験キットでLチカのテスト
I2C実験基板に実装したLCDモジュールをブレッドボード上のLPC810から制御して、画面に”Lチカ”と表示させる。
"Lチカ"表示のon/off指示はPCから行う(シリアル通信)。
LPC810周りの回路をブレッドボード上に実装。
ISP書き込みを行いたいので、トランジスタ技術2014.02月号の実験Aの回路とほぼ同じ構成。
LPC810のpin3、pin4は、I2CのSCLとSDA用に確保し、I2C実験基板とはジャンパ線で接続。
電源もブレッドボード側からIC2実験基板にジャンパ線経由で供給。
プログラムは、I2C+LCD制御まわりをトラ技のLPC810_DEMOプロジェクトから、
UARTの制御を同じくLPC810_7segプロジェクトからそれぞれコピペで持ってきてニコイチにする。
カタカナを出したいのでマニュアルの文字コード表を見て1文字出してみる。
char kana[10]; kana[0] = 0xB1; // "ア" kana[1] = 0; : (略) PutsLCD(kana);
OKなので、PCのFlashMagicターミナルから
blink[改行]
で、"Lチカ"と表示し、
cls[改行]
で、消去するようにして完成。
一応、LPC側からもレスポンスを返すようにした。
int main(void) { const char msg[] = {0x4C,0xC1,0xB6,0x00}; uint8_t kai[] = {0x0d,0x0a}; // char mes[10]; volatile uint8_t k; // 文字コードを数値に変換したデータ変数 volatile uint8_t l; // 文字コードを数値に変換したデータ変数 // *msg = "TEST"; // IRC 12MHz /* Configure the core clock/PLL via CMSIS */ SystemCoreClockUpdate(); UARTInit(LPC_USART0, 115200); // UART初期化関数(115200bpsに設定) /* Configure the switch matrix (setup pins for UART0 and GPIO) */ SwitchMatrix_Init(); InitI2C(); mrtInit(SystemCoreClock/1000); InitLCD(); UARTSend(LPC_USART0, (uint8_t *)"initialize ok", 13); UARTSend(LPC_USART0, kai, 2); // 改行 tmpcount = 0; while(1) { if ( UARTRxCount >= 2) { // UART受信時(文字数が入力され2つ以上の場合) LPC_USART0->INTENCLR = RXRDY; // UART割り込み禁止 if ((uint8_t)UARTRxBuffer[UARTRxCount-2]==0x0d && (uint8_t)UARTRxBuffer[UARTRxCount-1]==0x0a) { // UARTSend(LPC_USART0, (uint8_t *)"passed", 6); UARTRxCount = 0; // UART受信カウントのリセット k = (uint8_t)UARTRxBuffer[0] - 'b'; k += (uint8_t)UARTRxBuffer[1] - 'l'; k += (uint8_t)UARTRxBuffer[2] - 'i'; k += (uint8_t)UARTRxBuffer[3] - 'n'; k += (uint8_t)UARTRxBuffer[4] - 'k'; l = (uint8_t)UARTRxBuffer[0] - 'c'; l += (uint8_t)UARTRxBuffer[1] - 'l'; l += (uint8_t)UARTRxBuffer[2] - 's'; if ( k==0 ) { // itoa(UARTRxCount,msg,10); // UARTSend(LPC_USART0, (uint8_t *)msg, strlen(msg)); UARTSend(LPC_USART0, (uint8_t *)"blink ok.", 9); UARTSend(LPC_USART0, kai, 2); // 改行 LocateLCD(0,0); PutsLCD((char*)msg); } else if (l==0) { UARTSend(LPC_USART0, (uint8_t *)"clear ok.", 9); UARTSend(LPC_USART0, kai, 2); // 改行 LocateLCD(0,0); PutsLCD(" "); } else { UARTSend(LPC_USART0, (uint8_t *)"what?", 5); UARTSend(LPC_USART0, kai, 2); // 改行 } } LPC_USART0->INTENSET = RXRDY; // UART割り込み許可 } } return 0; }
PCからLPC810に送信される改行が2文字(CR+LF)であることを失念していて、しばらく思った通りの動作にならなくて悩んでしまった。
やり方としては綺麗ではないかもしれないが、とりあえず動いたのでOKとする。
ちなみにオプティマイズをかけないと容量オーバーになるのでO1レベルでビルドした。
I2CやUART制御に用意してあるソース類などは手元にcファイルをコピーしてコンパイルしたほうがロードモジュールは小さくなるような気がした。
つまりI2CやUART制御の関数をライブラリ参照にして、それらのオブジェクトをリンクするような作り方だと、ロードモジュールが大きくなって4kBオーバーするのではないかな?
UARTでPCと通信できるので、簡単なデバッグはこれを利用する。
プログラムが何処まで進んだかが分かるようにポイントポイントでPCに適当な文字列を送るようにして、LCDの初期化で止まった状態になったのを見つけたりできた。
たぶんI2C通信でLCD側のACKが返ってこなくて待ち状態になったままと思われる。
LPC810とLCDモジュールのI2C通信にはジャンパ線で接続してるので波形は相当悪いはずで、そのへんで通信がうまく行かなかった、のかもしれない(オシロでちゃんと波形をみたいところではある)。