PIC12F1840 ロータリーエンコーダテスト

2019.6.27 JH7UBC


PIC12F1840を使ってロータリーエンコーダの回転方向を判定するテストです。
ロータリーエンコーダを回転させたときのAB端子の電圧変化でIOC割り込み(状態変化割り込み)をかけ、
ABの電圧のパターンで回転方向を判定します。判別方法は、当ホームページのここで説明していますのでご覧ください。
回転方向の判定結果は、シリアル通信でパソコンに送ります。シリアルUSB変換モジュールはFT234を使います。
パソコン側では、通信ソフトTeraTermで受信します。通信速度は9600bpsとします。
なお、RA4とRA5はPIC側でウィークプルアップして、プルアップ抵抗を省略します。

回路図です。
電源は、FT234から5Vを供給します。

ブレッドボードです。

TeraTermに回転方向の判定結果表示されます。
時計回りの場合が「RIGHT」、反時計回りの場合が「LEFT」です。

プログラムです。

 
/*
 * File:   main.c
 * Author: JH7UBC Keiji Hata
 * PIC12F1840 Rotary Encoder test
 * Created on 2019/06/22
 */
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
 
// CONFIG1
#pragma config FOSC     = INTOSC
#pragma config WDTE     = OFF
#pragma config PWRTE    = ON
#pragma config MCLRE    = OFF
#pragma config CP       = OFF
#pragma config CPD      = OFF
#pragma config BOREN    = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO     = OFF
#pragma config FCMEN    = OFF
 
// CONFIG2
#pragma config WRT    = OFF
#pragma config PLLEN  = ON
#pragma config STVREN = ON
#pragma config BORV   = HI
#pragma config LVP    = OFF
#define _XTAL_FREQ 32000000
 
/* ロータリーエンコーダ関係定義*/
#define ECA RA5 //エンコーダA
#define ECB RA4 //エンコーダB
volatile unsigned char curDat;
volatile unsigned char befDat;
volatile signed char count= 0;
 
void serial_init(unsigned long BR){
    TXSTA = 0x24;   //SYNC=0 TXEN = 1 BRGH = 1
    BRG16 = 1;      //BRG 16bit mode
    RCSTA = 0x90;   //非同期、継続受信可
    unsigned int X= _XTAL_FREQ/BR/4 - 1;
    SPBRGH = X / 256;
    SPBRGL = X % 256;
}
 
void putch(unsigned char byte){
    while(!TXIF);
    TXREG = byte;
}
 
void __interrupt() isr(){
    IOCIF = 0;   //割り込みフラッグクリア
    IOCAF = 0;
    __delay_ms(2);
    curDat = ECA + (ECB<<1);
    if (befDat != curDat){
        unsigned char d = ((befDat<<1)^curDat) & 3; //回転方向判定
        if(d < 2){
            count++;
        }else{
            count--;
        }
        befDat = curDat;
    }
    if(count >= 4){
        printf("RIGHT\r\n");
        count = 0;
    }else if(count <= -4){
        printf("LEFT\r\n");
        count = 0;
    }
}
 
void main() {
    OSCCON = 0b01110000 ;     // 内部クロック8MHz
    ANSELA = 0b00000000 ;     // アナログは使用しない
    TRISA  = 0b00110010 ;     // RA1,RA4,RA5は入力、他は出力
    PORTA  = 0b00000000 ;     // 出力ピンの初期化
    OPTION_REGbits.nWPUEN = 0;//ウィークプルアップ許可
    WPUA = 0b00110000;        //RA4,RA5をウィークプルアップ
   
    /* 割り込み関係設定 */
    IOCIE = 1;                //状態変化割り込み許可
    IOCAP = 0b00110000;       //RA4,RA5立ち上がりエッジ検出
    IOCAN = 0b00110000;       //RA4,RA5立ち下りエッジ検出
    PEIE = 1;                 //周辺割り込み許可
    GIE = 1;                  //全割り込み許可
   
    /* シリアル通信設定 */
    serial_init(9600);
   
    while(1){
    }
}

コンパイルエラーが出るときは、Project PropartiesでXC8 Global OptionのC standerdをC99からC90に変更してください。

inserted by FC2 system