2016年2月16日火曜日

マイコン(PIC)のシリアル通信確認するときにArduinoあると簡単だった

PIC16F88でシリアル通信する処理を焼いてみたのだが、実際に出力できているのか確認したかった。
この前、PICの工作キットでRS-232CでPCとシリアル通信するの上手く動かなかったしどうしよう。
っていうときに、Arduino使うと驚くほど簡単にシリアルをPCで確認できたのでメモ。
あぁ、Arduino持ってて良かった。

PIC16F88のコード

#include <xc.h>
#include <stdio.h>
 
#define _XTAL_FREQ 8000000      // 8MHz

//#include "uart.h"

// 16F88
// CONFIG1
#pragma config FOSC = INTOSCIO // 内部発振使用
#pragma config WDTE = OFF   // ウォッチドッグタイマ
#pragma config PWRTE = ON   // パワーアップタイマー
#pragma config MCLRE = OFF  // マスタークリアー機能
#pragma config BOREN = OFF   // ブラウンアウトリセット
#pragma config LVP = OFF    // 低電圧プログラム書き込み
#pragma config CPD = OFF    // データーコードプロテクション
#pragma config WRT = OFF    // フラッシュ書き込み
#pragma config CCPMX = RB3  // CCPのパルス出力ピン
#pragma config CP = OFF     // プログラムコードプロテクションOFF

// CONFIG2
#pragma config FCMEN = OFF  // Fail-Safe Clock Monitor
#pragma config IESO = OFF   // Two-Speed Start-up

// uart
#define BAUDRATE 9600       // 9.6kbps
#define TX9_RX9_BIT 0       // 0: 8bit, 1: 9bit
#define BRGH_BIT 1          // 0: 低速サンプル指定, 1: 高速サンプル指定

void init_pic(void);
void init_uart(void);
void strOutUSART(char *);

void main(void) {
    init_pic();
    init_uart();
    
    char *cmd = "$WP http://request-watcher.herokuapp.com/ testbody=hello\n";
    while(1){
        __delay_ms(5000);
        strOutUSART(cmd);
    }
}

void init_pic(){
 OSCCON = 0x72;  // INTOSC 8MHz
 ANSEL  = 0x00;  // AN未使用
    
 PORTA = 0x0;
 PORTB = 0x0;
    
 TRISA = 0x0;  // RA0-7:out
    
    // SPIシリアル通信する
    // RC2/RX をinput
    // RC5/TX をoutput
 TRISB = 0b00000100;
    
    return;
}

void init_uart(){
    SPBRG = 51;     // 8MHzの時の9600Hz
    RCSTA   = 0b10010000;  // UART送受信を有効
    TXSTA   = 0b00100100;  // 8Bit非同期送受信

    RCIF = 0;    // reset USART interruption flag
    RCIE = 1;    // enable USART interruption
    PEIE = 1;    // enable peripheral interruntion
}

void strOutUSART(char *str){
    while(*str){                 //文字列の終わり(00)まで継続
        while (!TXIF);  //送信終了待ち
        TXREG = *str++;          //文字出力しポインタ+1
    }
}



Arduinoのコード

const unsigned long baudrate = 9600;
void setup() {
  Serial.begin(baudrate);
  Serial.println("Ready.");
}

void loop() {
  if (Serial.available() > 0) {
    char c = Serial.read();
    Serial.print(c); // Echo back
  }
}


なんとこれだけ!

実行

ちゃちゃっとつなげればOK。今回のPICは11番がシリアル送信になる。
そして、Arduinoの0番はそのままシリアル受信できる!



DCジャックついてるけど使ってません。プラスとマイナスはそれぞれ繋いであります。


コード。

シリアルモニタ。

シリアル送信できてる!

PICやったあとだとArduinoの便利さがすごい分かる。
コンフィグとか設定しないでもやりたいことできるもの。

以上、便利だったので記録しました。