PIC 16F877A e I2C

Hola a todos.
Necesito hacer un programa en ensamblador para controlar un RTC, concretamente el pcf 8583. el problema es que no me funciona el protocolo I2C no consigo enviar ni recibir tramas. este es el codigo que utilizo:

Código:
#include <p16F877a.inc>
ERRORLEVEL -302
ERRORLEVEL -203
ERRORLEVEL -205
 
 
#define fosc d'8000000'
#define clock d'100000'
#define valor_SPADD_baud (fosc/(4*clock))-1
 
cblock 0X30
DIRECCION
DATO
endc
 
org 0
GOTO INICIO
 
org 4
GOTO INT_RECEPCION
 
#include <INICIALIZACION.asm>
#include <MICRORETARDO.asm>
#include <RETARDO.asm>
#include <P1 E5.asm>
#include <P2 E5.asm>
#include <P3 E1.asm>
 
 
INICIO
CALL INICIALIZACION
BANKSEL PORTC
CLRF PORTC
BSF STATUS, RP0 
MOVLW 0X06
MOVWF ADCON1 ; Todas las entradas digitales 
MOVLW 0x18
MOVWF TRISC ; RC4 y RC3 como entradas
BANKSEL SSPADD
MOVLW valor_SPADD_baud
MOVWF SSPADD ; Oscilador de 100 MHz
BANKSEL SSPSTAT
CLRF SSPSTAT ; CKE a ‘0’, control habilitado, etc.
BANKSEL SSPCON
MOVLW 0X2E
MOVWF SSPCON ; SPEN a ‘1’, Modo maestro-7 bits
 
BANKSEL SSPCON2
BSF SSPCON2,0 ; condicion de START
 
TRANSMISION
MOVLW 0X30
MOVWF DIRECCION
BANKSEL SSPSTAT
BTFSC SSPSTAT,2 ; Se comprueba R_W
GOTO TRANSMISION
BANKSEL SSPBUF
MOVLW 0X02 ; Trasmite direccion (¿7 bits?)
MOVWF SSPBUF
; Nivelbajo SCL (automatico?)
ESPERAREC1 
BANKSEL SSPCON2 
BTFSC SSPCON2,6 ; Comprueba ACK
GOTO ESPERAREC1
BANKSEL SSPBUF
MOVF SSPBUF,0 ; Lee dato (¿incrementa dir?)
MOVWF DATO
; Dir. indirecto?
INCF DIRECCION,1 ; Incr. contador
MOVF DIRECCION,0 
SUBLW 0X36
BTFSS STATUS,Z
GOTO ESPERAREC1 
BSF SSPCON2,2 ; Genera condicion de STOP
GOTO FINTRANS
 
 
FORMATO
 
 
FINTRANS 
; MOVLW 0X30
; MOVWF DIRECCION_DATO2 
; INCF DIRECCION_DATO2
 
INT_RECEPCION
 
GOTO FINTRANS
END



esta incompleto, pero hasta aqui deberia tranmitir el 8583, no?
espero que alguien me pueda echar un cable.
muchas gracias!
 
Última edición por un moderador:
Yo hice funcionar un RTC Ds1302 pero su forma de comunicacion es algo distinta al protocolo I2c ya que utiliza 3 pines :

1.- clock
2.- I/O
3.- E (se debe poner a "1" para que exista comunicacion)

la hoja de datos del Ds1302 tiene todos los datos de como se debe hacer la comunicacion y como es cada trama sea de tx del RTC al micro o de escritura al RTC.
 
Atrás
Arriba