PIC18F25K22は、UART(USART)の口を2つ持っていて、別々に動く。
(他のPICも2つの入り口を持っているが、別々に操作はできない)
そこで、
一方の入力を9600BPS
もう一方を57600BPS
にして、データを中継するということもできる。
今回は、このような速度の違う中継を、単純に受信したものを送信するという
形で中継する方法を書いてみる
(なので、割り込みは使わないし、非同期でもない)
-----
お題:
●UART1からは、9600BPSでGPS信号が入ってくる。
具体的には、秋月の
GPS受信機キット 1PPS出力付き 「みちびき」対応
http://akizukidenshi.com/catalog/g/gK-09991/
で、買って、ピンを半田付けして電池つけた状態(出荷時デフォルトの状態)
のものを、PICにつなぐ
●UART2は、57600BPSで、Raspberry Piにつなぐ。
sudo cu -l /dev/tyAMA0 -s 57600
を実行する(cuができるように前準備はしてあるものとする)
※結果、Raspberry Pi上にGPSの内容が表示されるようにする。
-----
アプローチ
UART1にGPSをつなぎ、9600BPSで送受信
UART2にRasPiをつなぎ、57600BPSで送受信する。
●ハードについて
PIC18F25K22のデータシート
http://akizukidenshi.com/download/ds/microchip/pic18f2x_4xk22.pdf
によると、8ページTable1より(EUSARTの列、1列目、3列目を見る)
TX2が27番ピンでRB6
RX2が28番ピンでRB7
TX1が17番ピンでRC6
RX1が16番ピンでRC7
で、RB7,RB6,RC6,RC7がどこにあるかは、5ページのPin Diagrams の上のほう
28-pin PDIP, SOIC, SSOPにある。
右側の上2つと、右側の下から3,4番目
●ソフトについて
PICのUARTでは、
RCSTA
TXSTA
BAUDCON
SPBRG
CREN
RCIF
TXIF
RCREG
TXREG
を使う。これらが、2つになる。
RCIFとTXIFだけ、RC1IF,TX1IFと、間に、1,2の数字が入る。
他は、RCSTA1のように、後に1、2の数字が入る。
具体的な使い方は、
http://www.dmi.unict.it/~santoro/teaching/lap1/slides/UART_MCU.pdf
を参照のこと
------
実装
●ハード
ブレッドボード上に作りました
GPSのTXをRX1
GPSのRXをTX1
GPSのGNDを、ブレッドボードのGND(青い線)に
GPSの5V を、ブレッドボードの5V (赤い線)に
GPSの1PPSはつながない
RasPiのTXをRX2
RasPiのRXをTX2
RasPiのGNDを、ブレッドボードのGNDに
ブレッドボードに乾電池3個分(またはラズパイから)
赤を5V (赤い線)
黒をGND(青い線)につなぐ
PICの
VDD 20番ピンを 5V(赤い線)
VSS 8,19番ピンをGND(青い線)に
PICのつなぎ方は
http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/18F25K22/VRtoLED2/VRtoLED2.htm
を参考のこと
●ソフト
こんなかんじ。
#include <xc.h>
// cf: http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/18F25K22/VRtoLED2/VRtoLED2.htm
#define _XTAL_FREQ 8000000 // Attention!
#pragma config PRICLKEN=OFF
#pragma config PLLCFG=OFF
#pragma config FOSC=INTIO67 // Attention!
#pragma config BOREN=NOSLP
#pragma config BORV=285
#pragma config PWRTEN=ON
#pragma config WDTEN=OFF
#pragma config MCLRE=INTMCLR
#pragma config HFOFST=OFF
#pragma config LVP=OFF
void main()
{
unsigned char c;
OSCCON = 0b01100010 ; // Attention (8MHz))
// Analog
ANSELA = 0b00000000 ;
ANSELB = 0b00000000 ;
ANSELC = 0b00000000 ;
// IN/OUT
TRISA = 0b00000000 ;
TRISB = 0b10000000 ;
TRISC = 0b10000000 ;
// High/Low
PORTA = 0b00000000 ;
PORTB = 0b00000000 ;
PORTC = 0b00000000 ;
// UART 1
RCSTA1 = 0b10010000;
TXSTA1 = 0b00100100;
BAUDCON1 = 0b00001000;
SPBRG1 = 204; // Attention!
CREN1 = 1;
// UART 2
RCSTA2 = 0b10010000;
TXSTA2 = 0b00100100;
BAUDCON2 = 0b00001000;
SPBRG2 = 34;
CREN2 = 1;
while(1)
{
c = 0;
if( FERR1 || OERR1 ) /* エラー確認 */
{
CREN1 = 0;
NOP();
CREN1 = 1;
}
// from GPS
if (RC1IF == 1)
{
c = RCREG1;
}
// out
if ( c != 0)
{
while (!TX2IF);
TXREG2 = c;
}
}
}
●注意点
・PICKIT3をこのブレッドボード上に直接指して、書き込みしようとする場合
PIKKIT3の三角形がついているピンを1番として
1番をPICの1番ピン
2番をボードの5V(赤い線)
3番をボードのGND(青い線)
6番をつながない
はいいんだけど、問題は、4番と5番のピン
これは、28、27につなぐと思うんだけど、ここにはRasPiのピンが刺さっている
このRasPiのピンを「外さないと」書き込めないので注意!
【注意点追加】
if( FERR1 || OERR1 )内について
この部分がないと、フレームエラーやオーバーフローが起きた後、読み込まなくなる。
それらがおきたらCRENをおろして、もう一度立ち上げると、エラーがクリアされる
↧
PICで2つのUARTを使って、中継する-その1
↧