組み立てまでは問題無かったけど、これから動くプログラムを書くのに苦労した。
PIC18F2550なので、C18を使うとUSARTのライブラリ関数があり、そんなに問題なさげだった。
// メイン関数 void main(void) { char res; unsigned char c = 0, y = 1; TRISB = 0; // PORTB全部出力 lcd_init(); lcd_clear(); lcd_goto(0,0); lcd_str(STARTMSG); Delay10KTCYx(200); OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 129); lcd_goto(0,0); lcd_str(WAITMSG); lcd_goto(y,0); while (!DataRdyUSART()); while (1) { while (DataRdyUSART()) { res = ReadUSART(); if (c < 16) { c++; lcd_data(res); } else { c = 0; if (y == 0) { y = 1; } else { y = 0; } lcd_goto(y,0); } } } }
メインループは結果からすると、基本的にこれでOKだったけど、OpenUSART
の引数の最後のUSART_BRGH_HIGH, 129
部分が問題だった。
サンプルとかはこの組み合わせが多くて、解説本でもこの組み合わせだったので、何の疑問もいだかなかった。
この部分は通信のボーレートを指定する部分で、PICの動作クロックを元に計算して求める。
ただ、一般的なクロック(40MHz, 20MHz, 10MHzの3つ)はすでに計算された表があって、表から目的のボーレートで引けばOK。
でも、PIC18Fは外部クロックの4倍のクロックで動かすとかの機能があって、自分のPIC18F2550には20MHzのセラロックをつけているけど、実際に何MHzで動いているのかよくわかってなかった。
とはいえ、そのままで動くと思っていたので変な文字(以下、文字化けと記します)が出てきた時はパニクった。
文字化けになるのはボーレートが違っているのが原因というのは、RS-232Cの通信とか調べている時に読んだのでボーレートが違うんだろうと思った。
表を見て、40MHz, 20MHzといろいろ数値を試してみたし、さらにUSART_BRGH_LOW
にしてみたりしたけど、文字化けは直らない。
「これは、クロックをちゃんと調べないとダメだな」と思い、Config Bitsのところを調べた。
#pragma config FOSC = HSPLL_HS #pragma config WDT = OFF #pragma config PLLDIV = 5 #pragma config CPUDIV = OSC1_PLL2 #pragma config USBDIV = 2 #pragma config PWRT = ON #pragma config BOR = ON #pragma config BORV = 3 #pragma config LVP = OFF #pragma config VREGEN = ON #pragma config MCLRE = ON #pragma config PBADEN = OFF
PIC18F2550+20MHzセラロックの組み合わせで、今までこの設定で動いていた。
でも、いろいろ調べてみるとPLLで×4で動かす場合、最大で10MHzまでだそうで、20MHzをつないで FOSC = HSPLL_HS
を指定した場合はいくつで動くのかわからない。
なのでとりあえず FOSC = HS
にして20MHzで動くように設定して、20MHz用設定値 USART_BRGH_HIGH, 129
に設定してみたら動いた。
Config Bitsの設定はあまりよくわかってないので、一度ちゃんと見直す必要がある。
ピンバック: PIC18F2550のクロック « Physical Computingに挑戦!