|
发表于 2010-4-28 23:49:38
|
显示全部楼层
前段时间做了个ATMEGA88 + EM4095的项目,也是125Khz的曼码解码的问题。数据格式如下:
// EM type (Read only) data format
// 1111 11111 = Header = 9 bit?
// xxxxP, xxxxp= Custom #1,#2 = 10 bit
// xxxxP,xxxxP = data #1,#2 = 10 bit
// xxxxP,xxxxP = data #3,#4 = 10 bit
// xxxxP,xxxxP = data #5,#6 = 10 bit
// xxxxP,xxxxP = data #7,#8 = 10 bit
// PPPP0 = 4 Parity + 1 stop = 5 bit
// data 55 bits + header 9 bits =64 bits?
// Manchester code detecting method
// Header (9 bits)
// ______--__--__--__--__--__--__--__--__-- (wave)
// 0-0 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 0-1 (edge)
// (x) (1) (1) (1) (1) (1) (1) (1) (1) (1) (code)
// Custom-ID (10 bits)
// --__--__--__--__--__--____----__--____-- (wave)
// 1-0 1-0 1-0 1-0 1-0 1-0 0-1 1-0 1-0 0-1 (edge)
// (0) (0) (0) (0) (0) (0) (1) (0) (0) (1) (code)
// D7 D6 D5 D4 Pr D3 D2 D1 D0 Pr (Pr =parity)
// find manchester pattern in received bits
// output is number of received bits =bit_trans_num
还是给段数据捕获的代码吧
/*
* PB0/ICP capture interrupt
* captured 16 bit ICR1 register read 1st low byte
* current edge direction change to reserse edge direction
*/
#pragma vector = TIMER1_CAPT_vect
__interrupt void TIMER1_CAPT_handler( void )
{
/* temporary of capture value */
uint16_t value = 0;
/* tempprary of width calc */
uint16_t width = 0;
//////barry test////////
/* tempprary of data save */
uint8_t save = 0;
/* Read low byte first (important)*/
value =ICR1L; // Read low byte first (important)
value |=(int)ICR1H << 8; // Read high byte and shift into top byte
if (edge_dir)
{
/* change ICP capture direction of edge. */
TCCR1B &= ~0x40;
/* ICP capture direction edge to riging, for next capture direction is falling. */
TCCR1B |= 0x20;
edge_dir = 0;
}
else
{
/* ICP capture direction edge to falling, for next capture direction is rising. */
TCCR1B &= ~0x20;
TCCR1B |= 0x40;
edge_dir = 1;
}
/* width = new captured width - old captured width */
width = value - old_width;
/* update old captured width for next width calc */
old_width = value;
/* receiving manchester code from RFID card
* 1st received bit must be 1 for 1st bit is header after reset,
* if pulse width is more than 40 than received bit to invert
*/
if ( width > 40 ) /* narrow pulse width is under 32 */
{
/* LED dislplay, debug indictor for input bits */
if (bit_value)
PORTC &= ~LED;
else
PORTC |= LED;
/* received bit is inverting */
bit_value = ~bit_value;
//////barry test////////
save = 1;
/* skip bit stire when bit inverted? */
bit_saved = 0;
}
/* will be bit store? */
if (bit_saved)
{
/* LED dislplay, debug indictor for input bits */
if (bit_value)
PORTC &= ~LED;
else
PORTC |= LED;
save = 1;
}
/* Check continues nine '1'*/
if(save)
{
if(!head_find)
{
if(bit_value)
{
/* save inverted bit */
rf_bit_store(bit_value);
/* increament number if saved bits */
if(++bit_trans_num == 9)
{
head_find = 1;
}
}
else
{
rf_fill_buff(16);
bit_trans_num = 0;
}
}
else
{
/* save inverted bit */
rf_bit_store(bit_value);
/* increament number if saved bits */
++bit_trans_num;
}
}
/* skip next store for next bit */
bit_saved = ~bit_saved;
} |
|