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'
ENDmuchas graciasCódigo: ASMen 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.
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.
Código: ASMgracias 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.
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.
Código: ASMno lo tuve en cuenta, lo voy a modificar.
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.