duda protocolo I2C entre 2 dsPIC30F3014

Buenas Tardes,

Me permito escribirles en este foro porque he estado trabajando en el modulo I2c de los dsPIC30F sin mucho exito y soy bastante principiante con el micros y con el lenguaje de ensamblador; lo que he intentado hacer hasta el momento es enviarle a uno de los micros (slave) unos bits de información que se vean en unos leds que tiene en el puerto B. El maestro simplemente esta preguntando por un sensor o pulsador, el cual, cuando esta en estado bajo incrementa un contador y este direcciona el dato que deseo enviar, ya sea el dato 1, el 2, el 3,etc.

Les agradeceria mucho si alguien puede ver algun error o detalle que estoy omitiendo; adjunto los programas tanto de maestro como de slave que llevo hasta el momento.
Muchas gracias por la colaboración que me puedan brindar.

;PROGRAMA MAESTRO:
.INCLUDE "P30F3014.inc"
#INCLUDE "init_dsPIC30F3014.sinit_vi.inc" ;Archivo inicialización agregado al Archivo fuente para LECTURA
.TEXT
.GLOBAL __reset

__reset: MOV #0X0800,W15
MOV #0X08FE,W0
MOV W0,SPLIM
GOTO INICIO

;DELAY DE 1 SEG
DELAY: MOV #17,W3
TRES: MOV #200,W2
DOS: MOV #100,W1
UNO: DEC W1,W1
BRA NZ,UNO
DEC W2,W2
BRA NZ,DOS
DEC W3,W3
BRA NZ,TRES
RETURN

;DELAY 2,46 Mseg
RETARDO1: MOV #10,W9
TRES1: MOV #9,W8
DOS1: MOV #8,W7
UNO1: DEC W7,W7
BRA NZ,UNO1
DEC W8,W8
BRA NZ,DOS1
DEC W9,W9
BRA NZ,TRES1
RETURN

TABLA_DATA: BRA W2
GOTO DATA_0 ;0
GOTO DATA_1 ;2
GOTO DATA_2 ;4
GOTO DATA_3 ;6
GOTO I2C_STOP;8

INICIO:
.GLOBAL _VisualInitialization ;LLAMADO DEL CODIGO DE INICIALIZACIÓN DEL MODULO I2C

;CONFIGURACIONES PUERTOS DE ENTRADA Y SALIDA:
MOV #0XFF,W0
MOV W0,ADPCFG ;CONFIGURACIÓN PUERTO B COMO DIGITAL
;OUTPUTS:
CLR TRISB
BCLR TRISC,#13
BCLR TRISD,#9
BCLR TRISF,#1
BCLR TRISC,#14
BCLR TRISF,#0
;INPUTS:
BSET TRISD,#8
BSET TRISA,#11
;INICIALIZACIÓN DE PUERTOS (SALIDAS):
CLR PORTB
BCLR PORTC,#13
BCLR PORTD,#9
BCLR PORTF,#1
BCLR PORTC,#14
BCLR PORTF,#0
;INICIALIZACIÓN DE REGISTROS:
CLR W0
CLR W1
CLR W2

PROGRAMA: BTSS PORTD,#8
GOTO SECUENCIA
GOTO PROGRAMA

SECUENCIA: BSET PORTC,#14 ;SECUENCIA DE LEDS
BSET PORTD,#9
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#14
BCLR PORTD,#9
BCLR PORTC,#13
CALL DELAY
BSET PORTC,#14
BSET PORTD,#9
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#14
BCLR PORTD,#9
BCLR PORTC,#13
CALL DELAY
BSET PORTC,#14
BSET PORTD,#9
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#14
BCLR PORTD,#9
BCLR PORTC,#13
CALL DELAY
GOTO I2C_PROGRAM

I2C_PROGRAM:
;revisar por software que el bit I2CSTAT<4> este en bajo para garantizar
;que el bus esta en estado IDLE

MOV #0X8000,W0 ;MODULO I2C HABILITADO => Maestro y esclavo
MOV W0,I2CCON

;============= PRIMERO: CONDICIÓN DE INICIO ===============;
BEGIN: ;BTSC I2CSTAT,#S ;¿BUS EN ESTADO IDLE?
; GOTO BEGIN
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#13
CALL DELAY
MOV #0X8001,W0
MOV W0,I2CCON ;CONDICIÓN DE INICIO=> START TRANSMISIÓN
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#13
CALL DELAY
;============= SEGUNDO: ENVIO DIRECCIÓN ===================;
;MASTER TRANSMISSION EVENT: TRANSMISIÓN 7 BITS DE DIRECCIÓN
ENVIO_ADDRESS: MOV #0X04,W0 ;DIRECCIÓN
MOV W0,I2CTRN ;REGISTRO DE TRANSMISIÓN [8 BITS]
;R/W<0>=0=>ESCRITURA R/W<0>=1=>LECTURA

;ASK_TRANSMISION: BTSS I2CSTAT,#TRSTAT ;¿LA TRANSMISIÓN ESTA EN PROGRESO?
; GOTO ASK_ACKNOWLEDGE
; GOTO ASK_TRANSMISION


