Ir ao conteúdo
  • Cadastre-se

Memória I2C com PIC


Felipe Electronic

Posts recomendados

Salve pessoal, então estou fazendo um projeto aqui, em que precisarei ler uma memoria I2C, fiz o seguinte código para teste.

porém nada acontece quando aperto o botao para mostrar o dado lido

eis o codigo:

;I2C para teste
;Projeto sense
;Autor: Felipe Neves
;Data: 03/07/2009

LIST P = PIC16F877A
#INCLUDE "P16F877A.INC"
RADIX DEC

__CONFIG _CP_OFF & _CPD_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
;*****************************************************************
;VARIAVEIS E CONSTANTES
CBLOCK 0X0020
C1
C2
C3
EETMP
FLAG
END_H
END_L
BUFFER
ENDC
;******************************************************************
;DEFINIÇÕES DO MICROCONTROLADOR:
#DEFINE BTESCREVE PORTB,0
#DEFINE BTLE PORTB,1
#DEFINE BTMOSTRA PORTB,2
#DEFINE VENTIL PORTC,2
#DEFINE SCL PORTC,3
#DEFINE SDA PORTC,4
#DEFINE LEDS PORTD
#DEFINE F_ERRO FLAG,0
#DEFINE FLAG2 FLAG,1
#DEFINE FLAG3 FLAG,2
#DEFINE BANK0 BCF STATUS,RP0
#DEFINE BANK1 BSF STATUS,RP0
;*******************************************************************
;DIREÇÕES DO PROGRAMA

ORG 0X0000
GOTO START
;********************************************************************
;ROTINA DE CONFIGURAÇÃO DO PIC
;NOME: START

START:
CLRF PORTA ; GARANTE TODAS AS SAÍDAS EM ZERO
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE

BANK1 ; SELECIONA BANCO 1 DA RAM

MOVLW B'11111111'
MOVWF TRISA ; CONFIGURA I/O DO PORTA

MOVLW B'11111111'
MOVWF TRISB ; CONFIGURA I/O DO PORTB

MOVLW B'11110101'
MOVWF TRISC ; CONFIGURA I/O DO PORTC

MOVLW B'00000000'
MOVWF TRISD ; CONFIGURA I/O DO PORTD

MOVLW B'00000000'
MOVWF TRISE ; CONFIGURA I/O DO PORTE

MOVLW B'11011111'
MOVWF OPTION_REG ; CONFIGURA OPTIONS
; PULL-UPs DESABILITADOS
; INTER. NA BORDA DE SUBIDA DO RB0
; TIMER0 INCREM. PELO CICLO DE MÁQUINA
; WDT - 1:128
; TIMER - 1:1

MOVLW B'00000000'
MOVWF INTCON ; CONFIGURA INTERRUPÇÕES
; DESABILITADA TODAS AS INTERRUPÇÕES

MOVLW B'00000111'
MOVWF ADCON1 ; CONFIGURA CONVERSOR A/D
; CONFIGURA PORTA E PORTE COMO I/O DIGITAL

MOVLW B'00010011'
MOVWF SSPADD ; VELOCIDADE: 100KHz @ 8MHz

MOVLW B'10000000'
MOVWF SSPSTAT ; DESABILITA SLEW-RATE CONTROL (100 KHz)

BANK0 ; SELECIONA BANCO 0 DA RAM


MOVLW B'00101000'
MOVWF SSPCON ; HABILITA I2C - MASTER MODE
; CONFIGURA PINOS COMO DA I2C

BSF SCL ; INICIALIZA SCL EM 1
CLRF EETMP
CLRF END_H
CLRF END_L
CLRF BUFFER
MOVLW 04H
MOVWF LEDS
GOTO MAIN
;*************************************************************************
;ROTINA PRINCIPAL
;VARRE OS BOTES E EXECUTA O COMANDO
;NOME: MAIN

MAIN:
BTFSC BTESCREVE
GOTO $+2
CALL ESCREVE
BTFSC BTLE
GOTO $+2
CALL LE
BTFSC BTMOSTRA
GOTO $ + 2
CALL MOSTRA_LEITURA
GOTO MAIN

;**************************************************************************
;ROTINA DE ESCRITA DA EEPROM
;NOME: ESCREVE_EEP

ESCREVE_EEP
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 END_H,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
MOVF END_L,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
RETURN ; RETORNA



;*************************************************************************
;ROTINAS DE CONTROLE DO BARRAMENTO I2C

I2C_ERRO
BANK1 ; ALTERA P/ BANK1
BSF SSPCON2,PEN ; INICIA STOP BIT
BANK0
RETURN

AGUARDA_I2C_LIVRE
BANK1 ; ALTERA P/ BANK1
BTFSC SSPSTAT,R_W ; ESTÁ OCORRENDO ALGUM EVENTO I2C?
GOTO $-1 ; 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
BANK1 ; ALTERA P/ BANK1
BCF SSPCON2,ACKDT ; CARREGA ACK
BSF SSPCON2,ACKEN ; TRANSMITE
BANK0 ; VOLTA P/ BANK0
RETURN

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

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

;*************************************************************************
;ROTINA DE LEITURA DA MEMORIA SERIAL
;NOME: LE_EEP

LE_EEP
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 END_H,W ; ROTACIONA ENDERECO_HIGH
IORLW B'10100011' ; 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 END_L,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 END_H,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

RETURN ; RETORNA
;*************************************************************************
;ROTINA DE TRATAMENTO DO BOTAO ESCREVE
;SOMENTE PARA VISUALIZAÇÃO

ESCREVE
CALL DEBOUNCE
BTFSC BTESCREVE
RETURN
CLRF LEDS
MOVLW 00H
MOVWF END_L
MOVLW 01H
MOVWF END_H
MOVLW 0FH
MOVWF BUFFER
CALL ESCREVE_EEP
RETURN
;**************************************************************************
;ROTINA DE TRATAMENTO DO BOTAO LER
;SOMENTE PARA VISUALIZAÇÃO
LE
CALL DEBOUNCE
BTFSC BTLE
RETURN
CLRF LEDS
MOVLW 00H
MOVWF END_L
MOVLW 01H
MOVWF END_H
CALL LE_EEP
MOVF BUFFER,W
MOVWF EETMP
RETURN
;**************************************************************************
;ROTINA PARA MOSTRAR RESULTADO NOS LEDS
;SOMENTE PARA VISUALIZAÇÃO

MOSTRA_LEITURA
CALL DEBOUNCE
BTFSC BTMOSTRA
RETURN
MOVF EETMP,W
MOVWF LEDS
RETURN
;**************************************************************************
;ROTINA PARA DEBOUNCE
;NOME: DEBOUNCE
DEBOUNCE
MOVLW .50
MOVWF C3
MOVLW .2
MOVWF C2
MOVLW .249
MOVWF C1
NOP
DECFSZ C1,F
GOTO $-2
DECFSZ C2,F
GOTO $-6
DECFSZ C3,F
GOTO $-.10
RETURN
;**************************************************************************
;ACHO QUE É ISSO
END

agradeço a ajuda.

Pessoal, encontrei o defeito, um dos dip switch da minha placa estava com defeito na linha SDA.

moderador pode fechar o tópico.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!