組み立てまでは問題無かったけど、これから動くプログラムを書くのに苦労した。
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に挑戦!