ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
89541 Топик полностью
Леонид Иванович (17.05.2007 11:53, просмотров: 2) ответил Aдикм на Спасибо, ознакомлюсь.
Если интересно, реализация Wiegand на ASM AVR: 
;----------------------------------------------------------------------------

;Wiegand interface module

;----------------------------------------------------------------------------

#define WG26BIT				;select 26 bit wiegand
;#define WG34BIT			;select 34 bit wiegand

;----------------------------------------------------------------------------

;Constantes:

.equ	PWDTH	= 50			;pulse width, uS
.equ	RATE	= 1000			;wiegand bit rate, uS

;----------------------------------------------------------------------------

;Derivated constantes:

.equ	PW = PWDTH*FCLK/4000000
.if  PW > MAXBYTE
.error "out of range constant"
.endif

.equ	WRT = (RATE*FOUT)/500
.if  PW > MAXBYTE
.error "out of range constant"
.endif

;----------------------------------------------------------------------------

.DSEG	;Data segment

wgDat:	.byte	5			;wiegand data buffer (MSB first)
wgCnt:	.byte	1			;TX bit counter

;----------------------------------------------------------------------------

.CSEG	;Code segment

;----------------------------------------------------------------------------

;Begin TX via wiegand:

wgTX:	ldy	wgDat
	ld	temp,Y+
	rcall	Parity			;byte 1 parity
	mov	XL,temp
	ld	temp,Y+

#ifdef	WG34BIT

	rcall	Parity			;byte 2 parity
	lsl	temp
	or	temp,XL
	rcall	Parity			
	ror	temp			;C - even parity

	ldy	wgDat
	ld	temp,Y
	ror	temp			;shift byte 1
	st	Y+,temp

	ld	temp,Y
	ror	temp			;shift byte 2
	st	Y+,temp

	ld	temp,Y
	mov	XL,temp
	ror	temp			;shift byte 3
	st	Y+,temp

	ld	temp,Y
	mov	XH,temp
	ror	temp			;shift byte 4
	st	Y+,temp

	ldi	temp,0
	ror	temp			;shift byte 5
	push	temp

	mov	temp,XL		
	ldi	ZL,34

#endif

#ifdef	WG26BIT

	andi	temp,0xF0
	rcall	Parity			;byte 2 parity
	lsl	temp
	or	temp,XL
	rcall	Parity			
	ror	temp			;C - even parity

	ldy	wgDat
	ld	temp,Y
	ror	temp			;shift byte 1
	st	Y+,temp

	ld	temp,Y
	mov	XL,temp
	ror	temp			;shift byte 2
	st	Y+,temp

	ld	temp,Y
	mov	XH,temp
	ror	temp			;shift byte 3
	st	Y+,temp

	ldi	temp,0
	ror	temp			;shift byte 4
	push	temp

	mov	temp,XL
	andi	temp,0x0F
	ldi	ZL,26
			
#endif

	rcall	Parity			;byte 3(2) parity
	mov	XL,temp
	mov	temp,XH		
	rcall	Parity			;byte 4(3) parity
	lsl	temp
	or	temp,XL
	rcall	Parity
	ldi	XL,0x01
	eor	temp,XL			
	bst	temp,0			;temp.0 - odd parity

	pop	temp
	bld	temp,6			
	st	Y+,temp

	sts	wgCnt,ZL		;request to TX
	ret

;----------------------------------------------------------------------------

;TX wgDat with WRate:

mWieg:	lds	temp,wgCnt		;check	bit counter
	tst	temp
	breq	wgtxc			;wgCnt = 0, return

	bbrc	Flags,WRate,wgtxc
	clbr	Flags,WRate

	dec	temp
	sts	wgCnt,temp		;wgCnt--

	ldy	wgDat+5
	ld	temp,-Y
	rol	temp
	st	Y,temp
	ld	temp,-Y
	rol	temp
	st	Y,temp
	ld	temp,-Y
	rol	temp
	st	Y,temp
	ld	temp,-Y
	rol	temp
	st	Y,temp
	ld	temp,-Y
	rol	temp
	st	Y,temp
	
	brcc	tx_0
tx_1:	Port_Data1_1			;TX 1
	rjmp	tx_d			
tx_0:	Port_Data0_1			;TX 0
tx_d:	rcall	DelPW			;pulse width delay
	Port_Data1_0			;release ports
	Port_Data0_0

wgtxc:	ret

;----------------------------------------------------------------------------

;Calculate parity:
;Input:	temp - byte
;Out:	temp.0

Parity:	mov	Cnt,temp
	swap	Cnt
	eor	Cnt,temp
	mov	temp,Cnt
	lsr	temp
	eor	temp,Cnt
	mov	Cnt,temp
	lsr	temp
	lsr	temp
	eor	temp,Cnt
	andi	temp,0x01
	ret

;----------------------------------------------------------------------------

;Pulse width delay:

DelPW:	ldi	temp,PW
del1:	dec	temp			;1 +
	nop				;1 +
	brne	del1			;2 = 4
	ret

;----------------------------------------------------------------------------

В таймерном прерывании (1 мс) вот это:

	stbr	Flags,wRate

В основном цикле:

        rcall mWieg

Для передачи заполняем данными wgDat и вызываем wgTX. Передача осуществляется в фоновом режиме.