Autor Tema: comunicacion i2c entre dos pic  (Leído 6022 veces)

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

Desconectado jca

  • PIC12
  • **
  • Mensajes: 75
comunicacion i2c entre dos pic
« en: 15 de Noviembre de 2007, 18:32:06 »
Hola a todos, despues de tanto tiempo sin escribir he vuelto... jeje, espero no daros mucha guerra con mis preguntas...
Bueno al lio... estoy embarcado en un proyecto un poco grandecillo, pretendo domotizar mi casa con los pic, ya tengo todo planeado y mas o menos diseñado pero ya veis me he quedado pillao aqui en el I2C, la cosa es que quiero comunicar dos pic por este metodo pq el usart lo tengo reservado para otra cosa, haber...yo programo en asm, la verdad siempre me ha gustado este método aunque reconozco que al final me tendré que poner a aprender otro pq la comunicacion usb creo que es un poco trabajo de chinos.

Aqui os cuelgo el codigo que he hecho que claro esta no funciona, pero vamos que mi fin es que poniendo dos pulsadores en PORTA0 y PORTA1 en ambos pic al dar al primer o al segundo pulsador de uno mande un codigo al otro y viceversa, el código es que si pulsas el boton1 manda un uno y el otro pic devería represntarlo en el PORTB, supongo que sería el mismo programa para los dos solo que cambiando la supuesta dirección que le pongo a cada uno,  creo que esta bastante bien explicado lo que voy haciendo en el código de todas formas si hay alguna duda ya sabeis....
He pensado en ponerlos a los dos como maestro y que funcionen por interrupción, aunque no se muy bien donde poner el código para controlar si hay colisión de datos, en fin vosotros direis...espero no haberos cansado con mi explicación y gracias de antemano!! jeje  :mrgreen:

List   p=16F876A            
#include   "p16F876A.inc"

__CONFIG   _XT_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_ON & _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF

direc_escl   equ   0x30
dato1   equ   0x31

org 0x00

goto Inicio

org   0x04

Inicio
   clrf   PORTB
   clrf   PORTC
   bsf   STATUS,RP0         ;Selecciona banco 1
   bcf   STATUS,RP1
   clrf   TRISB            
   movlw   b'00000110'
   movwf   ADCON1            ;puerto A digital
   movlw   b'11111111'
   movwf   TRISA         ;puerto A como entrada
   movlw   b'00011000'
   movwf   TRISC         ;SDA y SCL como entradas
   movlw   b'10000000'      ;velocidad estardar con
   movwf   SSPSTAT         ;niveles I2C
   movlw   0x09         ;velocidad del bus I2C
   movwf   SSPADD         ;100KHz
   bcf   STATUS,RP0         ;Selecciona banco 0
;configuracion del modo MSSP en modo Master I2C
   movlw   b'00101000'   ;modulo MSSP en on
   movwf   SSPCON
   
esperando
   bsf   STATUS,RP0
   btfsc   SSPSTAT,S   ;detecta si esta el bit de inicio activado   
   goto llamada
   bcf   STATUS,RP0
   btfsc PORTA,0         ;miro tecla1
   goto orden1
   btfsc PORTA,1         ;miro tecla2
   goto orden2
   goto esperando   

llamada
   bcf   STATUS,RP0
   call   read_b   ;lee dato que venga por I2C
   movwf direc_escl
   movlw   0x01
   subwf direc_escl,0         ;se lo resto a dato
   btfss STATUS,2         ;si es 1 es que no me direccionan ami y sigo esperando
   goto esperando
leer_dato   
   call   read_b      ;si soy yo, leo el siguiente dato
   movlw   dato1
   bsf   STATUS,RP0
   btfss   SSPSTAT,P   ;detecta si esta el bit el bit de parada activo
   bcf   STATUS,RP0
   movwf   PORTB
   goto   esperando

orden1
   btfsc   PORTA,0
   goto orden1
   call   start   ;condicion de inicio
   movlw   0x02   ;dirección del esclavo
   call   send_b
   movlw   0x01
   call   send_b
   call   stop
   goto esperando

orden2
   btfsc   PORTA,1
   goto orden2
   call   start   ;condicion de inicio
   movlw   0x02   ;dirección del esclavo
   call   send_b
   movlw   0x02
   call   send_b
   call   stop
   goto esperando

