sexta-feira, 15 de fevereiro de 2008

Código para a recepção RS232

Estive trabalhando no código para a recepção RS232 na porta de joystick. .

Eis um trecho da rotina de recepção de dados, que aguarda pelo Start Bit, tão logo ele seja detectado, recebe os 10 bits da palavra de dados, dentro de um só loop, para simplificar a temporização. Ao final da rotina, flag Carry contém o estado do Stop bit. Note que start bit é descartado, pois ele já havia sido detectado.
Outro detalhe importante é que o primeiro delay é de meio bit, e os subsequentes de 1 bit inteiro. Isso faz com que a amostragem seja feita no meio do tempo de bit, diminuindo assim a taxa de erro. Após o stop bit ser amostrado, ainda temos meio tempo de bit disponível, o que é importante, pois é necessário mudar registro do PSG antes de levantar novamente o sinal CTS, para fazer o PC esperar o MSX processar o dado antes de enviar outro.

;...
WAITSTART: IN A,(PSGRD)
BIT RXD,A ; Start bit?
JR Z,MEIOBIT ;yes, wait 1/2 bit before start
; to acquire samples
BIT RTS,A ; PC stopped TX ?
JR Z,WAITSTART ; No, sample again
JP BREAKERROR

MEIOBIT: LD L,BITTIME ;
SRL L ; divide by two
LD B,10 ; Ten bits.
PROXBIT: CALL DELAYBIT ; Wait Bit Time
RR C ; CY->7...0->CY
IN A,(PSGRD) ; Sample bit
AND RXD
NEG ; Bit RXD->CARRY
LD L,BITTIME ; Reload delay preset
DJNZ PROXBIT ; Wait full bit time before
; get another sample
LD A,(15)
OUT (PSGAD),A ; Select Register 15
LD A,E ; Previous state of reg 15
SET RTS,A
OUT (PSGWR),A ; deassert RTS
LD E,A ; Save state of reg15

JR NC,FRAMERR ; If stop bit=0 an framing
; error has occoured
;...
PROCESSABIT:

Nenhum comentário: