Ajuda no 16f76

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ajuda no 16f76

Mensagempor shhadowzone » 23 Mar 2007 09:27

Estou necessitando de ajuda com relação comunicação I2C no modo mestre utilizando o PIC16F76, me encontro com um exemplo referente ao PIC16F876 só que este MCU tem como efetuar teste de ACK.Segue o exemplo:

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA AGUARDA ATÉ QUE TODOS OS EVENTOS DA I2C ESTEJAM LIBERADOS.

AGUARDA_I2C_LIVRE
BANK1 ; ALTERA P/ BANK1
CLRWDT
BTFSC SSPSTAT,R_W ; ESTÁ OCORRENDO ALGUM EVENTO I2C?
GOTO $-2 ; SIM, ESPERA TERMINAR
MOVF SSPCON2,W
ANDLW B'00011111' ; MASCARA SSPCON2 (ATUALIZA FLAG ZERO)
BTFSS STATUS,Z ; BITS DE EVENTOS LIBERADOS?
GOTO $-3 ; NÃO - AGUARDA
BANK0 ; SIM - VOLTA P/ BANK0
RETURN ; RETORNA

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ACK OUT *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ENVIA UM ACK OUT PARA O BARRAMENTO I2C.

ACK_OUT
BANK1 ; ALTERA P/ BANK1
BCF SSPCON2,ACKDT ; CARREGA ACK
BSF SSPCON2,ACKEN ; TRANSMITE
BANK0 ; VOLTA P/ BANK0
RETURN ; RETORNA

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * NACK OUT *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA ENVIA UM NACK OUT PARA O BARRAMENTO I2C.

NACK_OUT
BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,ACKDT ; CARREGA NACK
BSF SSPCON2,ACKEN ; TRANSMITE
BANK0 ; VOLTA P/ BANK0
RETURN ; RETORNA

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ROTINA PARA TESTAR SE O ACK FOI RECEBIDO *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA TESTA O BIT DE ACK RECEBIDO NO REGISTRADOR SSPCON2. PARA
; FACILITAR O RESTANTE DO SOFTWARE, A ROTINA COPIA ESTE FLAG NO FLAG F_ERRO
; PRESENTE NO BANCO 0 DA RAM, POIS O REGISTRADOR SSPCON2 ENCONTRA-SE NO BANK1.

TESTA_ACK
BANK1 ; ALTERA P/ BANK1
BTFSC SSPCON2,ACKSTAT ; RECEBEU ACK ?
GOTO RECEBEU_NACK ; NÃO - SINALIZA ERRO
; SIM
BANK0 ; VOLTA P/ BANK0
BCF F_ERRO ; LIMPA FLAG DE ERRO
RETURN ; RETORNA

RECEBEU_NACK
BANK0 ; VOLTA P/ BANK0
BSF F_ERRO ; SETA FLAG P/ INDICAR ERRO
RETURN ; RETORNA

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * LEITURA DA EEPROM SERIAL EXTERNA *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA LÊ A MEMÓRIA SERIAL EXTERNA. O ENDEREÇO DEVE SER PASSADO PELAS
; VARIÁVEIS ENDERECO_HIGH E ENDERECO_LOW. O VALOR LIDO É RETORNADO EM BUFFER.
; CASO ALGUM ERRO DE LEITURA OCORRA, A ROTINA DESVIA P/ I2C_ERRO.

I2C_EEPROM_READ
BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,SEN ; INICIA START BIT
BANK0 ; VOLTA P/ BANK0
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO

BCF STATUS,C ; ZERA O CARRY
RLF ENDERECO_HIGH,W ; ROTACIONA ENDERECO_HIGH
IORLW B'10100000' ; JUNTA AO BYTE DE CONTROLE
MOVWF SSPBUF ; TRANSMITE CONTROLE + END_HIGH
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
CALL TESTA_ACK ; CHAMA ROTINA P/ TESTAR ACK
BTFSC F_ERRO ; OCORREU ERRO DE ACK ?
GOTO I2C_ERRO ; SIM - PULA P/ I2C_ERRO
; NÃO
MOVF ENDERECO_LOW,W
MOVWF SSPBUF ; TRANSMITE ENDEREÇO BAIXO
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
CALL TESTA_ACK ; CHAMA ROTINA P/ TESTAR ACK
BTFSC F_ERRO ; OCORREU ERRO DE ACK ?
GOTO I2C_ERRO ; SIM - PULA P/ I2C_ERRO
; NÃO

BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,RSEN ; REINICIA START BIT
BANK0 ; VOLTA P/ BANK0
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO

RLF ENDERECO_HIGH,W ; ROTACIONA ENDERECO_HIGH
IORLW B'10100001' ; JUNTA AO BYTE DE CONTROLE
MOVWF SSPBUF ; TRANSMITE CONTROLE + END_HIGH
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
CALL TESTA_ACK ; CHAMA ROTINA P/ TESTAR ACK
BTFSC F_ERRO ; OCORREU ERRO DE ACK ?
GOTO I2C_ERRO ; SIM - PULA P/ I2C_ERRO
; NÃO

BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,RCEN ; INICIA LEITURA DO BYTE
BANK0 ; VOLTA P/ BANK0
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
MOVF SSPBUF,W
MOVWF BUFFER ; SALVA DADO EM BUFFER
CALL NACK_OUT ; ENVIA NACK --> FIM
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO

BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,PEN ; INICIA STOP BIT
BANK0 ; VOLTA P/ BANK0
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
INCF ENDERECO_LOW,F
RETURN ; RETORNA

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; * ESCRITA NA EEPROM SERIAL EXTERNA *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; ESTA ROTINA GRAVA UM DADO NA MEMÓRIA SERIAL EXTERNA. O ENDEREÇO DEVE SER
; PASSADO PELAS VARIÁVEIS ENDERECO_HIGH E ENDERECO_LOW. O VALOR A SER GRAVADO
; DEVE SER PASSADO EM BUFFER.
; CASO ALGUM ERRO DE GRAVAÇÃO OCORRA, A ROTINA DESVIA P/ I2C_ERRO.

I2C_EEPROM_WRITE
BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,SEN ; INICIA START BIT
BANK0 ; VOLTA P/ BANK0
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO

BCF STATUS,C ; ZERA O CARRY
RLF ENDERECO_HIGH,W ; ROTACIONA ENDERECO_HIGH
IORLW B'10100000' ; JUNTA AO BYTE DE CONTROLE
MOVWF SSPBUF ; TRANSMITE CONTROLE + END_HIGH
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
CALL TESTA_ACK ; CHAMA ROTINA P/ TESTAR ACK
BTFSC F_ERRO ; OCORREU ERRO DE ACK ?
GOTO I2C_ERRO ; SIM - PULA P/ I2C_ERRO
; NÃO
MOVF ENDERECO_LOW,W
MOVWF SSPBUF ; TRANSMITE ENDEREÇO BAIXO
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
CALL TESTA_ACK ; CHAMA ROTINA P/ TESTAR ACK
BTFSC F_ERRO ; OCORREU ERRO DE ACK ?
GOTO I2C_ERRO ; SIM - PULA P/ I2C_ERRO
; NÃO
MOVF BUFFER,W
MOVWF SSPBUF ; GRAVA DADO
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
CALL TESTA_ACK ; CHAMA ROTINA P/ TESTAR ACK
BTFSC F_ERRO ; OCORREU ERRO DE ACK ?
GOTO I2C_ERRO ; SIM - PULA P/ I2C_ERRO
; NÃO
BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,PEN ; INICIA STOP BIT
BANK0 ; VOLTA P/ BANK0
CALL AGUARDA_I2C_LIVRE ; AGUARDA FIM DO EVENTO
INCF ENDERECO_LOW,F
RETURN ; RETORNA

Como eu posso fazer, de preferencia em ASSEMBLY, para verificar este ACK no 16F76???

Lembrando que esta rotina foi desenvolvida por:

WAGNER DA SILVA ZANCO publicado em um de seus Livros publicados pela "Editora Érica".
shhadowzone
Bit
 
Mensagens: 23
Registrado em: 24 Out 2006 07:19

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x