;*************************************************************
;Envio de condicion de inicio
start
   bcf   PIR1,SSPIF   ;restaura el flag de MSSP
   bsf   STATUS,RP0   ;selecciona banco1
   bcf   STATUS,RP1
   bsf   SSPCON2,SEN   ;activa secuencia de inicio
   bcf   STATUS,RP0   ;banco0
start_w
   btfss   PIR1,SSPIF   ;a terminado?
   goto   start_w   ;no, esperar
   return
;**************************************************************
;envio de la secuencia de parada
stop
   bcf   PIR1,SSPIF   ;restaura el flag de MSSP
   bsf   STATUS,RP0   ;selecciona banco1
   bcf   STATUS,RP1
   bsf   SSPCON2,PEN   ;activa secuencia de inicio
   bcf   STATUS,RP0   ;banco0
stop_w
   btfss   PIR1,SSPIF   ;a terminado?
   goto   stop_w   ;no, esperar
   return
;*************************************************************
;envio del byte que se encuentra en w vía I2C
;la rutina finaliza cuando se recibe un ACK
send_b
   bcf   PIR1,SSPIF   ;restaura flag
   movwf   SSPBUF   ;lleva byte a buffer de salida
send_b_w
   btfss   PIR1,SSPIF   ;recibido ACK?
   goto send_b_w   ;no, esperar
   return
;***************************************************************
;lee un byte procedente del dispositivo I2C y lo pone en W
;a continuación genera y transmite un ACK
read_b
   bcf   PIR1,SSPIF   ;restaura el flag de MSSP
   bsf   STATUS,RP0   ;selecciona banco1
   bcf   STATUS,RP1
   bsf   SSPCON2,RCEN   ;activa modo receptor
   bcf   STATUS,RP0   ;banco0
read_w
   btfss   PIR1,SSPIF   ;a terminado?
   goto   read_w   ;no, esperar
   bcf   PIR1,SSPIF   ;restaura el flag de MSSP
   bsf   STATUS,RP0   ;selecciona banco1
   bcf   STATUS,RP1
   bcf   SSPCON2,ACKDT   ;bit ACK a 0
   bsf   SSPCON2,ACKEN   ;activa generacion ACK
   bcf   STATUS,RP0   ;banco0
ack_w
   btfss   PIR1,SSPIF   ;a terminado?
   goto   ack_w   ;no, esperar
   movf   SSPBUF,W   ;si, lee el byte recibido
   return

END
« Última modificación: 16 de Noviembre de 2007, 22:02:17 por jca_21_yo »

Desconectado jca

  • PIC12
  • **
  • Mensajes: 75
