Autor Tema: problema mssp i2c en proteus  (Leído 60 veces)

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

Desconectado ivan_cass

  • PIC10
  • *
  • Mensajes: 2
problema mssp i2c en proteus
« en: 07 de Febrero de 2018, 20:28:21 »
hola que tal, soy nuevo en el foro, me llamo ivan soy técnico electrónico y vivo en buenos aires la matanza.
necesito ayuda con una simulación en proteus 8.6 sp2.
estoy intentando simular un programa el cual tiene que comunicar un pic16f1503 con una pantalla.
la comunicación es por i2c por el periférico mssp. el problema que estoy teniendo es que cuando envía los datos los cambios en los estados del bus sda y scl los hace al mismo tiempo, osea en ves de que sda cambie de estado cuando scl esta en estado bajo, los hace al mismo tiempo y eso en algunos casos me genera condición de inicio o parada, para ser mas precisos cuando sda esta en 0 y el próximo dato es un 1 pasa de 0 a 1 con el flanco ascendente del scl y me genera una condición de parada y cuando el sda esta en 1 el próximo dato es un 0 pasa de 1 a 0 en el flancon descendente del scl y esto me genera una condición de inicio.
creo que el problema esta en proteus porque el estoy usando el modulo mssp y no puedo manejar los cambios en el bus de datos sda.
el código esta incompleto porque me quede en este punto

Código: [Seleccionar]
    list     p=16f1503 
#include    "p16f1503.inc"
; CONFIG1
; __config 0xFF7C
 __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_ON & _BOREN_ON & _CLKOUTEN_OFF
; CONFIG2
; __config 0xFFFF
 __CONFIG _CONFIG2, _WRT_OFF & _STVREN_ON & _BORV_LO & _LPBOR_OFF & _LVP_ON
 
POSI2C EQU 0021H     ;VARIABLE PARA EL PASO DEL I2C, BIT 7 ES PARA EL ACK
DIRI2C EQU 0078H     ;DIRECCION I2C DE LA PANTALLA
COMC EQU 0080H     ;BIT DE CONTROL I2C COMANDO CONTINUO '11000000'
COMS EQU 0040H     ;BIT DE CONTROL I2C COMANDO SIMPLE '01000000'
DATC EQU 00C0H     ;BIT DE CONTROL I2C DATO CONTINUO '10000000'
DATS EQU 0000H     ;BIT DE CONTROL I2C DATO SIMPLE '00000000'
BANCO_0 EQU D'0'
BANCO_1 EQU D'1'
BANCO_2 EQU D'2'
BANCO_3 EQU D'3'
BANCO_4 EQU D'4'

;--------------------------------------------------------------------------------------------------------
;     MACROS
;--------------------------------------------------------------------------------------------------------
; MOVLF CARGA UN LITERAL EN F
MOVLF MACRO LITERAL,F
MOVLW LITERAL
MOVWF F
ENDM

ORG 0X0000
GOTO INICIO
ORG 0X0004
GOTO INT
ORG 0X0010
INICIO
CLRF POSI2C ;BORRA EL ARCHIVO POSI2C
MOVLF B'11000000',INTCON ;INTERRUPCION ACTIVADA EN GENERAL Y PERIFERICOS
MOVLB BANCO_1 ;BANCO 1
BSF PIE1,3 ;INTERRUPCION MSSP ACTIVADA
MOVLF B'01101010',OSCCON ;OSCILADOR INTERNO 4MHZ
MOVLF B'00000111',TRISA ;CONFIGURACION DE PUERTO A 0 ,1 Y 2 COMO ENTRASDAS
MOVLF B'00000011',TRISC ;PUERTO C 0 Y 1 COMO ENTRADAS
MOVLB BANCO_3 ;BANCO 3 PUERTO A PIN 0,1 Y 2 CONFIGURADOS
MOVWF ANSELA ;COMO ANALOGOS
BCF ANSELC,0 ;PUERTO C PIN 0 Y 1
BCF ANSELC,1 ;CONGIGURADOS COMO DIGITAL
MOVLB BANCO_4 ;BANCO 4
MOVLF B'10000000',SSP1STAT ;MODO I2C BAJA VELOCIDAD
CLRF SSP1CON3
CLRF SSP1CON2
MOVLF B'00101000',SSP1CON1 ;SELECION DE PINES COMO PUERTO SERIAL Y SE PONE EN MODO I2C MAESTRO
MOVLF B'00001001',SSP1ADD ;FRECUENCIA DE I2C A 100KZH
BSF SSP1CON2,0 ;I2C ENCENDIDO
GOTO $ ;EN ESPERA
;-----------------------------------------------------------------------------------------------------
;     INTERRUPCIONES
;-----------------------------------------------------------------------------------------------------

