• No se han encontrado resultados

12 Entrenador Básico 8-

In document Entrenadores (página 194-200)

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.

In document Entrenadores (página 194-200)

Documento similar