TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Josivan en 02 de Mayo de 2009, 15:46:28
-
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'
;############################################################################
-
Alguém pode dar uma ajuda ai pessoal, ainda não consegui os resultados desejados ok pessoal, aguardo a ajuda.
Francisco Josivan
-
http://www.todopic.com.ar/foros/index.php?topic=24720.msg204913#msg204913
Jossivan dices que si lees un bit cada vez te funciona bien, al ser una transmision serie tienes que leer un bit cada vez.
en la direccion de arriba tienes informacion de la transmision serie del16f628 con ejemplo incluido en asembler, echale un vistazo, comprueba si tienes bien configurados todos los reg. ahi te explica como hacerlo.
tapi8