OSDN Git Service

[IO][v2.0] Remove unnecessary TMR3.
[openi2cradio/OpenI2CRadio.git] / rencoder.c
1 /*
2  * OpenI2CRADIO
3  * Rotary encoder routine.
4  * Copyright (C) 2013-10-21 K.Ohta <whatisthis.sowhat ai gmail.com>
5  * License: GPL2+LE
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2,
10  *  or (at your option) any later version.
11  *  This library / program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *  See the GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this library; see the file COPYING. If not, write to the
18  *  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
19  *  MA 02110-1301, USA.
20  *
21  *  As a special exception, if you link this(includeed from sdcc) library
22  *  with other files, some of which are compiled with SDCC,
23  *  to produce an executable, this library does not by itself cause
24  *  the resulting executable to be covered by the GNU General Public License.
25  *  This exception does not however invalidate any other reasons why
26  *  the executable file might be covered by the GNU General Public License.
27  */
28 #include "rencoder.h"
29
30 unsigned char renc_state_a;
31 unsigned char renc_state_b;
32 unsigned char renc_dir;
33 unsigned char renc_count;
34 unsigned char renc_reset_count;
35
36 void rencoder_up(unsigned char dir)
37 {
38    if(dir == RENC_NONE) return;
39    if(dir == renc_dir) {
40        renc_count++;
41    } else {
42        renc_count = 0;
43        renc_dir = dir;
44    }
45 }
46
47 void rencoder_init(void)
48 {
49    RENC_TRIS_A = 1;
50    RENC_TRIS_B = 1;
51    renc_count = 0;
52    renc_dir = RENC_NONE;
53    renc_state_a = 0;
54    renc_state_b = 0;
55    renc_reset_count = 0;
56 }
57
58
59 void rencoder_restart(void)
60 {
61 }
62
63 void rencoder_start(void)
64 {
65    T1CON = 0b10110100;// RD16, T1RUN=0, 1/32 fOSC, TNR1CS=0, TMR1ON=0;
66    TMR1H = 63036 >> 8; // Tick = 4us, Count = 2500
67    TMR1L = 63036 & 255;
68    PIR1bits.TMR1IF = 0;
69    PIE1bits.TMR1IE = 1;
70    IPR1bits.TMR1IP = 1;
71    T1CONbits.TMR1ON = 1;
72    rencoder_init();
73 }
74
75 void rencoder_stop(void)
76 {
77    T1CON = 0b10110100;
78    TMR1H = 0;
79    TMR1L = 0;
80    PIR1bits.TMR1IF = 0;
81    PIE1bits.TMR1IE = 0;
82    IPR1bits.TMR1IP = 1;
83    rencoder_init();
84 }
85
86
87 void rencoder_count(void)
88 {
89    unsigned char dir = 0;
90    
91    if(RENC_PH_B != 0) {
92       if(renc_state_a != 0){
93          if(RENC_PH_A == 0) {
94             dir = RENC_RIGHT;
95          }
96       } else {
97          if(RENC_PH_A != 0) {
98             dir = RENC_LEFT;
99          }
100       }
101    }
102    if(dir != RENC_NONE) {
103       if(dir == renc_dir) {
104          renc_count++;
105       } else {
106          renc_count = 0;
107          renc_dir = dir;
108       }
109      renc_reset_count = 0;
110    } else{
111      renc_reset_count++;
112      if(renc_reset_count >= 100) { // 1000ms
113         renc_count = 0;
114         renc_dir = RENC_NONE;
115         renc_state_a = 0;
116         renc_state_b = 0;
117         renc_reset_count = 0;
118      }
119    }
120    
121    
122 //   rencoder_up(dir);
123    renc_state_a = RENC_PH_A;
124    renc_state_b = RENC_PH_B;
125 }
126
127          
128