Subversion Repositories HomeAutomation

Rev

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 "rfid.h"
13
#include <drivers/rfid/rfid.h>
-
 
14
 
14
#include "config.h"
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( sns_rfid_READ_PIN );
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( sns_rfid_READ_PIN );
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