12.1.- I2C4.asm
( Entrenador Básico 8-1 )
title " Leer datos cada vez que activamos un Pulsador, de circuitos integrados expansores title " de bus PCF8476 y transmitirlo a través del bus I2C al microprocesador. "
title " Transferir los datos del microprocesador a otros C.I. PCF8476"
;******************************************** I2C4.asm ****************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz. ;Reloj instrucción: 1 MHz = 1 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ESCLAVO1 EQU B'01000001' ; Escribimos la dirección del Esclavo1 receptor. ESCLAVO2 EQU B'01000011' ; Escribimos la dirección del Esclavo2 receptor. ESCLAVO3 EQU B'01001000' ; Escribimos la dirección del Esclavo3 transmisor. ESCLAVO4 EQU B'01001100' ; Escribimos la dirección del Esclavo4 transmisor. ;**************************** Registros *********************************************************************************
CBLOCK 0X20 GUARDAR_DATO ENDC
;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;**************************** Sección de Configuracion **************************************************************** ORG 0X05 ; Inicio de Programa (Una posición detrás del vector de Interrupción). COMIENZO CALL Config_transmisión_I2C ; Configuracion Bus_I2C
BSF STATUS,RP0 ; Ir al Banco 1
BSF TRISB,0 ; Poner PB0 como entrada de datos. BCF STATUS,RP0 ; Ir al Banco 0
SEG1 BTFSC PORTB,0 ; Se pregunta si esta pulsado PB0. GOTO SEG1
CALL Bit_start_I2C ; Llamar a la subrutina de Comienzo.
MOVLW ESCLAVO1 ; Seleccionar esclavo de recepción. ( 0100,A2,A1,A0,1 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(000) por hardware.
; El ultimo BIT a 1 para poner el C.I. PCF8476 como ; receptor.
CALL Recibir_dato_I2C ; Llamar a la subrutina de recepción de datos.
MOVWF GUARDAR_DATO ; Guardar dato recibido en el registro GUARDAR_DATO. CALL ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. MOVLW ESCLAVO3 ; Seleccionar esclavo de transmisión. ( 0100,A2,A1,A0,0 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(100) por hardware.
; El ultimo BIT a 0 para poner el C.I. PCF8476 como ; transmisor.
MOVF GUARDAR_DATO,W ; Guardar el contenido del registro GUARDAR_DATO en W. CALL Transmitir_dato_I2C ; Llamar a la subrutina de transmisión de datos.
CALL Bit_stop_I2C ; Llamar a la subrutina de parada. CALL Bit_start_I2C ; Llamar a la subrutina de Comienzo.
MOVLW ESCLAVO2 ; Seleccionar esclavo de recepción. ( 0100,A2,A1,A0,1 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(001) por hardware.
; El ultimo BIT a 1 para poner el C.I. PCF8476 como ; receptor.
CALL Recibir_dato_I2C ; Llamar a la subrutina de recepción de datos.
MOVWF GUARDAR_DATO ; Guardar dato recibido en el registro GUARDAR_DATO. CALL ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. MOVLW ESCLAVO4 ; Seleccionar esclavo de transmisión. ( 0100,A2,A1,A0,0 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(110) por hardware.
; El ultimo bit a 0 para poner el C.I. PCF8476 como ; transmisor.
MOVF GUARDAR_DATO,W ; Guardar el contenido del registro GUARDAR_DATO en W. CALL Transmitir_dato_I2C ; Llamar a la subrutina de transmisión de datos.
CALL Bit_stop_I2C ; Llamar a la subrutina de parada. SEG2 BTFSS PORTB,0 ; Si sigue pulsado PB0 no retornar.
GOTO SEG2 GOTO SEG1
;**************************************************** LIBRERIAS ******************************************************** INCLUDE <I2C.INC> ; Libreria de control de bus I2C.
END
title " Leer datos de circuitos integrados expansores de bus PCF8476 title " y transmitirlo a través del bus I2C al microprocesador. "
title " Transferir los datos del microprocesador a otros C.I. PCF8476" title " interrumpiendo un programa principal "
;******************************************** I2C5.asm ****************************************************************** ;Programa para PIC 16F877.
;Velocidad del Reloj:4 MHz. ;Reloj instrucción: 1 MHz = 1 uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT.
;Protección de Código: OFF.
;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32
;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** #include <p16f877.inc> ;Este fichero contiene los nombres y direcciones de los
; registros de funciones especiales.
; Este fichero esta localizado en el directorio ; con el nombre MPASM.
;************************************** Igualdades *********************************************************************** ESCLAVO1 EQU B'01000001' ; Escribimos la dirección del Esclavo1 receptor. ESCLAVO2 EQU B'01000011' ; Escribimos la dirección del Esclavo2 receptor. ESCLAVO3 EQU B'01001000' ; Escribimos la dirección del Esclavo3 transmisor. ESCLAVO4 EQU B'01001100' ; Escribimos la dirección del Esclavo4 transmisor. ;**************************** Registros *********************************************************************************
CBLOCK 0X20 GUARDAR_DATO ENDC
;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;**************************************** Vector de Interrupción ******************************************************** ORG 0X04
GOTO INTERRUP ; Ir a la Rutina de Interrupción
;*************************************** Sección de Configuracion ***************************************************** ORG 0X05 ; Inicio de Programa (Una posición detrás del vector de Interrupción
BSF STATUS,RP0 ; Ir al Banco 1
BCF OPTION_REG,INTEDG ; Interrupción por flanco descendente.
BCF OPTION_REG,7 ; Activamos las resistencias PULL-UP del PORTB BSF INTCON,RBIF ; Ponemos a 1 la Bandera de Interrupción de
; las Patilla (RB7..RB4).
BSF INTCON,RBIE ; Permitimos las Interrupciones de las Patilla (RB7..RB4). BSF INTCON,GIE ; Activamos todas las Interrupciones.
BCF STATUS,RP0 ; Ir al Banco 0
;**************************************************** Principal ********************************************************** SLEEP ; Poner el microcontrolador rn modo sueño.
Goto $-1
;****************************************** Rutina de Interrupción ****************************************************** INTERRUP CALL Bit_start_I2C ; Llamar a la subrutina de Comienzo.
MOVLW ESCLAVO1 ; Seleccionar esclavo de recepción. ( 0100,A2,A1,A0,1 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(000) por hardware.
; El ultimo BIT a 1 para poner el C.I. PCF8476 como ; receptor.
CALL Recibir_dato_I2C ; Llamar a la subrutina de recepción de datos.
MOVWF GUARDAR_DATO ; Guardar dato recibido en el registro GUARDAR_DATO. CALL ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. MOVLW ESCLAVO3 ; Seleccionar esclavo de transmisión. ( 0100,A2,A1,A0,0 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(100) por hardware.
; El ultimo BIT a 0 para poner el C.I. PCF8476 como ; transmisor.
MOVF GUARDAR_DATO,W ; Guardar el contenido del registro GUARDAR_DATO en W. CALL Transmitir_dato_I2C ; Llamar a la subrutina de transmisión de datos.
CALL Bit_stop_I2C ; Llamar a la subrutina de parada. CALL Bit_start_I2C ; Llamar a la subrutina de Comienzo.
MOVLW ESCLAVO2 ; Seleccionar esclavo de recepción. ( 0100,A2,A1,A0,1 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(001) por hardware.
; El ultimo BIT a 1 para poner el C.I. PCF8476 como ; receptor.
CALL Recibir_dato_I2C ; Llamar a la subrutina de recepción de datos.
MOVWF GUARDAR_DATO ; Guardar dato recibido en el registro GUARDAR_DATO. CALL ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. MOVLW ESCLAVO4 ; Seleccionar esclavo de transmisión. ( 0100,A2,A1,A0,0 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; (A2,A1,A0)=(110) por hardware.
; transmisor.
MOVF GUARDAR_DATO,W ; Guardar el contenido del registro GUARDAR_DATO en W. CALL Transmitir_dato_I2C ; Llamar a la subrutina de transmisión de datos.
CALL Bit_stop_I2C ; Llamar a la subrutina de parada. MOVF PORTB,W ; Necesario en proteus para limpiar flag. BCF INTCON,RBIF ; mientras permanece pulsado. Limpia flag. RETFIE
;************************************************** LIBRERIAS ********************************************************* INCLUDE <I2C.INC> ; Librería de control de bus I2C.