Autor Tema: I2C en asm entre dos dsPIC con simulación en Proteus opera bien pero lento  (Leído 4634 veces)

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

Desconectado cvlaso

  • PIC10
  • *
  • Mensajes: 14
Hola a todos
Habiendo logrado una comunicación decente entre dos dspic les comparto los archivos y el código del Master y del Slave.
Funciona bien sin embargo al disminuir ciertos retardos al parecer el salve no es capaz de transmitir el dato.
Si ejecutan el progama en Proteus verán que en ambos micros los respectivos displays muestran mensajes indicando las interrupciones y el paso donde se encuentran, como los ack o el reconocimiento de la direccion por parte del esclavo.

A ver si alguien me dá una mano sugiriendome que hacer para aumentar la velocidad al menos hasta donde se pueda dejando de lado el retardo de los lcd, al bajar el retardo del programa salve este interrumpe el envío de datos.

Traté de analizar esto con el analizador lógico del proteus, si alguien me puede dejar el link de algun tutorial de esto se lo agradezco, por que los que he visto no me han servido y no logro ver las señales, gracias

Para no extender el código en ambos código no incluyo las rutinas que manejan el lcd tales como call ack o call okdir del slave.


Saludos a todos y muchas gracias

Código: ASM
  1. i2c_rutina_slave:
  2. ;////////////////////////////////////////////////////////////
  3. ;RUTINAS I2C MODO SLAVE
  4. ;////////////////////////////////////////////////////////////
  5. i2c_rutina:
  6.                                 mov  #15,w0
  7.                                 mov  w0,C_datos
  8.  
  9. i2_rutina:              mov #0,w0
  10.                                 mov w0,cont_int         ;cont_int = 1
  11.                             CALL ESPERA_DIR             ;ESCRIBE EN DISPLAY, ESPERA DE COINCIDENCIA DE LA DIRECCIÓN
  12.                                 bset PORTA,#0           ;ENVIADA POR EL MASTER
  13.                                                         ;ESCRIBE ESPDIR
  14. esp_dirslave:
  15. ledt:          
  16.                                                         ;1. loop de espera de coincidencia de dirección
  17.                                 nop                     ;  ESPERANDO QUE EL MASTER ENVIE LA DIRECCIÓN
  18.                                                                         ;  CUANDO SE RECIBE LA DIRECCION CORRECTA
  19.                                                                         ;SALTA A LA INTERRUPCION CUANDO HAY COINCIDENCIA
  20.                                                                         ;con el cont_int = 1
  21.                                                                         ;ESCRIBE DIRI2C EN DISPLAY
  22.                                 mov      cont_int,w6
  23.                                 mov  #1,w4              ;es PRIMERA interrupcion
  24.                                 xor  w4,w6,w4   ;cont_int es UNO??
  25.                                 BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  26.                                 bra  esp_dirslave       ;NO, SIGUE ESPERANDO DIRECCION CORRECTA
  27.                                 bra  dir_ok             ;SI,DIRECCION CORRECTA
  28.  
  29. dir_ok:                 CALL DIR_OK                     ;ESCRIBE EN DISPLAY
  30.  
  31.                             CALL TPO_RET_T23_2          ;RETARDO DE 1.2 SEG
  32.                                 call RET_T23_GEN
  33.  
  34. sendd_dat:              bclr I2C1CON,#SCLREL                           
  35.  
  36.                                 CALL TPO_RET_T23_1      ;RETARDO DE 1.2 SEG
  37.                                 call RET_T23_GEN
  38. ;mov #15,w0
  39. onledw:                 mov C_datos,w0                  ;ENVIA DATO AL MASTER
  40.                                 mov w0,I2C1TRN
  41.  
  42.                                 bset I2C1CON,#SCLREL
  43.  
  44.                                 bclr PORTA,#0
  45.  
  46.                                 CALL TPO_RET_T23_1      ;RETARDO DE 1.2 SEG
  47.                                 call RET_T23_GEN
  48.  
  49.                                 mov      cont_int,w6
  50.                                 mov  #2,w4              ;es segunda interrupcion
  51.                                 xor  w4,w6,w4           ;cont_int es UNO??
  52.                                 BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  53.                                 bra  bfull              ;NO, SIGUE ESPERANDO DIRECCION CORRECTA
  54.                                 bra  txx_ok             ;SI,DIRECCION CORRECTA
  55.  
  56. txx_ok:                 CALL TX_OK                      ;ESCRIBE EN DISPLAY
  57.  
  58.  
  59. bfull:                  btsc I2C1STAT,#TBF              ;BIT INDICADOR DE TRANSM COMPLETA
  60.                                 bra  bfull
  61.  
  62. ;                               bclr I2C1CON,#SCLREL
  63.  
  64.                                 CALL TPO_RET_T23_3      ;RETARDO DE 1.26 SEG
  65.                                 call RET_T23_GEN
  66. ;bra onledQ
  67.                                 bclr PORTA,#0
  68.  
  69.                                 bset PORTA,#0
  70.  
  71. onledQ:
  72. esp_ack:                mov      cont_int,w6
  73. e_ack:                  mov  #3,w4                      ;es TERCERA interrupcion
  74.                                 xor  w4,w6,w4           ;cont_int es DOS??
  75.                                 BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  76.                                 bra esp_ack
  77.                         ;       bra onledQ              ;NO
  78.                                 bra  rx_ack1   ;SI
  79.  
  80. rx_ack1:                CALL ES_ACK    
  81.  
  82.                                 inc C_datos
  83.                                 mov #2,w0
  84.                                 mov w0,cont_int
  85.  
  86.                                 bra sendd_dat

