11.1.- I2C1.asm
( Entrenador Básico 8 )
title " Leer un dato del circuito integrado expansor de bus PCF8476 y transmitirlo a través " title " del bus I2C al microprocesador. Transferir el dato del microprocesador a otro C.I. PCF8476"
;******************************************** I2C1.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'01001000' ; Escribimos la dirección del Esclavo2 transmisor.
;**************************** Registros ********************************************************************************** CBLOCK 0X20
GUARDAR_DATO ENDC
;********************************* Sección Código de Reset *********************************************************** ORG 0 ;Dirección del Vector Reset
GOTO COMIENZO ;Comienzo del Programa
;******************************************* Sección de Configuración ************************************************* ORG 0X05 ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO CALL Config_transmisión_I2C ; Configuracion Bus_I2C
;**************************************************** Principal ********************************************************** RECIBIR CALL Bit_start_I2C ; Llamar a la subrutina de Comienzo.
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. TRANSMITIR MOVLW ESCLAVO2 ; 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.
COMF GUARDAR_DATO,W ; Complementar el contenido del registro GUARDAR_DATO ; y guardarlo 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.
GOTO RECIBIR ; Repetir proceso.
;*************************************************** LIBRERIAS ********************************************************* INCLUDE <I2C.INC> ; Librería de control de bus I2C.
END
11.2.- I2C2.asm
( Entrenador Básico 8 )
title " Leer un dato del circuito integrado expansor de bus PCF8476 y transmitirlo a través " title " del bus I2C al microprocesador. Transferir el dato del microprocesador a otro C.I. PCF8476" title " interrumpiendo un programa principal "
;******************************************** I2C2.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'01001000' ; Escribimos la dirección del Esclavo2 transmisor.
;**************************** Registros ********************************************************************************** CBLOCK 0X20
GUARDAR_DATO ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;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) COMIENZO CALL Config_transmisión_I2C ; Configuracion Bus_I2C
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,INTF ; Ponemos a 1 la Bandera de Interrupción de las Patilla INT. BSF INTCON,INTE ; Permitimos la interrupción INT.
BSF INTCON,GIE ; Activamos todas las interrupciones. BCF STATUS,RP0 ; Ir al Banco 0.
;**************************************************** Principal ********************************************************** SLEEP ; Entra el microcontrolador en 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.
CALL ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. TRANSMITIR MOVLW ESCLAVO2 ; 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.
COMF GUARDAR_DATO,W ; Complementar el contenido del registro GUARDAR_DATO ;y guardarlo 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.
BCF INTCON,INTF ; Ponemos a 0 la Bandera de Interrupción de la Patilla INT. RETFIE
;*************************************************** LIBRERIAS ********************************************************* INCLUDE <I2C.INC> ; Librería de control de bus I2C.
END
11.3.- I2C3.asm
( Entrenador Básico 8 )
title " Realizar una conversión Analógica / Digital y transmitirla a los expansores de bus PCF8476 "
;******************************************** I2C3.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'01000000' ; Escribimos la dirección del Esclavo1 transmisor.
ESCLAVO2 EQU B'01001000' ; Escribimos la dirección del Esclavo2 transmisor.
CBLOCK 0X20 GUARDAR_DATO ENDC
;************************************* Sección Código de Reset ******************************************************* ORG 0 ;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 BSF STATUS,RP0 ; Ir al Banco 1.
BSF TRISA,5 ; Configuracion del Conversor Analogico/Digital. MOVLW B'00000000'
MOVWF ADCON1 BCF STATUS,RP0 MOVLW B'00100001' MOVWF ADCON0
CALL Config_transmision_I2C ; Configuracion Bus_I2C
;**************************************************** Principal ********************************************************** SEG2 CALL Retardo_100ms ; Esperar un tiempo de adquisición de 100 mS.
BSF ADCON0,GO_DONE ; Lanzar el Conversor Analogico/Digital. SEG1 BTFSC ADCON0,GO_DONE
GOTO SEG1
MOVF ADRESH,W ; Preguntamos si el dato convertido es idéntico al anterior. SUBWF GUARDAR_DATO,W
BTFSC STATUS,Z GOTO SEG2
MOVF ADRESH,W ; Guardamos dato nuevo. MOVWF GUARDAR_DATO
CALL Bit_start_I2C ; Llamar a la subrutina de Comienzo.
MOVLW ESCLAVO2 ; 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 ESCLAVO1 ; Seleccionar esclavo de transmisión. ( 0100,A2,A1,A0,0 ) CALL Transmitir_dato_I2C ; (0100) identifica al C.I. PCF8476.
; El ultimo BIT a 0 para poner el C.I. PCF8476 como ; transmisor.
COMF GUARDAR_DATO,W ; Complementar el contenido del registro GUARDAR_DATO ; y guardarlo 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.
GOTO SEG2
;************************************************** LIBRERIAS ********************************************************** INCLUDE <I2C.INC>
INCLUDE <Retardos.INC> END