Rev 2032 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 2032 | Rev 2035 | ||
|---|---|---|---|
| Line 8... | Line 8... | ||
| 8 | #include <avr/io.h> |
8 | #include <avr/io.h> |
| 9 | #include <avr/interrupt.h> |
9 | #include <avr/interrupt.h> |
| 10 | #include <avr/pgmspace.h> |
10 | #include <avr/pgmspace.h> |
| 11 | 11 | ||
| 12 | #include <drivers/mcu/gpio.h> |
12 | #include <drivers/mcu/gpio.h> |
| 13 | #include |
13 | #include <drivers/rfid/rfid.h> |
| - | 14 | ||
| 14 | #include |
15 | #include <config.h> |
| 15 | 16 | ||
| 16 | /* edge detection, for resynchronization */ |
17 | /* edge detection, for resynchronization */ |
| 17 | volatile uint8_t rfid_m_lastbit = 0; |
18 | volatile uint8_t rfid_m_lastbit = 0; |
| 18 | 19 | ||
| 19 | /* number of timer steps left until next sample */ |
20 | /* number of timer steps left until next sample */ |
| Line 88... | Line 89... | ||
| 88 | x = (x >> 1 & 0x55) | (x << 1 & 0xaa); |
89 | x = (x >> 1 & 0x55) | (x << 1 & 0xaa); |
| 89 | return x; |
90 | return x; |
| 90 | } |
91 | } |
| 91 | 92 | ||
| 92 | ISR( TIMER1_COMPA_vect ) { |
93 | ISR( TIMER1_COMPA_vect ) { |
| 93 | gpio_toggle_pin( EXP_M ); |
- | |
| 94 | uint8_t bit = gpio_get_state( |
94 | uint8_t bit = gpio_get_state( RFID_READ_PIN ); |
| 95 | 95 | ||
| 96 | if( rfid_m_lastbit != bit ) { |
96 | if( rfid_m_lastbit != bit ) { |
| 97 | rfid_m_nextsample = RFID_OSR/2; |
97 | rfid_m_nextsample = RFID_OSR/2; |
| 98 | } |
98 | } |
| 99 | if( rfid_m_nextsample == 0 ) { |
99 | if( rfid_m_nextsample == 0 ) { |
| 100 | rfid_m_nextsample = RFID_OSR; |
100 | rfid_m_nextsample = RFID_OSR; |
| 101 | 101 | ||
| 102 | /* Sample */ |
102 | /* Sample */ |
| 103 | if( rfid_m_phase == 0 ) { |
103 | if( rfid_m_phase == 0 ) { |
| 104 | rfid_m_buffer = bit; |
104 | rfid_m_buffer = bit; |
| 105 | rfid_m_phase = 1; |
105 | rfid_m_phase = 1; |
| 106 | } else { |
106 | } else { |
| 107 | if( rfid_m_buffer == bit ) { /* Out of phase, resynchroinzation */ |
107 | if( rfid_m_buffer == bit ) { /* Out of phase, resynchroinzation */ |
| 108 | rfid_m_buffer = bit; |
108 | rfid_m_buffer = bit; |
| 109 | rfid_m_phase = 1; |
109 | rfid_m_phase = 1; |
| 110 | } else { |
110 | } else { |
| 111 | /* Second phase in manchester encoded bit, pass to bitstream */ |
111 | /* Second phase in manchester encoded bit, pass to bitstream */ |
| 112 | rfid_handlebit( !bit ); /* First bit counts */ |
112 | rfid_handlebit( !bit ); /* First bit counts */ |
| 113 | rfid_m_phase = 0; |
113 | rfid_m_phase = 0; |
| 114 | } |
114 | } |
| 115 | } |
115 | } |
| 116 | } |
116 | } |
| 117 | rfid_m_nextsample--; |
117 | rfid_m_nextsample--; |
| 118 | rfid_m_lastbit = bit; |
118 | rfid_m_lastbit = bit; |
| 119 | } |
119 | } |
| 120 | 120 | ||
| 121 | void rfid_handlebit( uint8_t bit ) { |
121 | void rfid_handlebit( uint8_t bit ) { |
| 122 | 122 | ||
| 123 | if( bit ) { |
123 | if( bit ) { |
| 124 | rfid_data[rfid_ptr>>3] |= 1<<(rfid_ptr&7); |
124 | rfid_data[rfid_ptr>>3] |= 1<<(rfid_ptr&7); |
| 125 | } else { |
125 | } else { |
| 126 | rfid_data[rfid_ptr>>3] &= ~(1<<(rfid_ptr&7)); |
126 | rfid_data[rfid_ptr>>3] &= ~(1<<(rfid_ptr&7)); |
| 127 | } |
127 | } |
| Line 152... | Line 152... | ||
| 152 | TCCR1A = (0<<WGM11)|(0<<WGM10); |
152 | TCCR1A = (0<<WGM11)|(0<<WGM10); |
| 153 | TCCR1B = (0<<WGM13)|(1<<WGM12)|(2<<CS20); // CTC OCR1A top, prescaler 8 |
153 | TCCR1B = (0<<WGM13)|(1<<WGM12)|(2<<CS20); // CTC OCR1A top, prescaler 8 |
| 154 | OCR1A = (RFID_BITLENGTH*F_CPU/RFID_OSR/RFID_FREQ/8)-1; |
154 | OCR1A = (RFID_BITLENGTH*F_CPU/RFID_OSR/RFID_FREQ/8)-1; |
| 155 | TIMSK1 = (1<<OCIE1A); |
155 | TIMSK1 = (1<<OCIE1A); |
| 156 | 156 | ||
| 157 | gpio_set_in( |
157 | gpio_set_in( RFID_READ_PIN ); |
| 158 | - | ||
| 159 | gpio_set_out( EXP_M ); |
- | |
| 160 | } |
158 | } |
| 161 | 159 | ||
| 162 | uint8_t rfid_fetch( uint8_t *version, uint32_t *tag ) { |
160 | uint8_t rfid_fetch( uint8_t *version, uint32_t *tag ) { |
| 163 | uint8_t colchksum; |
161 | uint8_t colchksum; |
| 164 | 162 | ||