INT
MOVLB BANCO_0     ;BANCO 1
BTFSC PIR1,3     ;TEST DE BANDERA I2C SI VALE UNO SIGUE HASTA EL GOTO I2C
GOTO I2C     ;SALTA A LA RUTINA I2C
;-----------------------------------------------------------------------------------------------------
;     RUTINA I2C
;-----------------------------------------------------------------------------------------------------

I2C
BCF PIR1,3     ;BORRAR BANDERA I2C
MOVLB BANCO_0     ;BANCO 0
BTFSS POSI2C,7     ;DIRECCIONAMIENTO PARA EL ACK O PARA CARGAR DATOS EN BUFF I2C
GOTO SALIDA_I2C     ;SE CARGA EL DATO EN BUFFER I2C
GOTO ACK     ;SE VERIFICA EL ACK

SALIDA_I2C
MOVLB BANCO_0     ;BANCO 0
CALL TABLA_I2C     ;LLAMA A LA TABLA CON LOS DATOS I2C SE CARGA EL VALOR QUE CORESPONDA SEGUN POSI2C
MOVLB BANCO_4     ;BANCO 4
MOVWF SSP1BUF     ;SE CARGA EL BUFF I2C CON EL VALOR DE LA TABLA
MOVLB BANCO_0
BSF POSI2C,7     ;SE CARAGA EL BIT 7 DE POSI2C PARA POSTERIO COMBROBACION ACK
RETFIE

ACK
BCF POSI2C,7     ;BORRA EL BIT 7 DEL POSI2C PARA QUE POSTERIO SALIDAI2C
MOVLB BANCO_4     ;BANCO 4
BTFSC SSP1CON2,6     ;COMPRUEBA EL ESTADO ACK SI NO HAY CONFIRMACION SIGUE Y VUELVE A CARGAR EL DATO
GOTO SALIDA_I2C     ;SI HAY CONFIRMACION
MOVLB BANCO_0     ;BANCO 0
INCF POSI2C     ;SE INCREMENTA POSI2C PARA CARGAR ORTRO DATO EN EL BUFF I2C
GOTO SALIDA_I2C     ;SALTO A SALIDA CON POSI2C INCREMENTADO PARA QUE CARGUE UN NUEVO DATO EN EL BUFF I2C
;-----------------------------------------------------------------------------------------------------
;     TABLAS
;-----------------------------------------------------------------------------------------------------
TABLA_I2C
MOVF POSI2C,0
ADDWF PCL,1
RETLW DIRI2C     ;DIRECCION DE PLANTALLA OLED EN  ''
RETLW COMC     ;BYTE DE CONTROL EN COMANDOS CONTINUO '11000000'

END
muchas gracias
solucionado.
el problema estaba en que cuando hice el isis en proteus las resistencias que use de pull-up eran análogas, las cambie a digitales y el bus de datos funciono correctamente :).
« Última modificación: 08 de Febrero de 2018, 15:29:44 por ivan_cass »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6287
Re:problema mssp i2c en proteus
« Respuesta #1 en: 09 de Febrero de 2018, 11:43:41 »
Respecto al programa:

Considero que por ahi seria mas util crear 2 funciones como tenes, con envio y revisar el ACK. Luego tener algunos registros, uno que indique la cantidad de datos, y los otros como un Buffer, entonces siempre se envia lo que esta alli, eso lo hace un poco mas versatil al momento de reutilizar el codigo de la instruccion, sino deberias estar cambiando la tabla a cada rato.

Ejemplo.. Pongo los datos "Direccion, Comando, Argumento" en mi buffer, y luego le pongo que debo enviar 3 datos. Necesito por supuesto 1 registro mas para indicar si estoy enviando o si estoy en el ACK, y por supuesto uno que indique que esta activo el proceso, de esa forma en tu programa podes generar una funcion que revisa si esta en medio de una comunicacion.