ASK_ACKNOWLEDGE: BTSS I2CSTAT,#ACKSTAT ;PREGUNTA SI LLEGO EL BIT DE
GOTO ENVIO_DATO ;RECONOCIMIENTO DESDE EL ESCLAVO
GOTO ASK_ACKNOWLEDGE

ENVIO_DATO: BSET PORTC,#14
CALL DELAY
BCLR PORTC,#14
ENVIO_DATO_2: BTSS PORTA,#11
GOTO CONTADOR
GOTO ENVIO_DATO_2

CONTADOR: INC W2,W2
INC W2,W2
GOTO TABLA_DATA

DATA_0: MOV #0X00,W0 ;DATO A TRANSMITIR
MOV W0,I2CTRN
ASK_D_0: BTSS I2CSTAT,#ACKSTAT ;ASK_ACKNOWLEDGE
GOTO ENVIO_DATO
GOTO ASK_D_0

DATA_1: MOV #0X01,W0 ;DATO A TRANSMITIR
MOV W0,I2CTRN
ASK_D_1: BTSS I2CSTAT,#ACKSTAT ;ASK_ACKNOWLEDGE
GOTO ENVIO_DATO
GOTO ASK_D_1

DATA_2: MOV #0X02,W0 ;DATO A TRANSMITIR
MOV W0,I2CTRN
ASK_D_2: BTSS I2CSTAT,#ACKSTAT ;ASK_ACKNOWLEDGE
GOTO ENVIO_DATO
GOTO ASK_D_2

DATA_3: MOV #0X03,W0 ;DATO A TRANSMITIR
MOV W0,I2CTRN
ASK_D_3: BTSS I2CSTAT,#ACKSTAT ;ASK_ACKNOWLEDGE
GOTO ENVIO_DATO
GOTO ASK_D_3

I2C_STOP: MOV #0X8004,W0 ;STOP TRANSMISIÓN
MOV W0,I2CCON
GOTO I2C_STOP
.END
;=====================================================================;
;PROGRAMA ESCLAVO:
.INCLUDE "P30F3014.inc"
#INCLUDE "init_dsPIC30F3014.sinit_vi.inc" ;Archivo inicialización agregado al Archivo fuente para LECTURA
;CONFIG __FWDT,WDT_OFF
;CONFIG __FOSC,CSW_FSCM_OFF & XT_PLL8

.TEXT
.GLOBAL __reset

__reset: MOV #0X0800,W15
MOV #0X08FE,W0
MOV W0,SPLIM
GOTO INICIO


;DELAY DE 1 SEG
DELAY: MOV #17,W3
TRES: MOV #200,W2
DOS: MOV #100,W1
UNO: DEC W1,W1
BRA NZ,UNO
DEC W2,W2
BRA NZ,DOS
DEC W3,W3
BRA NZ,TRES
RETURN

INICIO:
.GLOBAL _VisualInitialization ;LLAMADO DEL CODIGO DE INICIALIZACIÓN DEL MODULO I2C

;CONFIGURACIONES PUERTOS DE ENTRADA Y SALIDA:
;OUTPUTS:
CLR TRISB
BCLR TRISC,#13
NOP
BCLR TRISC,#14
BCLR TRISD,#9
BCLR TRISF,#0
NOP
BCLR TRISF,#1
;INPUTS:
BSET TRISD,#8
BSET TRISA,#11

;INICIALIZACIÓN DE PUERTOS (SALIDAS):
CLR PORTB
BCLR PORTC,#13
NOP
BCLR PORTC,#14
BCLR PORTD,#9
BCLR PORTF,#0
NOP
BCLR PORTF,#1
;INICIALIZACIÓN DE REGISTROS:
CLR W0
CLR W1

;============= PRIMERO: MODULO HABILITADO ===============;
I2C_PROGRAM: MOV #0X8000,W0 ;MODULO I2C HABILITADO => Maestro y esclavo
MOV W0,I2CCON
;DIRECCIÓN ESPECIFICADA PARA ESTE ESCLAVO:
MOV #0X04,W0 ;DIRECCIÓN
MOV W0,I2CADD

;DETECCIÓN DE INICIO
BEGIN: BTSS I2CSTAT,#S
GOTO BEGIN
ASK_STAT: BTSC I2CSTAT,#R_W
GOTO ASK_STAT
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#13
GOTO RX_DATA
RX_DATA: BTSS I2CSTAT,#RBF
GOTO RX_DATA
GOTO DISPLAY_DATA

DISPLAY_DATA: BTSS I2CSTAT,#D_A ;D_A<1>= RECIBIO DATO D_A<0>= RECIBIO ADDRES
GOTO DISPLAY_DATA
BSET PORTC,#13
CALL DELAY
BCLR PORTC,#13
MOV I2CRCV,W0
MOV W0,PORTB
GOTO DISPLAY_DATA;RX_DATA

.END
 
Atrás
Arriba