一人もくもく会 α verでサービス開始しました。

PIC18F14K50とFT232RLでシリアル通信

PIC18F14K50とFT232RLでシリアル通信を試した。
元々やろうと思っていて全然手を出していなかった。

というのも、arduinoの簡単さに感心してしまい、
PICはなぜすぐに色々な機能が実現できるライブラリさえ
提供していてくれないのだろう、という思いがあり、
やるなら使いまわせるライブラリを作りたい、と考えていた。

そんなおり、色々ネットを見ていて、
気が付くとよくきむ茶さんのサイトに辿り着いたりするのだが、
よくよく見るときむ茶さんがダウンロードできるようにしてくれているソースには、
UARTやSPIなど、面倒なところをライブラリにまとめてくれていて、
それを使えばわざわざ自分で書かなくても簡単に色々出来てしまう。
まさに欲しいなと思っていたものだった。もっと早く気付けばよかった。

ということで、きむ茶さんのサイトにある通りに試しただけ。
http://www.geocities.jp/zattouka/GarageHouse/micon/linkPC/FT232R.htm
今後も色々使い倒していきたいと思う。

18F14K50用のソースは下記。

#include <xc.h>
#include "skUARTlib.h"

// PIC18F14K50
#pragma config FCMEN  = OFF
#pragma config IESO   = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config WDTEN  = OFF
#pragma config BOREN=NOSLP,BORV=30,PWRTEN=ON
#pragma config HFOFST = OFF, MCLRE  = OFF
#pragma config STVREN = ON,  BBSIZ  = OFF, LVP    = OFF
#pragma config XINST  = OFF
#pragma config CP0    = OFF, CP1    = OFF, CPB    = OFF
#pragma config WRT0   = OFF, WRT1   = OFF, WRTB   = OFF, WRTC   = OFF
#pragma config EBTR0  = OFF, EBTR1  = OFF, EBTRB  = OFF
//内部クロック
#pragma config FOSC   = IRC,  PLLEN  = OFF

#define _XTAL_FREQ 8000000

void interrupt inter(void) {
    InterUART();
}

void init(void)
{
    OSCCON = 0b01100010;
    ANSEL = 0;
    ANSELH = 0;
    TRISA = 0;
    TRISB  = 0b00100000; //RX in
    TRISC = 0;
    USBEN = 0;
    IOCA0 = 1;
    IOCA1 = 1;
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;
}

void main(void)
{
    char data[3];

    init();
    InitUART(12, 10, 51);
    data[1] = 0x0d;
    data[2] = 0x0a;

    while(1) {
        if (UART_Available() != 0) {
            data[0] = UART_Read();
            data[0] += 2;
            UART_Send(data, 3);
        }
    }

    return;
}

InitUARTの中身を見てみるとわかるが、ICによって処理が分けられている。
18F14K50にはRX, TXは1個ずつしか無いので特に設定はいらないため
そのまま使える。最初の2つの引数は使ってないので適当な値でもいい。
他のICを使う場合はそこに分岐処理を追加していけばいい。
githubに上がってみんなで更新していけるとよさげなライブラリ…。

ハマったところとしては、
どうしても割り込み関数が呼ばれず、全然動作しなかった。
なんか設定やコンフィグがおかしいのかな〜と思い時間かけて調べたが分からず。
よくよく調べるとFT232とPICのRX同士、TX同士をつないでいたという
初心者にありがちそうなミス…。