Re: comunicacion i2c entre dos pic
« Respuesta #1 en: 17 de Noviembre de 2007, 12:35:08 »
Que raro... nadie sabe nada de esto? nadie me dice nada? :(
1Saludo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: comunicacion i2c entre dos pic
« Respuesta #2 en: 17 de Noviembre de 2007, 13:33:40 »
No me he puesto a ver tu código pero si he visto que quieres usar I2C para domotizar tu casa? qué distancia tendrán los dispositivos entre si?

El i2c fue concebido para ser utilizado con integrados en un mismo PCB, la capacidad máxima de la línea no debe superar los 400pF.  Si tienes un largo de cable importante, ya te estarás yendo de normal, ni hablar si encima tienes contaminacion por ruido de 50/60 Hz.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado jca

  • PIC12
  • **
  • Mensajes: 75
Re: comunicacion i2c entre dos pic
« Respuesta #3 en: 19 de Noviembre de 2007, 15:28:33 »
Hola maunix gracias por lo menos por decirme algo...., si es un proyecto domótico, pero el i2c lo quiero para comunicar dos pic que estan en una misma placa, y aqui sigo, dandole vueltas y todavía no funciona.....

1Saludo.....

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: comunicacion i2c entre dos pic
« Respuesta #4 en: 20 de Noviembre de 2007, 05:26:55 »
Hola maunix gracias por lo menos por decirme algo...., si es un proyecto domótico, pero el i2c lo quiero para comunicar dos pic que estan en una misma placa, y aqui sigo, dandole vueltas y todavía no funciona.....

1Saludo.....
Hola amigo!
pero habia que ver como tu ha implementado el Slave! :x

Desconectado jca

  • PIC12
  • **
  • Mensajes: 75
Re: comunicacion i2c entre dos pic
« Respuesta #5 en: 20 de Noviembre de 2007, 16:15:55 »
Hola stk el slave? como expliqué ahi arriba pensé en poner los dos como maestros y que funcionasen por interrupción, por lo tanto no hay programa para el esclavo, es el mismo programa para los dos....

1Saludo....

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: comunicacion i2c entre dos pic
« Respuesta #6 en: 21 de Noviembre de 2007, 07:42:59 »
Hola no me hagas mucho caso, te cuento por si te da alguna idea. Si tienes los dos como master, "yo" gestionaria la llegada de datos activando la interrupcion del i2c, cada vez que uno de los pic se hace con el bus como master y envia un byte, cuando ha terminado de recibirlo en SSPBUF el segundo, este salta al vector 04 del programa y atiende al dato recibido por ej mostrandolo en un puerto para hacer pruebas
prueba habilitando la interrupcion y poniendo algo parecido a esto o lo que necesites que haga cuando llega un dato

Código: ASM
  1. ORG             0X04            ;VECTOR DE INTERRUPCION
  2.                         goto             INTERUUPCION
  3.  
  4. INTERRUPCION
  5.                         MOVWF   W_TEMP
  6.                         SWAPF   STATUS,W
  7.                         CLRF    STATUS
  8.                         MOVWF   STATUS_TEMP
  9.                         MOVF    PCLATH,W
  10.                         MOVWF   PCLATH_TEMP
  11.                         CLRF    PCLATH
  12.                        
  13.                        
  14.                         BTFSC   PIR1,SSPIF
  15.                         GOTO    INT_SSP
  16.                        
  17.                         GOTO    FIN_INT
  18.                        
  19.        
  20.                        
  21. INT_SSP
  22.                         BCF             STATUS,RP0
  23.                         MOVF    SSPBUF,W
  24.                         MOVWF   PORTD
  25.                         GOTO    FIN_INT
  26.                                        
  27. FIN_INT         CLRF    PIR1
  28.                         CALL     CONFIG_INTERRUPTS       ;call que activa el tipo de intrrupciones y limpia los flags
  29.                                                
  30.                         MOVF    PCLATH_TEMP,W
  31.                         MOVWF   PCLATH
  32.                         SWAPF   STATUS_TEMP,W
  33.                         MOVWF   STATUS
  34.                         SWAPF   W_TEMP,F
  35.                         SWAPF   W_TEMP,W                       
  36.                         RETFIE
espero te de alguna idea
un saludo

Desconectado Khael

  • PIC10
  • *
  • Mensajes: 10
Re: comunicacion i2c entre dos pic
« Respuesta #7 en: 24 de Noviembre de 2007, 13:42:55 »
Hola brother ... mira yo soy nuevo en esto de los pics perome toco hacer algo parecido a lo que tu quieres hacer asi que esto es lo que me salio...
Son dos programas diferentes , uno para el esclavo y otro para el master ... la idea es que se teclee en un pic una letra , se displaye y luego se envie para que el otro lo reciba...  ami manera de ver he tratado de seguir los datos de la hoja de datos , (valga la redundancia) , pero no me resulta al simularlo en proteus... a ver si opinas algo ps...

"Este es el código del master"

   list      p=16f877A   ; list directive to define processor
   #include   <p16f877A.inc>   ; processor specific variable definitions
   include      <MacrosJOM.inc>
   
   ERRORLEVEL -301
   ERRORLEVEL -302
   __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

;***** VARIABLE DEFINITIONS
PORTB      EQU   0X06      ;
w_temp      EQU   0x7D      ; variable used for context saving
status_temp   EQU   0x7E      ; variable used for context saving
pclath_temp   EQU   0x7F      ; variable used for context saving
indice      EQU 0X70      ; Indice de la tabla   
data1      EQU   0x21
direccion   EQU   b'00000001'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   ORG     0x00             ; processor reset vector

   nop           ; nop required for icd
     goto    main              ; go to beginning of program

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   ORG     0x04             ; interrupt vector location
   movfw   PORTB
   movwf   indice
   goto    RutinaInterrupcion

RutinaInterrupcion
   btfsc   INTCON,RBIF
   goto   IntRB
   goto   SalirInterrupcion

SalirInterrupcion

   movf   pclath_temp,w     ; retrieve copy of PCLATH register
   movwf   PCLATH             ; restore pre-isr PCLATH register contents
   movf    status_temp,w     ; retrieve copy of STATUS register
   movwf   STATUS            ; restore pre-isr STATUS register contents
   swapf   w_temp,f
   swapf   w_temp,w          ; restore pre-isr W register contents
   retfie                    ; return from interrupt

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

main
   Banco1
   movlw   B'00000000'
   movwf   OPTION_REG
   movlw   0xF0
   movwf   TRISB
   clrf   TRISD
   Banco1
   movlw   b'00000000'      ;velocidad estardar con
     movwf   SSPSTAT         ;niveles I2C
   movlw   B'00000000'         ; configurando modo maestro
   movwf   TRISC
   movlw   b'11001000'         ; configurando permisos de interrupcion(GIE=1,PEIE=1 HabIntPeri)
   movwf   INTCON
   movlw   b'00001000'         ; configurando permisos de interrupcion(SSPIE=1)
   movwf   PIE1
   movlw   b'00000001'
   movwf   SSPADD
   Banco0      
   movlw   b'00101000'         ; configurando permisos de interrupcion(SSPIE=1)
   movwf   SSPCON

Principal
   movlw 0xFE
   movwf PORTB
   movlw 0xFD
   movwf PORTB   
   movlw 0xFB
   movwf PORTB
   movlw 0xF7
   movwf PORTB
   goto Principal

      

   


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IntRB
   movfw indice
   sublw 0xD7
   btfsc STATUS,2
   goto Asignar0
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xEE
   btfsc STATUS,2
   goto Asignar1
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xDE
   btfsc STATUS,2
   goto Asignar2
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xBE
   btfsc STATUS,2
   goto Asignar3
   ;;;;;;;;;;;;;;   
   movfw indice
   sublw 0xED
   btfsc STATUS,2
   goto Asignar4
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xDD
   btfsc STATUS,2
   goto Asignar5
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xBD
   btfsc STATUS,2
   goto Asignar6
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xEB
   btfsc STATUS,2
   goto Asignar7
   ;;;;;;;;;;;;;;   
   movfw indice
   sublw 0xDB
   btfsc STATUS,2
   goto Asignar8
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xBB
   btfsc STATUS,2
   goto Asignar9
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xE7
   btfsc STATUS,2
   goto Asignar10
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0xB7
   btfsc STATUS,2
   goto Asignar11
   ;;;;;;;;;;;;;;   
   movfw indice
   sublw 0x77
   btfsc STATUS,2
   goto Asignar12
   ;;;;;;;;;;;;;;   
   movfw indice
   sublw 0x7B
   btfsc STATUS,2
   goto Asignar13
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0x7D
   btfsc STATUS,2
   goto Asignar14
   ;;;;;;;;;;;;;;
   movfw indice
   sublw 0x7E
   btfsc STATUS,2
   goto Asignar15
   ;;;;;;;;;;;;;;
   goto SalirintRB

Asignar0
   movlw d'0'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar1
   movlw d'1'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar2
   movlw d'2'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar3
   movlw d'3'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar4
   movlw d'4'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar5
   movlw d'5'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar6
   movlw d'6'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar7
   movlw d'7'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar8
   movlw d'8'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar9
   movlw d'9'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar10
   movlw d'10'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar11
   movlw d'11'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar12
   movlw d'12'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar13
   movlw d'13'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar14
   movlw d'14'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB
Asignar15
   movlw d'15'
   call  tabla
   movwf PORTD
   movwf data1
   goto SalirintRB

Intmaestro:
   bsf      SSPCON2,0
   bcf      PIR1,3
   call   comprobar_estado
   movfw   data1
   movwf   SSPBUF
   call   comprobar_estado
   bcf      PIR1,3
   bsf      SSPCON2,2
   bcf      PIR1,3   
   RETURN
   
comprobar_estado:
   btfsc   SSPSTAT,BF
   goto   comprobar_estado
   RETURN
   
   

SalirintRB
   movf   PORTB,W
   call   Intmaestro
   bcf      INTCON,RBIF
   goto   SalirInterrupcion

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tabla

   ADDWF    PCL,F      
   RETLW    0xC0   ; 0 en código 7 segmentos
   RETLW    0xF9   ; 1 en código 7 segmentos
   RETLW    0xA4   ; 2 en código 7 segmentos
   RETLW    0xB0   ; 3 en código 7 segmentos
   RETLW    0x99   ; 4 en código 7 segmentos
   RETLW    0x92   ; 5 en código 7 segmentos
   RETLW    0x82   ; 6 en código 7 segmentos
   RETLW    0xF8   ; 7 en código 7 segmentos
   RETLW    0x80   ; 8 en código 7 segmentos
   RETLW    0x90   ; 9 en código 7 segmentos
   RETLW    0x88   ; 10 en código 7 segmentos
   RETLW    0x83   ; 11 en código 7 segmentos
   RETLW    0xC6   ; 12 en código 7 segmentos
   RETLW    0xA1   ; 13 en código 7 segmentos
   RETLW    0x86   ; 14 en código 7 segmentos
   RETLW    0x8E   ; 15 en código 7 segmentos

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   END                       ; directive 'end of program'


"Este es el código del slave"

   list      p=16f877            ; list directive to define processor
   #include <p16f877.inc>        ; processor specific variable definitions
   include  <MacrosJOM.inc>      ; macros adicionales

   ERRORLEVEL -302
   __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF


;***** DEFINICIÓN DE VARIABLES
w_temp           EQU     0x71        ; variable used for context saving
status_temp      EQU     0x72        ; variable used for context saving
pclath_temp      EQU      0x73     ; variable used for context saving   
direccion      EQU      b'01111111'


; CÁLCULOS TOMADOS EN CUENTA PARA ESTE PROGRAMA:
;**********************************************************************
; Cálculo del TMR0 = 4x(Tosc)x(255-ValorTMR0)xPrescaler
; En nuestro caso  = 4x(0.1x10e-6)x(255-158)x256 ~ 10 mseg
;**********************************************************************

      ORG     0x000             ; processor reset vector
      clrf    PCLATH            ; ensure page bits are cleared
      nop
        goto    PRINCIPAL         ; go to beginning of program

      ; Vector Interrupción:
      ORG     0x004             ; interrupt vector location
      movwf   w_temp            ; save off current W register contents
      movf   STATUS,w          ; move status register into W register
      movwf   status_temp       ; save off contents of STATUS register
      movf   PCLATH,w          ; move pclath register into w register
      movwf   pclath_temp         ; save off contents of PCLATH register

      goto   Servicio_Int      ; ir a la subrrutina de interrupción

Salir_Interrupcion:
      movf   pclath_temp,w     ; retrieve copy of PCLATH register
      movwf   PCLATH             ; restore pre-isr PCLATH register contents
      movf    status_temp,w     ; retrieve copy of STATUS register
      movwf   STATUS            ; restore pre-isr STATUS register contents
      swapf   w_temp,f
      swapf   w_temp,w          ; restore pre-isr W register contents
      retfie                    ; return from interrupt

PRINCIPAL:
 
      Banco1
      movlw   B'00011000'         ; configurando modo esclavo
      movwf   TRISC
      movlw   b'00000000'
      movwf   TRISD
      movlw   b'11000000'         ; configurando permisos de interrupcion(GIE=1,PEIE=1 HabIntPeri)
      movwf   INTCON
      movlw   b'00001000'         ; configurando permisos de interrupcion(SSPIE=1)
      movwf   PIE1
      movfw   direccion
      movwf   SSPADD      
      Banco0
      movlw   b'00100110'         ; configurando permisos de interrupcion(SSPIE=1)
      movwf   SSPCON

   

INICIO:
      nop
      nop
      goto   INICIO;   Bucle infinito
   
Servicio_Int:
      Banco0
      btfsc   PIR1,3          ; Es interrupción de TMR0?
      goto   Int_add      ; SI,
      

salir_Esclavo:
      bcf      PIR1,3        ; aclarar flag de interrupcion SSPIF
      bcf      SSPCON,6      ; aclarar el flag de recpecion de datos
      goto   Salir_Interrupcion

   ; Interrupción Modo Esclavo

salir_add:
      goto   Salir_Interrupcion

Int_add:
      movfw   SSPBUF
      andwf   SSPADD
      btfss   STATUS,Z
      goto    salir_add
      goto   Int_Esclavo      


Int_Esclavo:
      movfw   SSPBUF
      movwf   PORTD
      goto   salir_Esclavo      
   
; Directiva de 'Fin de programa'
      END                     

a ver si me respondes ps....

Desconectado jca

  • PIC12
  • **
  • Mensajes: 75
Re: comunicacion i2c entre dos pic
« Respuesta #8 en: 26 de Noviembre de 2007, 09:53:53 »
Buenas otra vez en principio darte las gracias alogic.con por tu consejo, he programado la interrupción pero nada, esto sigue sin funcionar, lo único que se me ocurre que pueda ser es intentar poner algunos retardos en la comunicación haber si consigo ajustarlos... es que ya no se que hacer.....
Y khael no confies mucho en el proteus que hay veces que se hace la picha un lio, yo mis programas los pruebo siempre encima de las placas que es donde realmente van a estar....

1Saludo...