Código: Text
  1.  

Desconectado cvlaso

  • PIC10
  • *
  • Mensajes: 14
Re:I2C en asm entre dos dsPIC con simulación en Proteus opera bien pero lento
« Respuesta #1 en: 04 de Enero de 2023, 17:21:08 »
Hola a todos
Me auto respondo e incluyo las rutinas de Master y Slave, estas trabajan con un clock de 10 MHZ con el dsPIC 33FJ16MC304, el que encontré similar al que uso y que funciona en proteus, en proteus no pude ver el asm, me las arreglé cargando el  .hex y opera bien, comi dije antes no me la pude con el analizador del proteus asi que usé los mensajes de los displays para chequear los ack entre ambos pics.
Revisé un par de opciones de reconocimiento, repuse control del bit RBF en el Master para que espere la indicación de la recepción completa del byte , antes usaba solo la indicación de la interrupción que se produce al recibir el byte, eliminé todos los restardos salvo uno y los módulos trabajan excelente,, tambien la simulación en proteus.
Como tema relacionado les cuento que esto de aprender la comunicación I2C lo hago por que necesito recibir datos de varios sensores en el micro, es decir, 4 sensores ultrasonicos HCSR04 con salida uart que la convierto a I2C, una brújula con salida I2C, por que no consigo el SR05 que tiene salida I2C, y otros sensor laser más de distancia que sale en I2C.
Si alguien necesita los programas completos o el projecto en Proteus me puede mandar un mail a cvaldiviesolaso@gmail.com.

Saludos

Código: Text
  1.  

Código: Text
  1.  

Código: ASM
  1. ;RUTINA DE INTERRUPCION SLAVE
  2. __SI2C1Interrupt:
  3.  
  4.                         mov      cont_int,w6
  5.                         mov  #0,w4              ;es primera interrupcion
  6.                         xor  w4,w6,w4   ;cont_int es UNO??     
  7.                         BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  8.                         bra  contesuno  ;NO
  9.                         inc  cont_int   ;SI
  10.                         bra out_intsl
  11.  
  12. contesuno:      mov      cont_int,w6
  13.                         mov  #1,w4              ;es segunda interrupcion
  14.                         xor  w4,w6,w4   ;cont_int es DOS??
  15.                         BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  16.                         bra  contesdos  ;NO
  17.                         inc  cont_int   ;SI
  18.                         bra out_intsl
  19.  
  20. contesdos:      mov      cont_int,w6
  21.                         mov  #2,w4              ;es segunda interrupcion
  22.                         xor  w4,w6,w4   ;cont_int es DOS??
  23.                         BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  24.                         bra  contestres ;NO
  25.                         inc  cont_int   ;SI
  26.                         bra out_intsl
  27.  
  28. contestres:     mov      cont_int,w6
  29.                         mov  #3,w4              ;es tercera interrupcion
  30.                         xor  w4,w6,w4   ;cont_int es tres??
  31.                         BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  32.                         bra  contescuatro ;no
  33.                         inc  cont_int   ;si
  34.                         bra out_intsl   ;si
  35.  
  36. contescuatro:   bra  contescuatro                                               ;no
  37.  
  38.                         mov      cont_int,w6
  39.                         mov  #4,w4              ;es cuarta interrupcion
  40.                         xor  w4,w6,w4   ;cont_int es cuatro??
  41.                         BTSS SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  42.                         bra out_intsl
  43.                         inc  cont_int
  44.                         bra out_intsl   ;si
  45.                         ;CALL OUT_READ  ;si
  46.  
  47. out_intsl:
  48.                         bclr    IFS1,#SI2C1IF
  49. retfie
  50.  
  51.  
  52. ledint1:         CALL TPO_RET_T23_1 ;RETARDO DE 0.5 SEG
  53.                          call RET_T23_GEN
  54.                          bclr PORTA,#0
  55.                          CALL TPO_RET_T23_1 ;RETARDO DE 0.5 seg
  56.                          call RET_T23_GEN
  57.                          bset PORTA,#0
  58.        
  59.                          bra ledint1
  60.  
  61.         mov              cont_int,w6
  62.  
  63.                         mov  #1,w4              ;es primera interrupcion
  64.                         xor  w4,w6,w4   ;es UNO??      
  65.                         BTSC SR,#1              ;SR, 1 DA UNO SI SON IGUALES
  66.                         bra out_ints            ;si
  67.                         bra  ledint1
  68.  
  69.  
  70.  
  71. out_ints:       bclr    IFS1,#SI2C1IF
  72. retfie

Código: Text
  1.