Pues nada despues de conseguir comunicarme con una memorio eeprom por i2c ahora lo estoy intentando con el famoso calendario de dallas ds1307.
De momento consigo solamente escribirlo y leerlo a duras penas, y digo a duras penas porque no lo acabo de entender bien. Decir q utilizo el mplab v8 y el proteus 7.1 sp.4
Os pego el codigo y a ver si podeis ayudarme.
;**********************************************************************
;
; Filename: CONTROL I2C
; Date: 25.03.08
; File Versión: *.*
;
; Autor: LUCIANO GARCÍA ALMENA
; Company: TECNOCAT
;
;
;**********************************************************************
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; processor specific variable definitions
ERRORLEVEL -302
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
;**********************************************************************
BYTE_I2C EQU 20
RAM EQU 21
EPROM0 EQU 22
EPROM1 EQU 23
EPROM2 EQU 24
EPROM3 EQU 25
EPROM4 EQU 26
ORG 0X00 ; processor reset vector
NOP
GOTO INICIO
ORG 0X05
INICIO
CALL CONFIGURACION
BSF STATUS,RP0
BCF STATUS,RP0
BCF OPTION_REG,NOT_RBPU
MOVLW B'11111111'
MOVWF TRISB
BTFSC PORTB,0
PROGRAMA
NOP
CALL S_START ;start
MOVLW B'11010000' ; byte identificador a W
CALL S_BYTE ; envio de byte en W, que es identificador
ESCRIBE
MOVLW 0X00 ; direccion alta
CALL S_BYTE ; envio de direccion alta
MOVLW 0X08 ; direccion alta
CALL S_BYTE ; envio de direccion alta
MOVLW 0X18 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW 0X37 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW 0X14 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW 0X02 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW 0X04 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW 0X04 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW 0X08 ; direccion baja
CALL S_BYTE ; envio de DATO
MOVLW B'00010000'
CALL S_BYTE
CALL S_STOP
LEER
CALL S_START ;start
MOVLW B'11010000' ; byte identificador a W
CALL S_BYTE ; envio de byte en W, que es identificador
MOVLW 0X0F ; direccion alta
CALL S_BYTE ; envio de direccion alta
CALL S_STOP
CALL S_START
MOVLW B'11010001' ; byte identificador a W
CALL S_BYTE
CALL R_BYTE
MOVWF EPROM0
CALL S_STOP
CALL Retardo_100ms
CALL S_START ;start
MOVLW B'11010000' ; byte identificador a W
CALL S_BYTE ; envio de byte en W, que es identificador
MOVLW 0X0E ; direccion alta
CALL S_BYTE ; envio de direccion alta
CALL S_STOP
CALL S_START
MOVLW B'11010001' ; byte identificador a W
CALL S_BYTE
CALL R_BYTE
MOVWF EPROM1
CALL S_STOP
UNO
NOP
GOTO UNO
INCLUDE <I2C.INC>
INCLUDE <RETARDOS.INC>
END
Como veis lo que hago en la primera parte del programa "ESCRIBE" es configurar y darle los valores de inicio en la fecha, cosa q me va bien, pero en la segunda parte "LEER" la cosa se complica como veis pongo unos registros a leer pero no funciona bien la cosa. Si solo leo un registro siempre me funciona bien da igual el registro q lea, pero si es mas de uno ya la cosa no va bien, alomejor el segundo registro se me almacena en la posicion donde yo habia puesto q se me guardara el tercero y en donde yo habia puesto q se me almacenara el segundo siempre aparece un valor erroneo. Puede ser por cosa de tiempos tengo q dejar algun tiempo entre lectura y lectura o alguna configuracion en el proteus para la comunicacion o el calendario?. No se a ver si podeis echarme un cable.
;Libreria para comunicacion I2C
;S_STAR es la rutina de start
;S_STOP es la rutina de stop
;S_BYTE es la rutina de enviar byte
;R_BYTE es la rutina de recivir byte.
;-----------------INICIO, CONFIGURACION DE PTOS Y I2C-------------------
CONFIGURACION
;-----------------INICIO, CONFIGURACION DE PTOS Y I2C-------------------
CALL BANK_1 ; TE CAMBIAS AL BANCO 1
MOVLW 0FFH
MOVWF TRISC
MOVLW B'10000000'
MOVWF SSPSTAT
MOVLW .9
MOVWF SSPADD
CALL BANK_0 ; TE CAMBIAS AL BANCO 0
MOVLW B'00101000'
MOVWF SSPCON
RETURN
;-------------RUTINAS I2C-------------------
S_START
BCF PIR1,SSPIF ; CON ACK
CALL BANK_1
BSF SSPCON2,SEN
CALL BANK_0
START_W
BTFSS PIR1,SSPIF
GOTO START_W
RETURN
S_STOP
BCF PIR1,SSPIF ; CON ACK
CALL BANK_1
BSF SSPCON2,PEN
CALL BANK_0
STOP_W
BTFSS PIR1,SSPIF
GOTO STOP_W
RETURN
S_BYTE
BCF PIR1,SSPIF ; CON ACK
MOVWF SSPBUF
SEND_B
BTFSS PIR1,SSPIF
GOTO SEND_B
RETURN
R_BYTE
CALL BANK_1
BSF SSPCON2,RCEN
CALL BANK_0
READ_W
BTFSS PIR1,SSPIF
GOTO READ_W
BCF PIR1,SSPIF
CALL BANK_1
BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
CALL BANK_0
ACK_W
BTFSS PIR1,SSPIF
GOTO ACK_W
BCF PIR1,SSPIF
MOVF SSPBUF,W
RETURN
ACK
BTFSS PIR1,SSPIF
GOTO ACK
BCF PIR1,SSPIF
RETURN
;---------------------------BANCOS------------------
BANK_0
BCF STATUS,RP0
BCF STATUS,RP1
RETURN
BANK_1
BSF STATUS,RP0
BCF STATUS,RP1
RETURN
BANK_2
BCF STATUS,RP0
BSF STATUS,RP1
RETURN
BANK_3
BSF STATUS,RP0
BSF STATUS,RP1
RETURN
os adjunto tambien mi archivo de proteus. Gracias de antemano.