Boa tarde a todos, estou fazendo uma interface entre o PIC16F628 e o CI Registrador de deslocamento 74HC166, o que está acontecendo é o seguinte, a comunicação entre os dois fica ok se eu fizer a leitura de um bit por vez, o problema é que se eu quizer ler mais de um bit por vez os dados viram a mior bagunça.
se alguem poder dar uma força.... eu ficarei muito grato.
O programa é todo em ASM ok.
A rotina é essa.
;********************************************************************
; ROTINA PARA LEITURA DO SN74HC166N *
;********************************************************************
LER
CALL LER_74166 ; VAI PARA LER O PRIMEIRO BYTE
MOVFW VALOR ; COPIA O VALOR LIDO PARA
MOVWF INPUT_0 ; O REGISTRADOR TEMPORARIO DO 1° BYTE
;DECFSZ AUX_BYTES,1 ; TERMINOU O NUMERO DE BYTES?
;GOTO $+2 ; NAO, ENTAO LER O PROXIMO
RETURN ; SIM, RETORNA
LER_74166 ; ROTINA PARA LEITURA DOS BITS
MOVFW N_BITS ; COPIA O NUMERO DE BITS A SER CONTADO
MOVWF AUX_BITS ; PARA O REGISTRADOR AUXILIA DA CONTAGEM
BSF CLOCK_74166 ; POE EM 1 O PINO CLOCK(7) DO 74166
BSF ENABLE_74166 ; POE EM 1 O PINO SH/LD(15) DO 74166
; OS PASSOS A CIMA SAO PARA INICIALIZACAO DO CI, O PINO 15 EM 1
;DEIXA LIVRE A ENTRADA DE DADOS 'SEIAIS'ATRAVEZ DO PINO 1
BCF ENABLE_74166 ; DA UM PULSO NEGATIVO NO PINO 15 DO 74166
BCF CLOCK_74166 ; POE A 0 O PINO CLOCK(7)
BSF CLOCK_74166 ; VOLTA A 1 O PINO CLOCK
BSF ENABLE_74166 ; VOLTA A 1 O PINO SH/LD
; OS PASSOS A CIMA SAO FIETOS A FIM DE CARREGAR OS DADOS CONTIDOS
; NA ENTRADA PARALELA PARA OS FLIP FLOPS INTERNOS, COM UM PUSLO A 0 DO PINO
; SH/LD(15), OS DADOS SÃO CARREGADOS, E NA PROXIMA TRASICAO DE 0 PARA 1 NO CLOCK
; OS DADOS SAO SALVOS INTERNAMENTES, SENDO O VALOR DO BIT MSB JÁ ESTANDO PRESENTE
; NA SIDA QH(13) DO CI 74166
CONT_IN ; AQUI COMECA A LEITURA DOS BITS
BCF STATUS,C ; DESLIGA O PINO C DE STATUS
BTFSC DADO_74166 ; TESTA O VALOR DO 1° BITS LIDO SE 1 OU 0
BSF STATUS,C ; SE 1, ROTACIONA O VALOR COM O BIT EM 1
RLF VALOR,1 ; SE 0, ROTACIONA O VALOR COM O BIT EM 0
DECFSZ AUX_BITS,1 ; VERIFICA SE TERMINOU A CONTAGEM DOS BITS
GOTO SERIAL_CLOCK ; SE NÃO, DESVIA PARA DA UM NOVO CLOCK
GOTO SAIR ; SE SIM, DEVIA PARA SAIR DA ROTINA
SERIAL_CLOCK
BCF CLOCK_74166 ; AQUI E UMA ROTINA PARA GERAR UM NOVO
BSF CLOCK_74166 ; CLOCK COM TRANZICAO DE 0 PARA 1
GOTO CONT_IN ; LE UM NOVO BIT
SAIR
RETURN ; RETORNA DA COM O VALOR NAS ENTRADAS PARALELAS
; SALVO NA VARIÁVEL 'VALOR'
;############################################################################