Quantcast
Channel: コンピューターの勉強会・研修ネタ
Viewing all articles
Browse latest Browse all 66

PICで2つのUARTを使って、中継する-その1

$
0
0

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をおろして、もう一度立ち上げると、エラーがクリアされる


Viewing all articles
Browse latest Browse all 66

Trending Articles