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に変更してください。