Autor Tema: Y seguimos con el i2c  (Leído 1489 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado caeshark_

  • PIC10
  • *
  • Mensajes: 41
Y seguimos con el i2c
« en: 14 de Abril de 2008, 14:03:48 »
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.

Código: [Seleccionar]
;**********************************************************************
;                                                                     
;    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.
Código: [Seleccionar]
;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.

« Última modificación: 14 de Abril de 2008, 17:26:36 por caeshark_ »