Ahora algunas partes del codigo:

Código: ASM
  1.         BTFSC   PIR1,3              ;TEST DE BANDERA I2C SI VALE UNO SIGUE HASTA EL GOTO I2C
  2.         GOTO    I2C                 ;SALTA A LA RUTINA I2C
  3. ;-----------------------------------------------------------------------------------------------------
  4. ;                                   RUTINA I2C
  5. ;-----------------------------------------------------------------------------------------------------
  6.  
  7. I2C
  8.         BCF     PIR1,3              ;BORRAR BANDERA I2C
Si el BTFSC salta, se ejecuta I2C, si no salta, ejecuta el GOTO y nuevamente ejecuta el I2C, por lo tanto ese BTFSC es insensato.

Código: ASM
  1.         BTFSC   SSP1CON2,6          ;COMPRUEBA EL ESTADO ACK SI NO HAY CONFIRMACION SIGUE Y VUELVE A CARGAR EL DATO
  2.         GOTO    SALIDA_I2C          ;SI HAY CONFIRMACION
  3.         MOVLB   BANCO_0             ;BANCO 0

Si no hay confirmacion se vuelve a enviar el dato, lo cual esta mal, deberia generar un STOP, y luego volver a iniciar la comunicacion.
Con esto tambien te daras cuenta que no hay nada sobre un posible STOP.

Código: ASM
  1.         INCF    POSI2C              ;SE INCREMENTA POSI2C PARA CARGAR ORTRO DATO EN EL BUFF I2C
No hay un limitador de POSI2C por lo cual puede haber un overflow de la tabla.

Y finalmente tu problema:

Todo lo demas parece correcto, y el que cambie en el mismo momento que el clock es debido a que Proteus esta simulandolo asi, el tema esta en que si asi lo simula, entonces el otro componente deberia tambien soportar el mismo sistema que seria lo mas obvio. El hardware del PIC simplemente va a hacer su trabajo.


Desconectado ivan_cass

  • PIC10
  • *
  • Mensajes: 2
Re:problema mssp i2c en proteus
« Respuesta #2 en: 09 de Febrero de 2018, 22:24:44 »
hola killerjc
muchas gracias por responder.
con respecto a las aclaraciones:
Citar
Código: ASM
 BTFSC   PIR1,3              ;TEST DE BANDERA I2C SI VALE UNO SIGUE HASTA EL GOTO I2C
        GOTO    I2C                 ;SALTA A LA RUTINA I2C
;-----------------------------------------------------------------------------------------------------
;                                   RUTINA I2C
;-----------------------------------------------------------------------------------------------------
 
I2C
        BCF     PIR1,3              ;BORRAR BANDERA I2C
Si el BTFSC salta, se ejecuta I2C, si no salta, ejecuta el GOTO y nuevamente ejecuta el I2C, por lo tanto ese BTFSC es insensato.
en realidad el codigo sigue despues del goto, pasa que como estaba haciendo la simulación en proteus no lo seguí porque quería solucionar ese tema.
Citar
Código: ASM
        BTFSC   SSP1CON2,6          ;COMPRUEBA EL ESTADO ACK SI NO HAY CONFIRMACION SIGUE Y VUELVE A CARGAR EL DATO
        GOTO    SALIDA_I2C          ;SI HAY CONFIRMACION
        MOVLB   BANCO_0             ;BANCO 0

Si no hay confirmación se vuelve a enviar el dato, lo cual esta mal, deberia generar un STOP, y luego volver a iniciar la comunicacion.
Con esto tambien te daras cuenta que no hay nada sobre un posible STOP.
gracias por la aclaración, no sabia ese detalle, creí que si no abia un ack se tenia que repetir el dato, lo voy a modificar, y no hay condición de stop porque todabia no esta terminado el codigo.
Citar
Código: ASM
        INCF    POSI2C              ;SE INCREMENTA POSI2C PARA CARGAR ORTRO DATO EN EL BUFF I2C
No hay un limitador de POSI2C por lo cual puede haber un overflow de la tabla.
no lo tuve en cuenta, lo voy a modificar.

y con respecto al problema que tenia lo solucione cambiando las resistencias por resistencias pullup, no se porque no funcionaba con las comunes.



 

anything