por Guri » 07 Mai 2010 16:51
Bom aquí vai uma linda rotina em asm que recebe os canais de forma correta...
Os créditos deste trabalho são divididos com meu caro amigo Paulo teodoro o qual não tenho notícias a muitos anos:
; *****************
; ** CERTIFICADO **
; *****************
BTFSS PIR1, RCIF ; TEST RECEPTION INTERRUPT
GOTO INT_EXIT ; FALSE, THEN RETURN
BTFSC RCSTA, OERR ; TEST OVERRUN ERROR
GOTO RX_RESET ; YES, GOTO SERIAL MODULE RESET
BTFSC RCSTA, FERR ; TEST FRAMMING ERROR
BSF _FERR ; YES, SAVE INFO
MOVF RCREG, W ; DOWNLOAD BYTE RECEIVED
MOVWF RX_DATA ; AND TRANSFER TO RAM
BCF PIR1, RCIF ; CLEAR INTERRUPT FLAG
BCF CTRL_DIP ; TRAVA LEITURA DO DIP
BTFSC _FERR ; RE-TEST FRAMMING ERROR SAVED IN RAM
GOTO DMX_RESET ; YES, BREAK DETECTED, GOTO DMX RESET
BTFSS _BREAK ; TEST BREAK ALREADY DETECTED
GOTO INT_EXIT ; NO, THEN RETURN
BTFSS _STACODE ; TEST START CODE
GOTO TX_STACODE ; YES, THEN TRANSMIT START CODE
MOVF ADDR_LOW, F ; MOVE ADDRESS LOW
SKPNZ ; AND TEST IT
GOTO CHECK_HI ; ADDRESS LOW = 0, GOTO CHECK HIGH
DECF ADDR_LOW, F ; ADDRESS LOW > 0, THEN DECREMENT IT
GOTO INT_EXIT ; AND GOTO EXIT
CHECK_HI:
MOVF ADDR_HIGH, F ; MOVE ADDRESS HIGH
SKPNZ ; AND TEST IT
GOTO TX_DATA ; ADDRESS LOW & HIGH = 0, THE TRANSMIT DATA
DECF ADDR_HIGH, F ; ADDRESS LOW = 0 & HIGH > 0, DECREMENT IT
MOVLW 0XFF ; ### PT 18.12.2003 ###
MOVWF ADDR_LOW ; ### PT 18.12.2003 ###
GOTO INT_EXIT ; AND GOTO EXIT
RX_RESET:
CLRF CONTROL ; CLEAR CONTROL REG
BCF RCSTA, CREN ; RESET SERIAL MODULE TO CLEAR ERROR
BSF RCSTA, CREN ; ...
GOTO INT_EXIT ; GOTO EXIT
DMX_RESET:
CLRF CONTROL ; CLEAR CONTROL REG
BSF _BREAK ; FLAG BREAK DETECTED
MOVF ADDR_HI, W ; ...
MOVWF ADDR_HIGH ; ...
MOVF ADDR_LO, W ; PICK-UP START DMX ADDRESS
MOVWF ADDR_LOW ; ...
TSTF ADDR_LOW
SKPNZ
GOTO DEC_HI
DECF ADDR_LOW, F
GOTO CONT
DEC_HI:
MOVF ADDR_HIGH, F
SKPNZ
GOTO CONT
DECF ADDR_HIGH, F
MOVLW 0XFF
MOVWF ADDR_LOW
CONT:
MOVF NCHANNELS, W ; PICK-UP NUMBER OF CHANNELS
MOVWF COUNT_CH
#INCLUDE <SEMDMX.INC> ; 8 CICLOS
GOTO INT_EXIT ; EXIT
TX_STACODE:
BSF _STACODE ; SET FLAG
GOTO INT_EXIT ; EXIT
TX_DATA:
MOVF COUNT_CH, W ; O ENDEREÇO DE INICIALIZAÇÃO DA RAM
ADDLW 0X1F ; É 20 H, 1F É POR CAUSA DO DESCONTO
BCF STATUS, IRP ; BANK 0,1
MOVWF FSR ; DE COUNT_CH EM "1"
MOVF RX_DATA, W
MOVWF INDF
BCF STATUS, IRP ; BANK 2,3
DECFSZ COUNT_CH, F ; DECREMENT CHANNELS COUNTER
GOTO INT_EXIT ; AND EXIT
CLRF CONTROL ; IF COUNTER = 0, THEN CLEAR CONTROL REG
INT_EXIT:
POP ; RESTORE REGISTERS
RETFIE ; RETURN FROM INTERRUPT
;---------------
essa rotina aquí é o include da anterior:
;***************
;* CERTIFICADO *
;***************
; *** TIME CALCULADO PARA +/- 10 SEGUNDOS ***
BANK1
MOVLW 10
MOVWF TIME_OCIOSO3
MOVLW 50
MOVWF TIME_OCIOSO2
CLRF TIME_OCIOSO1
BANK0
BCF LIB_TIME_OCIOSO