参考にさせていただいたのはここ。
PIC24FJ64GA002、C30の環境で、外付けのクロックで動作させている。
これを、PIC24FJ64GB002、XC16、内蔵オシレータでの動作に変更し、UARTを2つにして、USBシリアル変換アダプター2つで、PC上の2つのTera Termと通信させる。
まず、内蔵オシレータでの動作には以下の設定だ。
#pragma config FNOSC = FRCPLL // Initial Oscillator Select (Fast RC Oscillator with Postscaler and PLL module (FRCPLL))
#pragma config PLLDIV = DIV2 // USB 96 MHz PLL Prescaler Select (Oscillator input divided by 2 (8 MHz input))
OSCCONbits.COSC = 0b001;//Fast RC Oscillator with Postscaler and PLL module (FRCPLL)
CLKDIVbits.RCDIV = 0b000;//FRC Postscaler Select bits 8 MHz
この辺については、「PIC24FJ64GB002 __delay_ms();を使う」でゴニョゴニョやっている。
もう忘れかけているが。
とにかく、32MHzで駆動させるのだという点だけは以下で使うので気にしておく。
ボーレートの設定は「PIC24FJ64GB002 + Generic FatFs も試してみる。」でやっているが、こちらも、やったことは記憶にあっても内容は忘れている。
U1BRG = 103;
//9600baud at 32MHz
//U1BRG = (Fosc(Hz)/2/16/baud(baudrate) – 1
//= 32000000/2/16/9600 – 1 = 103.2
9600baudの設定にした。
続いて接続するピンの設定をする。
Peripheral Pin Select (PPS)という機能がある。
便利だが、慣れていないのでちょっと戸惑う。
Receiveから設定する。
RXだ。
データシートの表を見てUARTのReceiveを探すと、以下のようにRPINR18のU1RXRを設定すればいいことが分かるので、
RPINR18bits.U1RXR = 3;
とする。
この = 3 が、RP3の3を意味し、実際には7ピンをUART1のReceiveとして使うことになる。
TXの方は、また設定の仕方が違う。
まずは、Output Function Numberを押さえておかなければならない。
3だ。
ここではRP2を割り当てたいので、RPOR1のRP2Rを3に設定する。
RPOR1bits.RP2R = 3;
以上、要するに、インプットの場合は機能を示すレジスタ(U1RXR)に使うピンを決める値(=3)を設定し、アウトプットの場合はピンを表すレジスタ(RP2R)に機能を決める値(=3)を設定するということ。
UARTを2組使うので、UART2の方は10、11ピンに割り当てた。
RPINR19bits.U2RXR = 11;
RPOR5bits.RP10R = 5;
下のTera Termから文字を送って、PICで受けて2文字追加した後、上のTera Termに表示しているところ。
追記
どうせなら双方向のチェックが出来た方がいいのでプログラムを少し書き直した。
上のTera TermはUART1につながっていて、こちらをアクティブにしてキーを打つと Get from UART1、下はUART2につながっているので、こちらでキーを打つと Get from UART2 と表示されてから入力した文字とその隣の2文字が表示される。
プログラムは、こういう非常に単純なもの。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
while(1){ putsUART1("Connected to UART1\n\r"); putsUART2("Connected to UART2\n\r"); while(!DataRdyUART1() && !DataRdyUART2()); if(DataRdyUART1()){ Buffer[0] = getcUART1(); Buffer[1] = Buffer[0] + 1; Buffer[2] = Buffer[0] + 2; sprintf(BufForPuts, "Get from UART1 Received = %c + %c%c\n\r", Buffer[0], Buffer[1], Buffer[2]); putsUART1(BufForPuts); putsUART2(BufForPuts); } if(DataRdyUART2()){ Buffer[0] = getcUART2(); Buffer[1] = Buffer[0] + 1; Buffer[2] = Buffer[0] + 2; sprintf(BufForPuts, "Get from UART2 Received = %c + c%c\n\r", Buffer[0], Buffer[1], Buffer[2]); putsUART1(BufForPuts); putsUART2(BufForPuts); } } |