Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00017
00018 #include <stdlib.h>
00019
00021 #include <avr/io.h>
00022 #include <avr/interrupt.h>
00023 #include <util/delay.h>
00024
00026 #include "encoder.h"
00027 #include "utils.h"
00028
00029 #define PHASE_A BITREAD(PIND,PD7)
00030 #define PHASE_B BITREAD(PINE,PE6)
00031
00032 volatile int8_t enc_delta;
00033 volatile int16_t enc_accum;
00034 static int16_t last;
00035
00038 void encoder_reset()
00039 {
00040 enc_accum = 0;
00041 enc_delta = 0;
00042 last = 0;
00043 }
00044
00047 int16_t encoder_read()
00048 {
00049 return ~enc_accum;
00050 }
00051
00052 ISR( TIMER3_COMPA_vect )
00053 {
00054 int8_t new, diff;
00055
00056
00057 new = 0;
00058 if( PHASE_A )
00059 new = 3;
00060 if( PHASE_B )
00061 new ^= 1;
00062
00063 diff = last - new;
00064
00065
00066 if(diff & 1)
00067 {
00068 last = new;
00069 enc_delta += (diff & 2) - 1;
00070 enc_accum += enc_delta;
00071 enc_delta = 0;
00072 }
00073 }
00074
00077 void encoder_init()
00078 {
00079 int8_t new;
00080
00081 new=0;
00082
00083
00084
00085
00086
00087
00088 if( PHASE_A )
00089 new = 3;
00090 if( PHASE_B )
00091 new ^= 1;
00092 last = new;
00093
00094 enc_delta = 0;
00095
00096 TCCR3A = 0x03;
00097 TCCR3B = 0x11;
00098 OCR3A = 3500;
00099 BITSET(TIMSK3,OCIE3A);
00100
00101
00102 BITSET(PCICR,PCIE0);
00103 BITSET(PCMSK0,PCINT0);
00104 }