Entrenadores de Microcontroladores PIC

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Entrenadores de Microcontroladores PIC"

Transcripción

1 Entrenadores de Microcontroladores PIC Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes

2 Índice Página 1.- Entrenador Básico Ejemplo1.asm Leer el Puerto C y transferirlo al Puerto B Ejemplo2.asm Leer el Puerto C complementarlo y transferirlo al Puerto B Ejemplo3.asm Parpadeo de un Led Ejemplo3A.asm Parpadeo de un Led,utilizando una librería de Tiempo RETAR_1S.INC Ejemplo3B.asm Parpadeo de un Led utilizando una librería llamada RETARDOS.INC del libro de Desarrollo de Proyectos Ejemplo4.asm Simular las luces del Coche Fantástico Ejemplo5.asm Simular las luces del Coche Fantástico controlado por PCO Nom_disp.asm Poner el Nombre en el Display Sum_Nibl.asm Sumar los nibles del Puerto C y llevarlos al Puerto B Dir_ind.asm Direccionamiento Indirecto Pagina1.asm Trabajar con la Pagina 1 de memoria de programa RETARDO_1S.INC Librería Casera de Retardo 1 Segundo RETARDOS.INC Librería de Retardos del libro de Desarrollo de Proyectos Entrenador Básico Ejemplo6.asm Encender displays dependiendo de PC Ejemplo7.asm Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades Ejemplo8.asm Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas Entrenador Básico Ejemplo9.asm Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas Entrenador Básico 2A PWM_1.asm. Control de un Servomotor de Posición con PWM a través del Puerto B PWM_CAD.asm Control de un Servomotor de Posición con PWM a través de un Potenciómetro Entrenador Básico Ejempl10.asm Interrupción Externa

3 Índice Página Ejemp_11.asm Conversión Analógico/Digital Ejemp_12.asm Contar pulsos del exterior utilizando un Temporizador TIMER Ejemp_13.asm Transferir una Tabla de datos de memoria EPROM a RAM y Puerto B utilizando como subrutina de tiempo el TIMER 0 y direccionamiento indirecto Ejemp_14.asm Detectar el numero mayor de una Tabla Entrenador Básico T_S_A.asm Transmisor SERIE asíncrona R_S_A.asm Receptor SERIE asíncrona T1_S_RF.asm Transmisor SERIE asíncrona utilizando Librería de Transmisión T_S_RF_INC RE1_S_RF.asm Receptor SERIE asíncrona utilizando Librería de Recepción R_S_RF.INC T_S_RF.INC Librería Transmisor SERIE vía Radiofrecuencia para una Tarjeta Emisora SAW para Datos 433,92 MHz ( CEBEK C-0503 ) Llave de entrada fija. Cargar en W el dato a transmitir R_S_RF.INC Librería Receptor SERIE vía Radiofrecuencia para una Tarjeta Emisora SAW para Datos 433,92 MHz ( CEBEK C-0504 ) La Llave de entrada fija. Los datos se validan si llegan dos datos idénticos consecutivos. El dato recibido se carga en el registro DATO_SERIE_VALIDO T_M_S_RF.INC Librería de Transmisor SERIE vía Radiofrecuencia para una Tarjeta Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0503 ) Cargar la llave de entrada en el registro LLAVE_ENTRADA Cargar en W el dato a transmitir R_M_S_RF.INC Librería Receptor SERIE vía Radiofrecuencia para una Tarjeta Emisora ;SAW para Datos 433,92 MHz. ( CEBEK C-0504 ) La Llave de entrada aleatoria. Los datos se validan si llegan dos datos idénticos consecutivos. El dato recibido se carga en el registro DATO_SERIE_VALIDO

4 Índice Página 7.- Entrenador Básico Tecla0.asm Manejo del Teclado utilizando la técnica de polling Tecl_01.asm Manejo del Teclado utilizando la técnica de interrupción del programa principal Tecl_02.asm Manejo del Teclado utilizando la técnica de interrupción del programa principal y llevando los datos al display de 7 segmentos HEX_7SEG.INC Librería que transforma un código hexadecimal en 7 segmentos TECLADO.INC Librería de control del teclado Entrenador Básico LCD_01.asm Visualización de un mensaje en el LCD carácter a carácter LCD_02.asm Visualización de un mensaje en el LCD carácter a carácter con retardo de 500 ms, borrar pantalla y comenzar de nuevo LCD_03.asm Programa ejemplo para comprender la utilización de las subrutinas LCD_ByteCompleto, LCD_Byte, LCD_Nibble y LCD_DosEspaciosBlancos LCD_04.asm Visualización en el LCD un contador descendente LCD_05.asm Visualizar en la pantalla del LCD los pulsos generados del exterior LCD_06.asm Visualizar en la pantalla del LCD los pulsos generados del exterior hasta un número máximo, se resetea y comienza de nuevo la cuenta LCD_07.asm Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador que se visualiza en la pantalla del LCD LCD_08.asm Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador que se visualiza en la pantalla del LCD en formato decimal,hexadecimal y binario Mens_01.asm Visualización de un mensaje fijo utilizando la librería LCD_4BIT.INC Mens_02.asm Visualización de un mensaje fijo utilizando la librería LCD_MENS.INC Mens_03.asm Visualización de varios mensajes fijo utilizando la librería LCD_MENS.INC Mens_03B.asm Visualización de varios mensajes fijo utilizando la librería LCD_MENS.INC cuando se visualiza el ultimo mensaje el proceso se repite

5 Índice Página Mens_04.asm Visualización de mensajes parpadeantes en dos líneas del LCD Mens_05.asm Visualización de un mensaje fijo y parpadeantes Mens_06.asm Visualización de mensajes en función de un pulsador Mens_07.asm El modulo LCD visualiza un mensaje largo (mas de 16 caracteres) que se desplaza Mens_08.asm Juego de la Quiniela Mens_09.asm La pantalla del LCD visualiza un mensaje en función de un pulsador BIN_BCD.INC Librería que convierte un número Binario en BCD. El resultado se guarda en tres posiciones de memorias llamadas: BCD_Centenas, BCD_Decenas y BCD_Unidades LCD_4BIT.INC Librería que permiten realizar las tareas básicas de control de un módulo LCD de 2 líneas por 16 caracteres, compatible con el modelo LM016L LCD_MENS.INC Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD Entrenador Básico Tecla_01.asm La pantalla del LCD visualiza el orden de la tecla pulsada utilizando la técnica de polling Tecla_02.asm La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando la técnica de polling Tecl_03.asm La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando técnicas de interrupción Tecla_04.asm La pantalla del LCD visualiza caracteres españoles en función de la tecla pulsada Tecla_05.asm La pantalla del LCD aparece un mensaje en movimiento y fijo en la primera línea y en la segunda línea visualiza la tecla pulsada Tecla_06.asm La pantalla del LCD aparece la tecla pulsada primero la línea 1 y después en la línea 2 repitiéndose el proceso Tecla_07.asm La pantalla del LCD aparece la tecla pulsada si esta es decimal y si se pulsa otra tecla borra pantalla Tecla_08.asm Suma el valor de tres teclas y aparece en el LCD en decimal y hexadecimal Tecla_09.asm Cerradura Electrónica

6 Índice Página 10.- Entrenador Básico Tecla_10.asm Cerradura Electrónica activando un motor PAP Entrenador Básico I2C1.asm Leer un dato del circuito integrado expansor de bus PCF8476 y transmitirlo a través del bus I2C al microprocesador. Transferir el dato del microprocesador a otro C.I. PCF I2C2.asm Leer un dato del circuito integrado expansor de bus PCF8476 y transmitirlo a través del bus I2C al microprocesador. Transferir el dato del microprocesador a otro C.I. PCF8476 interrumpiendo un programa principal I2C3.asm Realizar una conversión Analógica / Digital y transmitirla a los expansores de bus PCF Entrenador Básico I2C4.asm Leer datos cada vez que activamos un Pulsador, de circuitos integrados expansores de bus PCF8476 y transmitirlo a través del bus I2C al microprocesador. Transferir los dato del microprocesador a otros C.I. PCF I2C5.asm Leer datos de circuitos integrados expansores de bus PCF8476 y transmitirlo a través del bus I2C al microprocesador. Transferir los datos del microprocesador a otros C.I. PCF8476, interrumpiendo un programa principal Entrenador Básico I2C6.asm Leer constantemente la entrada analógica ANI0 del Esclavo 1 (PCF8591) y visualiza la tensión en la pantalla del modulo LCD I2C7.asm En la salida analógica del Esclavo 2 (PCF8591) que trabaja como DAC se obtiene una tensión seleccionada por un pulsador conectado a la línea RB6 del PIC. La tensión varia entre 0,50 y 2,50 V en saltos de 0,25 V y se visualiza en el modulo LCD I2C8.asm Leer constantemente la entrada analógica ANI0 del Esclavo 1(PCF8591), llevarla al Esclavo 2 (PCF8591) y visualiza la tensión en la pantalla del modulo LCD I2C.INC Librería de Transmisión y recepción de datos con I2C I2C1.INC Librería de Transmisión y recepción de datos con I2C1. En la subrutina (Transmitir_dato_I2C) el Esclavo no confirma la transmisión

7 14.- Entrenador Básico RTS232_1.asm En la pantalla del modulo LCD se visualizaran los caracteres que se reciban a través del puerto serie del ordenador. Lo que se escriba por el teclado del ordenador aparecerá en la pantalla del sistema con microcontrolador RTS232_2.asm En el modulo LCD se visualizan los caracteres que se escriban en el teclado del ordenador y se transmiten a través de su puerto serie. Estos datos volverán a ser enviados por el microcontrolador al ordenador, para que se visualicen en su monitor RTS232_3.asm Lo que se escriba por el teclado se visualiza en el LCD y en el monitor del ordenador, pero en este ultimo se visualiza un solo carácter por línea RTS232_4.asm En el modulo LCD se visualizan los caracteres que se escriben en el teclado del ordenador. Si pulsa la tecla Enter se comienza a escribir en la segunda línea de la pantalla del modulo LCD RTS232_5.asm Este programa envía un mensaje grabado en la memoria de programa del microcontrolador al ordenador. Es decir, en el monitor del ordenador aparecerá el mensaje grabado en el PIC RTS232_6.asm Este programa envía varios mensajes grabados en la memoria de programa del microcontrolador al ordenador. Cada mensaje permanecerá en pantalla durante unos segundos hasta que sea sustituido por el siguiente RTS232_7.asm En el monitor del ordenador se visualizan mensajes grabados en la memoria de programa del microcontrolador. El cambio de mensaje se ejecuta cada vez que se pulse la tecla Enter RTS232_8.asm Programa que visualiza en el modulo LCD el código ASCII en formato hexadecimal de la tecla pulsada y también en el monitor del ordenador en formato decimal RTS232_9.asm SISTEMA DE MONITORIZACION: Se trata de leer el estado de las entradas conectadas a las líneas <RB7:RB4> del Puerto B y se envia por el puerto RS232 a un terminal para monitorizar el estado de los mismos. El estado de las entradas se mostrara cada 1 segundos RTS23_10.asm SISTEMA DE MONITORIZACION: Se trata de leer el estado de las entradas conectadas a las líneas <RB7:RB4> del Puerto B y se envia por el puerto RS232 a un terminal para monitorizar el estado de los mismos. Se utilizara las interrupciones por cambio de nivel en una línea del Puerto B, por ello, las entradas deben conectarse a la parte alta del Puerto B RTS23_11.asm SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un ordenador se desea comandar el movimiento de una estructura móvil

8 RS232_RT.INC Librería de transmisión-recepción serie asíncrona según normas RS RS232MEN.INC Librería de transmisión de mensajes desde el microcontrolador hacia el ordenador a través del puerto serie RS Entrenador Básico Int_T_01.asm Onda cuadrada de 10 khz aproximadamente, mediante la interrupción por desbordamiento del Timer Int_T_02.asm Onda cuadrada de 10 khz exactos, mediante la interrupción por desbordamiento del Timer Int_T_03.asm Led ON/OFF 500 ms utilizando la interrupción por desbordamiento del Timer Int_T_04.asm Led ON (800 ms) Led OFF (500 ms), utilizando la interrupción por desbordamiento del Timer Int_T_05.asm Sistema multitarea ( Mostrar mensajes en el LCD y LED ON/OFF (500 ms) Int_T_06.asm Mostrar mensajes en el LCD fijo en la primera línea e intermitente en lasegunda línea utilizando la interrupción del Timer Int_C_01.asm Generar una señal cuadrada por PB2, de frecuencia variable en función de PB7. El modulo LCD visualiza dicha frecuencia Int_C_02.asm Generar una señal cuadrada por PB2, de frecuencia variable desde 300Hz hasta 4000Hz Int_C_03.asm Encender y apagar una sirena en función de RB7 y RB6, mostrar en el modulo LCD como esta la sirena Int_C_04.asm Control del Ciclo de Trabajo de un señal cuadrada Int_Re_01.asm Reloj digital en tiempo real sin puesta en hora utilizando la interrupción del Timer Int_Re_04.asm Reloj digital en tiempo real con puesta en hora Int_Temp.asm Temporizador digital de precisión

9

10 1.- Entrenador Básico 0 4

11 1.1.- Ejemplo1.asm (Entrenador Básico 0) Diagrama de Flujo Leer el Puerto C y transferirlo al Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISC B ; Poner el Puerto C como entrada de datos. TRISB B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0 ; Principal PORTB PORTC 5

12 title " Leer el Puerto C y transferirlo al Puerto B " ;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 *********************************************************************** ;**************************** Registros ************************************************************************ ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;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 BSF STATUS,RP0 MOVLW B' ' MOVWF TRISC CLRF TRISB BCF STATUS,RP0 ; Poner el Puerto C como entrada de datos. ; Poner el Puerto B como salida de datos. ;**************************** Principal ************************************************************************** SEG1 MOVF PORTC,W ; Leer el Puerto C y llevarlo al Acumulador. MOVWF PORTB ; Transferir el dato del Acumulador al Puerto B GOTO SEG1 END 6

13 1.2.- Ejemplo2.asm (Entrenador Básico 0) Diagrama de Flujo Leer el Puerto C complementarlo y transferirlo al Puerto B Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISC B ; Poner el Puerto C como entrada de datos. TRISB B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0 ; Principal PORTB PORTC 7

14 title " Leer el Puerto C, complementarlo y transferirlo al Puerto B " ;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 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 *********************************************************************** ;**************************** Registros ************************************************************************ ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;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 BSF STATUS,RP0 MOVLW B' ' MOVWF TRISC CLRF TRISB BCF STATUS,RP0 ; Poner el Puerto C como entrada de datos. ; Poner el Puerto B como salida de datos. ;**************************** Inicio ******************************************************************************* INICIO COMF PORTC,W ; Complementar el Puerto C y llevarlo al Acumulador. MOVWF PORTB ; Transferir el dato del Acumulador al Puerto B GOTO INICIO END 8

15 1.3.- Ejemplo3.asm (Entrenador Básico 0) Diagrama de Flujo Parpadeo de un Led Elegimos PIC List p=16f877, f=inhx32 Subrutina de Tiempo REG3 # DATO3 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> REG2 # DATO2 ; Igualdades DATO1 EQU 0X10 DATO2 EQU 0X64 DATO3 EQU 0X64 REG1 # DATO1 REG1 REG1-1 ; Registros REG1 EQU 0X22 REG2 EQU 0X23 REG3 EQU 0X24 Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa ORG 0x05 Sección de Configuración ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0 PORTB B ; Limpiar el Puerto B ; Principal PB0 1 ; Encender el Led de PB0 REG1 = 0? SI REG2 REG2-1 REG2 = 0? SI REG3 REG3-1 REG3 = 0? SI RETUR NO NO NO SEGUNDO PB0 0 ; Apagar el Led de PB0 SEGUNDO 9

16 title " Parpadeo de un Led " ;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 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 *********************************************************************** DATO1 DATO2 DATO3 EQU 0X10 EQU 0X64 EQU 0X64 ;**************************** Registros ************************************************************************ REG1 EQU 0X22 REG2 EQU 0X23 REG3 EQU 0X24 ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;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 BSF STATUS,RP1 BSF STATUS,RP0 CLRF TRISB ; Configuramos el Puerto B como salidas BCF STATUS,RP0 CLRF PORTB ;**************************** Inicio **************************************************************************** SEGUIR BSF PORTB,0 CALL SEGUNDO 10

17 BCF PORTB,0 CALL SEGUNDO GOTO SEGUIR ;**************************** Subrutina de perdida de tiempo de 1 Segundo ****************************** SEGUNDO SEG7 SEG6 SEG5 MOVLW DATO3 MOVWF REG3 MOVLW DATO2 MOVWF REG2 MOVLW DATO1 MOVWF REG1 DECFSZ REG1,F GOTO SEG5 DECFSZ REG2,F GOTO SEG6 DECFSZ REG3,F GOTO SEG7 RETURN END 11

18 1.4.- Ejemplo3A.asm (Entrenador Básico 0) Diagrama de Flujo Parpadeo de un Led Utilizando una librería de Tiempo Librería de Tiempo RETART_1S.INC ; Igualdades Elegimos PIC List p=16f877, f=inhx32 DATO1 EQU 0X10 DATO2 EQU 0X64 DATO3 EQU 0X64 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros CBOCK REG1 REG2 REG3 ENDC ; Registros SEGUNDO REG3 # DATO3 CBLOCK 0X20 ENDC REG2 # DATO2 Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa REG1 # DATO1 REG1 REG1-1 ORG 0x05 Sección de Configuración ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0 PORTB B ; Limpiar el Puerto B REG1 = 0? SI REG2 REG2-1 NO ; Principal PB0 1 ; Encender el Led de PB0 SEGUNDO REG2 = 0? SI REG3 REG3-1 NO PB0 0 ; Apagar el Led de PB0 SEGUNDO REG3 = 0? SI RETUR NO 12

19 title " Parpadeo de un Led utilizando una librería llamada RETAR_1S.INC " ;Programa para PIC 16F877a. ;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 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 ************************************************************************ ;*************************** Registros ************************************************************************** CBLOCK 0X20 ENDC ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;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 BSF STATUS,RP0 CLRF TRISB ; Configuramos el Puerto B como salidas BCF STATUS,RP0 CLRF PORTB ;**************************** Inicio ******************************************************************************* SEGUIR BSF PORTB,0 CALL SEGUNDO BCF PORTB,0 CALL SEGUNDO GOTO SEGUIR ;********************************** Librerías ********************************************************************* INCLUDE <RETAR_1S.INC> END Ejemplo3B.asm (Entrenador Básico 0) 13

20 title " Parpadeo de un Led utilizando una librería llamada RETARDOS.INC del libro de Desarrollo de Proyectos" ;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 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 ************************************************************************ ;*************************** Comienzo de registros ************************************************************ CBLOCK 0X20 ENDC ;**************************** Sección Código de Reset ******************************************************** ORG 0x00 ;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 BSF STATUS,RP0 CLRF TRISB ; Configuramos el Puerto B como salidas BCF STATUS,RP0 CLRF PORTB ;**************************** Inicio ******************************************************************************* SEGUIR BSF PORTB,0 CALL Retardo_1s BCF PORTB,0 CALL Retardo_1s GOTO SEGUIR ;**************************** Librerías *************************************************************************** INCLUDE <RETARDOS.INC> END Ejemplo4.asm (Entrenador Básico 0) 14

21 Diagrama de Flujo 1 Simular las luces del Coche Fantástico PORTB DATO Elegimos PIC List p=16f877, f=inhx32 CONTADOR CONTADOR + 1 CY 7 DATO 0 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> Retardo_100ms ; Igualdades CONTADOR = 8? NO CY 0 SI CONTADOR B ; Registros CBLOCK 0X20 CY 0 CONTADOR DATO ENDC CY 7 DATO 0 Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa PORTB DATO Sección de Configuración Retardo_100ms ORG 0x05 ; Inicio de Programa COMIENZO CONTADOR B ; Resetear CONTADOR RP0 1 ; Ir al Banco 1 TRISB B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0 DATO B ; Encendemos el Led PB7 y guardamos el código en un Registro. CONTADOR CONTADOR + 1 CONTADOR = 7? SI CONTADOR B NO 1 title " Simular las luces del Coche Fantástico " 15

22 ;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 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 *********************************************************************** ;*************************** Registros ************************************************************************** CBLOCK 0X20 CONTADOR DATO ENDC ;**************************** Sección Código de Reset ******************************************************** ORG 0x00 ;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 CLRF CONTADOR BCF STATUS,RP1 ; Selecciono la pagina 1 de la memoria BSF STATUS,RP0 MOVLW B' ' ; Configuro el PB salidas. MOVWF TRISB BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria ;*************************** Principal ************************************************************************* SEGUIR MOVLW B' ' ; Encendemos el Led PB7 MOVWF DATO ; Guardamos el código en un Registro. 16

23 SEG1 MOVF DATO,W ;Transferimos la información del registro DATO MOVWF PORTB ; al Puerto B. INCF CONTADOR CALL Retardo_100ms ; Incrementamos CONTADOR. ; Llamamos a la Subrutina de Retardo TIEMPO. MOVF CONTADOR,W ; Preguntamos si CONTADOR = 8 XORLW 0X08 BTFSC STATUS,Z GOTO SEG2 SEG4 BCF STATUS,C ; Si CONTADOR <> 8 ponemos el Cy=0 y rotamos hacia RRF DATO,F ; la Derecha el registro DATO. GOTO SEG1 ; Seguimos hacia la Derecha. SEG2 CLRF CONTADOR ; Si CONTADOR = 8 ponemos el CONTADOR=0, Cy=0 y SEG3 BCF STATUS,C ; rotamos hacia la Izquierda el registro DATO. RLF DATO,F MOVF DATO,W ; Transferimos la información del registro DATO MOVWF PORTB ; al Puerto B. CALL Retardo_100ms ; Llamamos a la Subrutina de Retardo TIEMPO. INCF CONTADOR ; Preguntamos si CONTADOR = 7 MOVF CONTADOR,W XORLW 0X07 BTFSS STATUS,Z GOTO SEG3 ; Seguimos hacia la Izquierda. MOVLW 0X01 ; Ponemos el CONTADOR = 1 y volvemos hacia la izquierda. MOVWF CONTADOR GOTO SEG4 ;*************************** Subrutinas ********************************************************************** INCLUDE <RETARDOS.INC> END Ejemplo5.asm (Entrenador Básico 0) 17

24 Diagrama de Flujo 1 Simular las luces del Coche Fantástico controlado por PCO PORTB DATO Elegimos PIC List p=16f877, f=inhx32 PC0 = 1? SI NO Asignación de nombres de RFS a direcciones. #include <p16f877.inc> CONTADOR CONTADOR + 1 Retardo_100ms CY 7 DATO 0 ; Igualdades CONTADOR = 8? NO CY 0 ; Registros CBLOCK 0X20 SI CONTADOR B CONTADOR DATO CY 0 ENDC Sección de código de Reset CY 7 DATO 0 ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración PORTB DATO ORG 0x05 ; Inicio de Programa COMIENZO CONTADOR B ; Resetear CONTADOR RP0 1 ; Ir al Banco 1 TRISB B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0 TRIRC (0) 1 ; Poner PC0 como salida de datos PC0 = 1? SI Retardo_100ms NO PCO = 1? DATO B ; Encendemos el Led PB7 y guardamos el código en un Registro. SI NO CONTADOR CONTADOR + 1 CONTADOR = 7? SI CONTADOR B NO title " Simular 1 el Coche Fantástico, controlado por PC0" 18

25 ;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 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 *********************************************************************** ;**************************** Registros ************************************************************************ CBLOCK 0X20 CONTADOR DATO ENDC ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;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 CLRF CONTADOR BCF STATUS,RP1 ; Selecciono la pagina 1 de la memoria BSF STATUS,RP0 MOVLW B' ' ; Configuro el PB salidas. MOVWF TRISB BSF TRISC,0 BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria ;*************************** Principal *************************************************************************** SEGUIR BTFSS PORTC,0 GOTO SEGUIR MOVLW B' ' ; Encendemos el Led PB7 MOVWF DATO ; Guardamos el código en un Registro. 19

26 SEG1 MOVF DATO,W ; Transferimos la información del registro DATO MOVWF PORTB ; al Puerto B. PARAR1 BTFSS PORTC,0 GOTO PARAR1 INCF CONTADOR ; Incrementamos CONTADOR. CALL Retardo_100ms ; Llamamos a la Subrutina de Retardo TIEMPO. MOVF CONTADOR,W ; Preguntamos si CONTADOR = 8 XORLW 0X08 BTFSC STATUS,Z GOTO SEG2 SEG4 BCF STATUS,C ; Si CONTADOR <> 4 ponemos el Cy=0 y rotamos hacia RRF DATO,F ; la Izquierda el registro DATO. GOTO SEG1 ; Seguimos hacia la Izquierda. SEG2 CLRF CONTADOR ; Si CONTADOR = 4 ponemos el CONTADOR=0,Cy=0 y SEG3 BCF STATUS,C ; rotamos hacia la Derecha el registro DATO. RLF DATO,F PARAR2 MOVF DATO,W ; Transferimos la información del registro DATO MOVWF PORTB ; al Puerto B. BTFSS PORTC,0 GOTO PARAR2 INCF CONTADOR ; Preguntamos si CONTADOR = 7 CALL Retardo_100ms ; Llamamos a la Subrutina de Retardo TIEMPO. MOVF CONTADOR,W XORLW 0X07 BTFSS STATUS,Z GOTO SEG3 ; Seguimos hacia la Derecha. MOVLW 0X01 ; Ponemos el CONTADOR = 1 y volvemos hacia la izquierda. MOVWF CONTADOR GOTO SEG4 ;*************************** Librerías *************************************************************************** INCLUDE <RETARDOS.INC> END Nom_disp.asm (Entrenador Básico 0) 20

27 Diagrama de Flujo Poner el Nombre en el Display 1 CONTADOR B Elegimos PIC List p=16f877, f=inhx32 W CONTADOR Asignación de nombres de RFS a direcciones. #include <p16f877.inc> BINARIO_CARACTER PORTD W ; Igualdades Numero_de_caracteres EQU D '5' Retardo_500ms ; Registros CBLOCK 0X20 CONTADOR CONTADOR + 1 CONTADOR ENDC Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa NO CONTADOR = Numero_de _caracteres SI Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISD B ; Poner el Puerto D como salida de datos. RP0 0 ; Ir al Banco 0 BINARIO_CARACTE R PCL PCL + W 1 RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' ;Retorna con W cargado con P ;Retorna con W cargado con E ;Retorna con W cargado con d ;Retorna con W cargado con r ;Retorna con W cargado con o title " Poner el NOMBRE en el Display " 21

28 ;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 etiquetas 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 ************************************************************************ Numero_de_caracteres EQU D'5' ;**************************** Registros ************************************************************************* CBLOCK 0X20 CONTADOR ENDC ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;**************************** Sección de Configuración ******************************************************* ORG 0x05 ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria CLRF TRISD ; Configuro el Puerto D como salida BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria ;*************************** Principal *************************************************************************** SEG2 SEG1 CLRF CONTADOR MOVF CONTADOR,W CALL BINARIO_CARACTER MOVWF PORTD CALL Retardo_500ms INCF CONTADOR,F MOVF CONTADOR,W SUBLW Numero_de_caracteres BTFSS STATUS,Z GOTO SEG1 GOTO SEG2 22

29 ;***************************** Subrutina de BINARIO_CARACTER ******************************************* BINARIO_CARACTER ADDWF PCL,F RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' ;Suma el Contador del Programa con el contenido ; de W y lo deja en el PC. ;Retorna con W cargado con P ;Retorna con W cargado con E ;Retorna con W cargado con d ;Retorna con W cargado con r ;Retorna con W cargado con o ;***************************** Librerías *************************************************************************** INCLUDE <RETARDOS.INC> END Sum_Nibl.asm (Entrenador Básico 0) 23

30 Diagrama de Flujo 1 Sumar los nibles del Puerto C y llevarlos al Puerto B Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> W PORTC W B AND W Numero_bajo W ; Igualdades W PORTC ; Registros CBLOCK 0X20 Numero_bajo Numero_alto ENDC W B AND W Numero_alto W Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Numero_alto Numero_alto ( 7..4 ) ( 3..0 ) W Numero_alto Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner el Puerto B como salida de datos. TRISC B ; Poner el Puerto C como entrada de datos. RP0 0 ; Ir al Banco 0 W W + Numero_bajo PORTB W title " Sumar los nibles del Puerto C y llevarlos al Puerto B " ;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. 1 24

31 ;**************************** Elegimos PIC ********************************************************************* list p=16f877, f=inhx32 ;************* Asignación de etiquetas 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 ************************************************************************ ;**************************** Registros ************************************************************************** CBLOCK 0X20 Numero_bajo Numero_alto ENDC ;**************************** Sección Código de Reset ******************************************************** ORG 0x00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;**************************** Sección de Configuración ******************************************************** ORG 0x05 ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria CLRF TRISB ; Configuro el Puerto B como salida MOVLW B' ' MOVWF TRISC BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria ;**************************** Inicio ******************************************************************************* SEG1 COMF PORTC,W ANDLW B' ' MOVWF Numero_bajo COMF PORTC,W ANDLW B' ' MOVWF Numero_alto SWAPF Numero_alto,F MOVF Numero_alto,W ADDWF Numero_bajo,W MOVWF PORTB GOTO SEG1 END Dir_ind.asm (Entrenador Básico 0) 25

32 Diagrama de Flujo Direccionamiento Indirecto Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros CBLOCK 0X20 REG1 REG2 REG3 ENDC Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Principal ORG 0x05 COMIENZO ; Inicio de Programa FSR # REG1 (FSR) D 1 FSR FSR + 1 (FSR) D 2 FSR FSR + 1 (FSR) D 3 FSR FSR + 1 title "Direccionamiento indirecto " FIN 26

33 ;Programa para PIC 16F876a. ;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=16f876, f=inhx32 ;************* Asignación de etiquetas 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 ************************************************************************ ;*************************** Registros ************************************************************************** CBLOCK 0X20 REG1 REG2 REG3 ENDC ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Principal ************************************************************************** ORG 0x05 ; Inicio de Programa (Una posición detrás del vector de Interrupción). COMIENZO MOVLW REG1 MOVWF FSR ; Cargas la dirección del Registro REG1 20H en el Puntero FSR. MOVLW D'1' MOVWF INDF ; Cargas donde apunta el Puntero (FSR) el dato 1. (20H) 1. INCF FSR ; Incrementas el Puntero FSR 21H. MOVLW D'2' MOVWF INDF ; Cargas donde apunta el Puntero (FSR) el dato 2. (21H) 2. INCF FSR ; Incrementas el Puntero FSR 22H. MOVLW D'3' MOVWF INDF ; Cargas donde apunta el Puntero (FSR) el dato 3. (22H) 3. INCF FSR ; Incrementas el Puntero FSR 23H. END Pagina1.asm (Entrenador Básico 0) 27

34 Diagrama de Flujo Trabajar con la Pagina 1 de memoria de Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> Subrutina Prueba Pagina1 ORG 0800H ; Igualdades PORTC PORTB ; Cambio a la Página0 ; Registros PCLATCH3 0 CBLOCK 0X20 ENDC RETUR N Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración ORG 0X05 COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner el Puerto B como salida de datos. TRISC B ; Poner el Puerto C como entrada de datos. RP0 0 ; Ir al Banco 0 ; Cambio a la Página1 PCLATCH3 1 PCLATCH4 0 PAGINA1 title " Trabajar con la Pagina 1 de memoria de Programa " 28

35 ;Programa para PIC 16F876a. ;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=16f876, f=inhx32 ;************ Asignación de etiquetas 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 *********************************************************************** ;**************************** Registros ************************************************************************* ;**************************** Sección Código de Reset ****************************************************** ORG 0x00 ;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 BSF STATUS,RP0 MOVLW B' ' MOVWF TRISC CLRF TRISB BCF STATUS,RP0 ;**************************** Inicio ***************************************************************************** SEG1 BSF PCLATH,3 ;Ir a la Pagina1 de memoria de Programa BCF PCLATH,4 CALL PAGINA1 GOTO SEG1 ;****************************Subrutina Prueba Pagina1 ******************************************************* ORG 0800H PAGINA1 MOVF PORTC,W MOVWF PORTB ;Ir a la Pagina0 de memoria de Programa BCF PCLATH,3 RETURN END RETARDO_1S.INC (Entrenador Básico 0) 29

36 ;*********************** Librería Casera de Retardo 1 Segundo ********************************************** ;*********************** Igualdades ****************************************************************************** DATO1 DATO2 DATO3 EQU D'100' EQU D'100' EQU D'20' ;*********************** Registros ******************************************************************************** CBLOCK REG1 REG2 REG3 ENDC ;*********************** Subrutina SEGUNDO ***************************************************************** SEGUNDO SEG7 SEG6 SEG5 MOVLW DATO3 MOVWF REG3 MOVLW DATO2 MOVWF REG2 MOVLW DATO1 MOVWF REG1 DECFSZ REG1,F GOTO SEG5 DECFSZ REG2,F GOTO SEG6 DECFSZ REG3,F GOTO SEG7 RETURN RETARDOS.INC (Entrenador Básico 0) 30

37 ;**************************** Librería "RETARDOS.INC" ***************************************************** ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== ; ; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. ; Además se pueden implementar otras subrutinas muy fácilmente. ; ; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal ; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada ; ciclo máquina tarda 4 x 1/4MHz = 1 µs. ; ; En los comentarios, "cm" significa "ciclos máquina". ; ; ZONA DE DATOS ************************************************************************************* CBLOCK R_ContA ; Contadores para los retardos. R_ContB R_ContC ENDC ; ; RETARDOS de 4 hasta 10 microsegundos ; ; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ, ; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina ; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina. ; Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina. ; ; RETARDOS de 20 hasta 500 microsegundos ; Retardo_500micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. movlw d'164' ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina. Retardo_200micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. movlw d'64' ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina. Retardo_100micros ; La llamada "call" aporta 2 ciclos máquina. movlw d'31' ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina. Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. movlw d'14' ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina. Retardo_20micros ; La llamada "call" aporta 2 ciclos máquina. 31

38 movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "K". ; ; El próximo bloque "RetardoMicros" tarda: ; 1 + (K-1) (K-1)x2 + 2 = (2 + 3K) ciclos máquina. ; RetardoMicros movwf R_ContA ; Aporta 1 ciclo máquina. Rmicros_Bucle decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto Rmicros_Bucle ; Aporta (K-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina. ; ;En total estas subrutinas tardan: ; - Retardo_500micros: (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz). ; - Retardo_200micros: (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz). ; - Retardo_100micros: (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz). ; - Retardo_50micros : (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz). ; - Retardo_20micros : (2 + 3K) = 20 cm = 20 µs. (para K= 5 y 4 MHz). ; ; RETARDOS de 1 ms hasta 200 ms ; Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_50ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_20ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_10ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_5ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_2ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'2' ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina. Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M". ; ; El próximo bloque "Retardos_ms" tarda: ; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) (M-1)x2 + 2 = ; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina ; que a 4 MHz son 1002 µs = 1 ms. ; Retardos_ms movwf R_ContB ; Aporta 1 ciclo máquina. R1ms_BucleExterno movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta Mx1 ciclos máquina. R1ms_BucleInterno nop ; Aporta KxMx1 ciclos máquina. decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar). goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina. decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar). 32

39 goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina. ; ;En total estas subrutinas tardan: ; - Retardo_200ms: (2 + 4M + 4KM) = cm = 200 ms. (M=200 y K=249). ; - Retardo_100ms: (2 + 4M + 4KM) = cm = 100 ms. (M=100 y K=249). ; - Retardo_50ms : (2 + 4M + 4KM) = cm = 50 ms. (M= 50 y K=249). ; - Retardo_20ms : (2 + 4M + 4KM) = cm = 20 ms. (M= 20 y K=249). ; - Retardo_10ms : (2 + 4M + 4KM) = cm = 10 ms. (M= 10 y K=249). ; - Retardo_5ms : (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249). ; - Retardo_2ms : (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249). ; - Retardo_1ms : (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249). ; ; RETARDOS de 0.5 hasta 20 segundos ; Retardo_20s ; La llamada "call" aporta 2 ciclos máquina. movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina. Retardo_10s ; La llamada "call" aporta 2 ciclos máquina. movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina. Retardo_5s ; La llamada "call" aporta 2 ciclos máquina. movlw d'50' ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina. Retardo_2s ; La llamada "call" aporta 2 ciclos máquina. movlw d'20' ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina. Retardo_1s ; La llamada "call" aporta 2 ciclos máquina. movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina. Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina. movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "N". ; ; El próximo bloque "Retardo_1Decima" tarda: ; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 + ; + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) (N-1)x2 + 2 = ; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone ; ciclos máquina que a 4 MHz son µs = 100 ms = 0,1 s = 1 décima de segundo. ; Retardo_1Decima movwf R_ContC ; Aporta 1 ciclo máquina. R1Decima_BucleExterno2 movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M". movwf R_ContB ; Aporta Nx1 ciclos máquina. R1Decima_BucleExterno movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta MxNx1 ciclos máquina. R1Decima_BucleInterno nop ; Aporta KxMxNx1 ciclos máquina. decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina. decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar). goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina. decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina. ; ;En total estas subrutinas tardan: ; - Retardo_20s: (2 + 4N + 4MN + 4KMN) = cm = 20 s. ; (N=200, M=100 y K=249). 33

40 ; - Retardo_10s: (2 + 4N + 4MN + 4KMN) = cm = 10 s. ; (N=100, M=100 y K=249). ; - Retardo_5s: (2 + 4N + 4MN + 4KMN) = cm = 5 s. ; (N= 50, M=100 y K=249). ; - Retardo_2s: (2 + 4N + 4MN + 4KMN) = cm = 2 s. ; (N= 20, M=100 y K=249). ; - Retardo_1s: (2 + 4N + 4MN + 4KMN) = cm = 1 s. ; (N= 10, M=100 y K=249). ; - Retardo_500ms: (2 + 4N + 4MN + 4KMN) = cm = 0,5 s. ; (N= 5, M=100 y K=249). ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== 34

41 2.- Entrenador Básico 1 35

42 2.1.- Ejemplo6.asm (Entrenador Básico 1) Diagrama de Flujo Encender displays dependiendo de PC0 Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros CBLOCK 0X20 ENDC Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración ORG 0X05 COMIENZO RP0 1 ; Ir al Banco 1 TRISD B ; Poner el Puerto D como salida de datos. TRISC (0) 1 ; Poner PC0 como entrada de Datos ADCON B ; Configuro las patillas de los PUERTOS A y D como señales digitales. TRISE B ; Poner el Puerto E como salida de datos. RP0 0 ; Ir al Banco 0 PORTD B NO PCO = 1? SI ; Encender Display de DECENAS PORTE B ; Encender Display de UNIDADES PORTE B 36

43 title " Encender displays dependiendo de PC0 " ;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 etiquetas 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 ************************************************************************ ;**************************** Registros ************************************************************************* ;**************************** Sección Código de Reset ******************************************************* ORG 0x00 ;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 BCF STATUS,RP1 ; Selecciono la pagina 1 de la memoria BSF STATUS,RP0 MOVLW B' ' ; Configuro el PD como salidas. MOVWF TRISD BSF TRISC,0 CLRF PORTE ; Configuro el PE como salidas. BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria ;*************************** Principal *************************************************************************** SEGUIR SEG1 UNIDADES DECENAS MOVLW B' ' MOVWF PORTD BTFSS PORTC,0 GOTO DECENAS MOVLW B' ' MOVWF PORTE GOTO SEG1 MOVLW B' ' MOVWF PORTE GOTO SEG1 37

44 END Ejemplo7.asm (Entrenador Básico 1) Diagrama de Flujo 1 Contar pulsos procedentes de PC0 y llevarlos al Display de CONTADOR B PORTE B Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> NO SI PCO = 0? ; Igualdades NMAYOR EQU 0X0A ; Registros W CONTADOR TABLA CBLOCK 0X20 CONTADOR B PORT D W CONTADOR ENDC CONTADOR CONTADOR +1 Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa SI CONTADOR = NMAYOR? NO Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 TRISD B ; Poner el Puerto D como salida de datos. TRISC (0) 1 ; Poner PC0 como entrada de Datos ADCON B ; Configuro las patillas de los PUERTOS A y D como señales digitales. TRISE B ; Poner el Puerto E como salida de datos. RP0 0 ; Ir al Banco 0 ;Poner el Display de Unidades a cero PORTD B RETLW B' ' 00H RETLW B' ' 01H RETLW B' ' 02H RETLW B' ' 03H RETLW B' ' 04H Subrutina TABLA PCL PCL + W ;Retorna con W cargado con ;Retorna con W cargado con ;Retorna con W cargado con ;Retorna con W cargado con ;Retorna con W cargado con 1 38

45 title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades " ;Programa para PIC 16F877. ;Velocidad del Reloj:20 MHz. ;Reloj instrucción: 1 MHz = 200 ns. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32 ;************ Asignación de etiquetas 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 ************************************************************************ NMAYOR EQU 0X0A ;**************************** Registros ************************************************************************** CBLOCK 0X20 CONTADOR ENDC ;**************************** Sección Código de Reset ******************************************************** ORG 00h ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Sección de Configuración ********************************************************* ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria CLRF TRISD ; Configuro el Puerto D como salida de datos. MOVLW 0X06 ; Configuro el Puerto A y D como patillas digitales. MOVWF ADCON1 CLRF TRISE BSF PORTC,0 BCF STATUS,RP0 ; Configuro el puerto E como salida de datos. ; Configuro la patilla PC0 como entrada de datos. ; Selecciono la pagina 0 de la memoria CLRF CONTADOR MOVLW B' ' MOVWF PORTD ; Poner el DISPLAY de unidades a cero. 39

46 INCF CONTADOR MOVLW B' ' MOVWF PORTE ;*************************** Principal ***************************************************************************** SEGUIR BTFSC PORTC,0 GOTO SEGUIR MOVF CONTADOR,W CALL TABLA SEG1 INCF CONTADOR,F MOVWF PORTD MOVF CONTADOR,W XORLW NMAYOR BTFSS STATUS,Z GOTO SEG1 CLRF CONTADOR BTFSS PORTC,0 GOTO SEG1 GOTO SEGUIR ;***************************** Subrutina de Tabla *************************************************************** TABLA ADDWF PCL,F ;Suma el Contador del Programa con el contenido ;de W y lo deja en el PC. RETLW B' ' ;Retorna con W cargado con 00H RETLW B' ' ;Retorna con W cargado con 01H RETLW B' ' ;Retorna con W cargado con 02H RETLW B' ' ;Retorna con W cargado con 03H RETLW B' ' ;Retorna con W cargado con 04H RETLW B' ' ;Retorna con W cargado con 05H RETLW B' ' ;Retorna con W cargado con 06H RETLW B' ' ;Retorna con W cargado con 07H RETLW B' ' ;Retorna con W cargado con 08H RETLW B' ' ;Retorna con W cargado con 09H END 40

47 2.3.- Ejemplo8.asm (Entrenador Básico 1) Diagrama de Flujo 1 Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades NMAYOR EQU D 100 Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 ADCON B ; Configuro las patillas de los PUERTOS A y D como señales digitales. TRISD B ; Poner el Puerto D como salida de datos. TRISE B ; Poner el Puerto E como TRISC B salida de datos. ; Poner Puerto C como entrada de datos RP0 0 ; Ir al Banco 0 PULSOS B ; Resetear el registro PULSOS, es un registro que contiene el numero de pulsaciones. CONTADOR B ; Iniciar el CONTADOR a 1 ; Registros MOSTRAR_DISPLAY CBLOCK 0X20 CONTADOR DISPLAY UNIDADES DECENAS CENTENAS DIVIDENDO DIVISOR COCIENTE RESTO ENDC NO PCO = 0? SI PULSOS CONTADOR CONTADOR CONTADOR +1 Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa N0 CONTADOR = NMAYOR? SI CONTADOR B 1 MOSTRAR_DISPLAY SI PCO = 1? NO 41

48 Subrutina de MOSTRAR_DISPLAY Subrutina de BIN_BCD BIN_BCD DIVISOR D 100 W PULSOS W UNIDADES BCD_7SEG PORTD W DIVIDIR ; Habilitar display de las UNIDADES CENTENAS COCIENTE PORTE B DIVISOR D 10 ; Temporizar. Perder tiempo con dos NOP W RESTO ; Deshabilitar display de las UNIDADES y DECENAS PORTE B DIVIDIR DECENAS COCIENTE W DECENAS BCD_7SEG PORTD W UNIDADES RESTO ; Habilitar display de las DECENAS PORTE B RETUR N ; Temporizar. Perder tiempo con dos NOP Subrutina de DIVIDIR ; Deshabilitar display de las UNIDADES y DECENAS PORTE B COCIENTE B DIVIDENDO W RETUR N Subrutina BCD_7SEG RESTO DIVIDENDO DIVIDENDO DIVIDENDO - DIVISOR PCL PCL + W RETLW B' ' ;Retorna con W cargado con 00H RETLW B' ' ;Retorna con W cargado con 01H RETLW B' ' ;Retorna con W cargado con 02H RETLW B' ' ;Retorna con W cargado con 03H RETLW B' ' ;Retorna con W cargado con 04H RETLW B' ' ;Retorna con W cargado con 05H RETLW B' ' ;Retorna con W cargado con 06H RETLW B' ' ;Retorna con W cargado con 07H RETLW B' ' ;Retorna con W cargado con 08H SI DIVIDENDO < 0? COCIENTE COCIENTE + 1 RETURN NO 42

49 title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas " ;Programa para PIC 16F877. ;Velocidad del Reloj:20 MHz. ;Reloj instrucción: 1 MHz = 200 ns. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ********************************************************************* list p=16f877, f=inhx32 ;************* Asignación de etiquetas del 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 *********************************************************************** NMAYOR EQU D'100' ;**************************** Registros ************************************************************************* CBLOCK 0X20 CONTADOR PULSOS UNIDADES DECENAS CENTENAS DIVIDENDO DIVISOR COCIENTE RESTO ENDC ;**************************** Sección Código de Reset ************************************************** ORG 0x00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;**************************** Sección de Configuración ************************************************* ORG 0x05 ; Inicio de Programa (Una posición detrás del vector de Interrupción COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria MOVLW 0X06 43

50 MOVWF ADCON1 CLRF TRISD CLRF TRISE MOVLW B' ' MOVWF TRISC BCF STATUS,RP0 CLRF PULSOS ; ; Configuro el Puerto D como salida ; Configuro el Puerto E como salida ; Configuro el puerto PC como entrada. ; Selecciono la pagina 0 de la memoria Resetear el registro PULSOS, es un registro que contiene el numero de pulsaciones. MOVLW B ; Inicializamos el CONTADOR con 1. MOVWF CONTADOR ; ;*************************** Principal **************************************************************************** SEGUIR CALL MOSTRAR_DISPLAY BTFSC PORTC,0 GOTO SEGUIR MOVF CONTADOR,W MOVWF PULSOS INCF CONTADOR,F MOVF CONTADOR,W XORLW NMAYOR BTFSS STATUS,Z GOTO SEG1 CLRF CONTADOR SEG1 CALL MOSTRAR_DISPLAY BTFSS PORTC,0 GOTO SEG1 GOTO SEGUIR ;***************************** Subrutina de BCD_7SEG *************************************************************** BCD_7SEG ADDWF PCL,F ;Suma el Contador del Programa con el contenido ;de W y lo deja en el PC. RETLW B' ' ;Retorna con W cargado con 00H RETLW B' ' ;Retorna con W cargado con 01H RETLW B' ' ;Retorna con W cargado con 02H RETLW B' ' ;Retorna con W cargado con 03H RETLW B' ' ;Retorna con W cargado con 04H RETLW B' ' ;Retorna con W cargado con 05H RETLW B' ' ;Retorna con W cargado con 06H RETLW B' ' ;Retorna con W cargado con 07H RETLW B' ' ;Retorna con W cargado con 08H RETLW B' ' ;Retorna con W cargado con 09H ;****************************** Subrutina de MOSTRAR_DISPLAY ********************************************* MOSTRAR_DISPLAY CALL BIN_BCD MOVF UNIDADES,W CALL BCD_7SEG MOVWF PORTD MOVLW B' ' MOVWF PORTE NOP NOP MOVLW B' ' MOVWF PORTE 44

51 NOP NOP MOVF DECENAS,W CALL BCD_7SEG MOVWF PORTD MOVLW B' ' MOVWF PORTE NOP NOP MOVLW B' ' MOVWF PORTE NOP NOP RETURN ;***************************** Subrutina de Binario a BCD ******************************************************** BIN_BCD movlw D 100 ; Cargamos divisor con 100 movwf DIVISOR movf PULSOS,w call DIVIDIR movf COCIENTE,w movwf CENTENAS movlw D 10 ; Cargamos divisor con 10 movwf DIVISOR movf RESTO,w call DIVIDIR movf COCIENTE,w movwf DECENAS movf RESTO,w movwf UNIDADES return ;****************************** Subrutina de DIVIDIR ************************************************************** DIVIDIR seg2 seg3 clrf COCIENTE movwf DIVIDENDO movf DIVIDENDO,w movwf RESTO movf DIVISOR,w subwf DIVIDENDO,f btfss STATUS,C goto seg3 incf COCIENTE goto seg2 RETURN END 45

52 3.- Entrenador Básico 2 46

53 3.1.- Ejemplo9.asm (Entrenador Básico 2) Diagrama de Flujo 1 Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades NMAYOR EQU D 100 ; Registros CBLOCK 0X20 Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 ADCON B ; Configuro las patillas de los PUERTOS A y D como señales digitales. TRISD B ; Poner el Puerto D como salida de datos. TRISE B ; Poner el Puerto E como salida de datos. TRISB B ; Poner el Puerto B como salida de datos. TRISC B ; Poner Puerto C como entrada de datos CONTADOR B ; Resetear el CONTADOR PORTD B ; Poner los dispays a cero. PORTB B PORTE B CONTADOR CONTADOR +1 RP0 0 ; Ir al Banco 0 CONTADOR DISPLAY UNIDADES DECENAS CENTENAS DIVIDENDO DIVISOR COCIENTE RESTO ENDC NO PCO = 0? SI PULSOS CONTADOR MOSTRAR_DISPLAY Sección de código de Reset CONTADOR CONTADOR +1 ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa 1 N0 CONTADOR = NMAYOR? SI CONTADOR B SI PCO = 1? NO 47

54 Subrutina de MOSTRAR_DISPLAY Subrutina de BIN_BCD BIN_BCD DIVISOR D 100 W UNIDADES W PULSOS BCD_7SEG DIVIDIR PORTD W CENTENAS COCIENTE W DECENAS DIVISOR D 10 BCD_7SEG W RESTO PORTB W DIVIDIR RETUR N DECENAS COCIENTE UNIDADES RESTO Subrutina BCD_7SEG RETUR N RETLW B' ' 00H RETLW B' ' 01H RETLW B' ' 02H RETLW B' ' 03H RETLW B' ' PCL PCL + W ;Retorna con W cargado con ;Retorna con W cargado con ;Retorna con W cargado con ;Retorna con W cargado con ;Retorna con W cargado con Subrutina de DIVIDIR COCIENTE B DIVIDENDO W RESTO DIVIDENDO DIVIDENDO DIVIDENDO - DIVISOR SI DIVIDENDO < 0? NO COCIENTE COCIENTE + 1 RETURN 48

55 title " Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas " ;Programa para PIC 16F877. ;Velocidad del Reloj:20 MHz. ;Reloj instrucción: 1 MHz = 200 ns. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ********************************************************************** list p=16f877, f=inhx32 ;*************** Asignación de etiquetas 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 ************************************************************************* NMAYOR EQU D'100' ;**************************** Registros ************************************************************************** CBLOCK 0X20 CONTADOR PULSOS UNIDADES DECENAS CENTENAS DIVIDENDO DIVISOR COCIENTE RESTO ENDC ;**************************** Sección Código de Reset ********************************************************** ORG 00h GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;**************************** Sección de Configuración ********************************************************* ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria MOVLW 0X06 49

56 MOVWF ADCON1 CLRF TRISD CLRF TRISE CLRF TRISB MOVLW B' ' MOVWF TRISC BCF STATUS,RP0 CLRF CONTADOR MOVLW B' ' MOVWF PORTD MOVWF PORTB MOVLW B' ' MOVWF PORTE INCF CONTADOR ; Configuro el Puerto D como salida ; Configuro el puerto PC como entrada. ; Selecciono la pagina 0 de la memoria ; Poner el Puerto D a cero. ; Poner el Puerto B a cero. ;************************************ Principal ***************************************************************** SEGUIR BTFSC PORTC,0 ; Preguntamos si hemos pulsado PC0 GOTO SEGUIR MOVF CONTADOR,W MOVWF PULSOS CALL MOSTRAR_DISPLAY ; Mostramos los datos en los Displays INCF CONTADOR,F ; Incrementamos el CONTADOR de Pulsos. MOVF CONTADOR,W XORLW NMAYOR ; Preguntamos si hemos llegado al máximo pulso a contar. BTFSS STATUS,Z GOTO SEG1 CLRF CONTADOR ; Reseteamos CONTADOR SEG1 BTFSS PORTC,0 ; Preguntamos si sigue pulsado PC0 GOTO SEG1 GOTO SEGUIR ;****************************** Subrutina de MOSTRAR_DISPLAY ****************************************** MOSTRAR_DISPLAY CALL BIN_BCD MOVF UNIDADES,w CALL BCD_7SEG MOVWF PORTD MOVF DECENAS,w CALL BCD_7SEG MOVWF PORTB RETURN ;***************************** Subrutina de Binario a BCD ******************************************************** BIN_BCD movlw D'100' ; Cargamos divisor con 100 movwf DIVISOR movf PULSOS,w call DIVIDIR movf COCIENTE,w movwf CENTENAS movlw D'10' ; Cargamos divisor con 10 movwf DIVISOR movf RESTO,w call DIVIDIR movf COCIENTE,w movwf DECENAS 50

57 movf RESTO,w movwf UNIDADES RETURN ;****************************** Subrutina de Dividir ************************************************************** DIVIDIR seg2 seg3 clrf COCIENTE movwf DIVIDENDO movf DIVIDENDO,w movwf RESTO movf DIVISOR,w subwf DIVIDENDO,f btfss STATUS,C goto seg3 incf COCIENTE goto seg2 RETURN ;***************************** Subrutina de BCD_7SEG ******************************************************** BCD_7SEG ADDWF PCL,F ;Suma el Contador del Programa con el contenido de W y lo deja en el PC. RETLW B' ' ;Retorna con W cargado con 00H RETLW B' ' ;Retorna con W cargado con 01H RETLW B' ' ;Retorna con W cargado con 02H RETLW B' ' ;Retorna con W cargado con 03H RETLW B' ' ;Retorna con W cargado con 04H RETLW B' ' ;Retorna con W cargado con 05H RETLW B' ' ;Retorna con W cargado con 06H RETLW B' ' ;Retorna con W cargado con 07H RETLW B' ' ;Retorna con W cargado con 08H RETLW B' ' ;Retorna con W cargado con 09H END 51

58 4.- Entrenador Básico 2A 52

59 4.1.- PWM_1.asm (Entrenador Básico 2A) Diagrama de Flujo Control de un Servomotor de Posición con PWM a través del Puerto 1 Elegimos PIC List p=16f876, f=inhx32 ; Leer el Puerto B complementarlo y cargarlo en el registro CCPR1L. Este registro fija el tiempo en el nivel alto de la señal PWM. CCPR1L PORTB Asignación de nombres de RFS a direcciones. #include <p16f876.inc> Retardo 20ms ; Igualdades PERIODO EQU D 255 ; Representa el Periodo de la señal de PWM. ; Registros CBLOCK 0X20 ENDC Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 TRISB B TRISC (2) 0 ; Poner Puerto B como entrada de datos ;Habilitamos PC2 como salida para atacar el Servomotor 1. PR2 #PERIODO ; Cargamos el Periodo de la señal de PWM RP0 0 ; Ir al Banco 0 T2CON B ; Cargamos el valor preescalar del PWM Interno, para fijar el periodo. CCP1CON B ;Cargamos los 2 BIT menos significativos del nivel alto de la Señal PWM y configuramos y lanzamos PWM. Salida de señal por RC2 1 53

60 title " Control de un Servomotor de Posición con PWM a través del Puerto B " ;Programa para PIC 16F876a. ;Velocidad del Reloj = 1 MHz. ;Reloj instrucción: 250 khz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ********************************************************************** list p=16f876, f=inhx32 ;*************** Asignación de etiquetas de Registros de Funciones especiales a direcciones *********** #include <p16f876.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 ************************************************************************* PERIODO EQU 0xFF ; Representa el Periodo de la señal de PWM. ;**************************** Registros ************************************************************************** CBLOCK 0X20 ENDC ;**************************** Sección Código de Reset ******************************************************** ORG 0X00 ;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 BSF STATUS,RP0 ; Banco1 BCF STATUS,RP1 MOVLW B' ' MOVWF TRISB BCF TRISC,2 ; Habilitamos PC2 como salida para atacar el Servomotor 1. MOVLW PERIODO ; Cargamos el Periodo de la señal de PWM. MOVWF PR2 BCF STATUS,RP0 MOVLW B' ' ;Cargamos el valor preescalar. (PWM INTERNO) MOVWF T2CON MOVLW B' ' ;Cargamos los 2 BIT menos significativos del nivel ;Alto de la Señal PWM y configuramos y lanzamos PWM. MOVWF CCP1CON ;Salida de señal por RC2 ;*************************** Principal ***************************************************************************** SEG1 COMF PORTB,W MOVWF CCPR1L CALL Retardo_20ms GOTO SEG1 ; Nivel Alto de la señal PWM (Salida por RC2). ; Tiene que transcurrir un periodo antes de refrescar ; el nivel alto de la señal. ;************************** Librerias ******************************************************************************* INCLUDE <RETARDOS.INC> END 54

61 4.2.- PWM_CAD.asm (Entrenador Básico 2A) Diagrama de Flujo 1 Sección de Configuración ORG 0X05H Control de un Servomotor de Posición con PWM a través de un Potenciómetro Elegimos PIC List p=16f876, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f876.inc> ; Igualdades PERIODO EQU D 255 ; Representa el Periodo de la señal de PWM. COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ;Configuración del Conversor Analogico/Digital. ;Configuración del PWM. ; Poner Puerto B como salida de dato TRISA (5) 1 ADCON RP0 0 ; Ir al Banco 0 ADCON RP0 1 ; Ir al Banco 1 TRISC (2) 0 ;Habilitamos PC2 como salida para atacar el Servomotor 1. PR2 #PERIODO ; Cargamos el Periodo de la señal de PWM RP0 0 ; Ir al Banco 0 T2CON B ; Cargamos el valor preescalar del PWM Interno, para fijar el periodo. CCP1CON B ;Cargamos los 2 BIT menos significativos del nivel alto de la Señal PWM y configuramos y lanzamos PWM. Salida de señal por RC2 ; Registros CBLOCK 0X20 ENDC Retardo_20ms Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa ; Lanzamos el Conversor Analógico / Digital GO_DONE 1 ; Es un BIT que está en el registro ADCON0 1 NO GO_DONE = 0? ; Cargamos el registro que contiene el dato digital, en el registro que contiene el nivel alto de la señal de PWM. SI CCPR1L ADRESH ; Cargamos el registro que contiene el dato digital en el Puerto B PORTB ADRESH 55

62 title " Control de un Servomotor de Posición con PWM a través de un Potenciómetro " ;Programa para PIC 16F876a. ;Velocidad del Reloj = 1 MHz. ;Reloj instrucción: 250 khz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ***************************************************************** list p=16f876, f=inhx32 ;************ Asignación de etiquetas de Registros de Funciones especiales a direcciones ********* #include <p16f876.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 ********************************************************************* PERIODO EQU 0xFF ;(Datos). Representa el Periodo de la señal de PWM. ;**************************** Registros *********************************************************************** CBLOCK 0X20 ENDC ;**************************** Sección Código de Reset ***************************************************** ORG 0X00 ;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 BSF STATUS,RP0 ;Banco1 BCF STATUS,RP1 MOVLW B' ' MOVWF TRISB BSF TRISA,5 MOVLW B' ' MOVWF ADCON1 BCF STATUS,RP0 MOVLW B' ' MOVWF ADCON0 BSF STATUS,RP0 ;Configuración del Conversor Analogico/Digital. ;Configuración del PWM. 56

63 BCF TRISC,2 ;Habilitamos PC2 como salida para atacar el Servomotor 1. MOVLW PERIODO MOVWF PR2 ;Cargamos el Periodo de la señal de PWM. BCF STATUS,RP0 MOVLW B' ' MOVWF T2CON MOVLW B' ' MOVWF CCP1CON ;Cargamos el Valor Preescalar.(PWM INTERNO) ;Cargamos los 2 BIT menos significativos del nivel ;Alto de la señal PWM y configuramos y lanzamos PWM. ;Salida de señal por RC2 ;*************************** Principal ******************************************************************** SEG2 CALL Retardo_20ms ; Esperar un tiempo de adquisicion de 20 ms.(periodo DE LA ; SEÑAL), valido para el C A/D y para refrescar CCPR1L BSF ADCON0,GO_DONE SEG1 BTFSC ADCON0,GO_DONE GOTO SEG1 MOVF ADRESH,W MOVWF CCPR1L ; Nivel Alto de la señal PWM (Salida por RC2). COMF ADRESH,W MOVWF PORTB GOTO SEG2 ;*************************** Librerías ******************************************************************** INCLUDE <RETARDOS.INC> END 57

64 5.- Entrenador Básico 3 58

65 5.1.- Ejempl10.asm ( Entrenador Básico 3 ) 1 Diagrama de Flujo Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 Interrupción Externa Elegimos PIC List p=16f876, f=inhx32 TRISB B ; Poner Puerto B como salida de datos excepto PB0 que es la patilla INT TRISE (2) 0 ; Poner PE2 como salida de datos. TRISC B ; Poner Puerto C como salida de datos. INTEDG 0 ; Está en el registro OPTION_REG ; Activa la patilla INT con flanco de bajada. RP0 0 ; Ir al Banco 0 PORTB B ; Apagar los Led del Puerto B. PORTE (2) 1 INTCON B ; Habilitar la Interrupción INT. Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Resetear el registro CONTADOR CONTADOR B ; Igualdades TABLAD = 40 NDATOS = 8 NDATOS1 = D 10 TIEMPOH = 0XC0 TIEMPOL = 0X00 ; Cargar el Puntero FSR #TABLAD W CONTADOR ; Registros CBLOCK 0X20 CONTADOR W_TEMP STATUS_TEMP PIR1_TEMP PORTB_TEMP TMR1H_TEMP TMR1L_TEMP T1CON_TEMP CONTADOR1 ENDC TABLA ;Cargar el contenido del Acumulador donde haya apuntado el Puntero FSR (FSR) W PORTC W TIEMPO Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa ; Incrementar el Puntero FSR FSR +1 Vector de Interrupción ORG 04H GOTO INTERRU ; Incrementar CONTADOR CONTADOR CONTADOR +1 NO SI 1 CONTADOR = NDATOS? 59

66 Rutina de Interrupción INTERRU Subrutina de TABLA INTF = 1? NO PCL PCL + W SI ; Salvar Registros W W_TEMP STATUS STATUS_TEMP PIR1_TEMP PIR1 PORTB_TEMP PORTB TMR1H_TEMP TMR1H TMR1L_TEMP TMR1L T1CON_TEMP T1CON RETFI E RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' ;Retorna con W cargado con 01H ;Retorna con W cargado con 02H ;Retorna con W cargado con 04H ;Retorna con W cargado con 08H ;Retorna con W cargado con 01H ;Retorna con W cargado con 02H ;Retorna con W cargado con 04H ; Resetear CONTADOR1 CONTADOR B Subrutina de TIEMPO ; Poner un dato en el Puerto B PORTB B ; Cargar cuenta Inicial TMR1H #TIEMPOH TMR1L #TIEMPOL TIEMPO TIEMPO ; Configurar el TIMER1 Este proceso se debe de realizar en la Sección de Configuración T1CON B ; Limpiar el Puerto B PORTB B TIEMPO TIEMPO TMR1IF = 1? SI ; Borrar Flag TMR1IF 0 NO ; Incrementar CONTADOR1 CONTADOR1 CONTADOR1 +1 RETURN CONTADOR1 = NDATOS1? ; Borrar Flag de la INT INTF 0 SI NO RETFIE ; Recuperar Registros T1CON T1CON_TEMP TMR1L TMR1L_TEMP TMR1H TMR1H_TEMP PORTB PORTB_TEMP PIR1 PIR1_TEMP STATUS STATUS_TEMP W W_TEMP 60

67 title " Interrupción Externa " ; Un Programa Principal transfiere una Tabla de datos de memoria EPROM a RAM y Puerto B ; utilizando como subrutina de tiempo el TIMER 1 para la cadencia entre dato y dato. ; Cuando Pulsamos INT deja de ejecutar el Programa Principal y pasa a ejecutar la rutina ; de interrupción. Esta enciende y apaga los led 10 veces con el doble de cadencia anterior. ;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 etiquetas a 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 ************************************************************************ TABLAD EQU 40 NDATOS EQU 8 NDATOS1 EQU 0A TIEMPOH EQU 0XC0 TIEMPOL EQU 0X00 ;***************************** Registros ************************************************************************* CBLOCK 0X20 CONTADOR W_TEMP STATUS_TEMP PIR1_TEMP PORTB_TEMP TMR1H_TEMP TMR1L_TEMP T1CON_TEMP CONTADOR1 ENDC ;**************************** Sección Código de Reset ******************************************************** ORG 00h ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa 61

68 ;**************************** Vector de Interrupción ************************************************************ ORG 04H GOTO INTERRU ;**************************** Sección de Configuración ******************************************************** ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria MOVLW 0X01 MOVWF TRISB BCF TRISE,2 CLRF TRISC BCF OPTION_REG,INTEDG BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria CLRF PORTB BSF PORTE,2 MOVLW B MOVWF INTCON ;*************************** Principal **************************************************************************** RESETEO CLRF CONTADOR ; Encender los Led del Puerto C hacia la Izquierda. MOVLW TABLAD MOVWF FSR SEGUIR MOVF CONTADOR,W CALL TABLA MOVWF INDF MOVWF PORTC CALL TIEMPO INCF FSR INCF CONTADOR MOVF CONTADOR,W XORLW NDATOS BTFSC STATUS,Z GOTO RESETEO GOTO SEGUIR ;***************************** Subrutina de Tabla ************************************************************* TABLA ADDWF PCL,F ;Suma el Contador del Programa con el contenido ;de W y lo deja en el PC. RETLW B' ' ;Retorna con W cargado con 01H RETLW B' ' ;Retorna con W cargado con 02H RETLW B' ' ;Retorna con W cargado con 04H RETLW B' ' ;Retorna con W cargado con 08H RETLW B' ' ;Retorna con W cargado con 01H RETLW B' ' ;Retorna con W cargado con 02H RETLW B' ' ;Retorna con W cargado con 04H RETLW B' ' ;Retorna con W cargado con 08H 62

69 ;***************************** Subrutina de Tiempo utilizando el TIMER1********************************* TIEMPO MOVLW TIEMPOH MOVWF TMR1H MOVLW TIEMPOL MOVWF TMR1L MOVLW B MOVWF T1CON SEG1 BTFSS PIR1,TMR1IF GOTO SEG1 BCF PIR1,TMR1IF RETURN ;**************************** Rutina de Interrupción ******************************************************** INTERRU BTFSS INTCON,INTF RETFIE MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP MOVF PIR1,W MOVWF PIR1_TEMP MOVF PORTB,W MOVWF PORTB_TEMP MOVF TMR1H,W MOVWF TMR1H_TEMP MOVF TMR1L,W MOVWF TMR1L_TEMP MOVF T1CON,W MOVWF T1CON_TEMP CLRF CONTADOR1 SEGUIR1 MOVLW B MOVWF PORTB CALL TIEMPO CALL TIEMPO CLRF PORTB CALL TIEMPO CALL TIEMPO INCF CONTADOR1 MOVF CONTADOR1,W XORLW NDATOS1 BTFSC STATUS,Z GOTO SEGUIR2 GOTO SEGUIR1 SEGUIR2 BCF INTCON,INTF MOVF T1CON_TEMP,W MOVWF T1CON MOVF TMR1L_TEMP,W MOVWF TMR1L MOVF TMR1H_TEMP,W MOVWF TMR1H MOVF PORTB_TEMP,W MOVWF PORTB MOVF PIR1_TEMP,W MOVWF PIR1 SWAPF STATUS_TEMP,W MOVWF STATUS 63

70 SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE END Ejemp_11.asm ( Entrenador Básico 3 ) Diagrama de Flujo 1 Sección de Configuración ORG 0X05H Conversión Analógica / Digital Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> COMIENZO RP0 1 ; Ir al Banco 1 TRISA (0) 1 ; Poner PORTA(0) como entrada. TRISE(2) 1 ;Poner PORTE(2)como salida de datos. TRISB B ; Poner Puerto B como salida de dato TRISC B ; Poner Puerto C como salida de dato ADCON B ;Seleccionar PA0 como entrada analógica ;Los 8 BIT mas significativos se quedan en ARDES y los 2 BIT memos significativos se quedan en ADRESL. RP0 0 ; Ir al Banco 0 ADCON B ; Elegimos PA0 y habilitamos el Conversor PORTC B ;Apagar Leds del PUERTO C PORTE(2) 1 ; Igualdades ; Esperar un tiempo de adquisición de 20 us. Retardo_10micros Retardo_10micros ; Registros CBLOCK 0X20 ENDC ; Lanzamos el Conversor Analógico / Digital GO_DONE 1 ; Es un BIT que está en el registro ADCON0 Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa NO GO_DONE = 0? 1 ; Cargamos los 8 bits más significativos que están en ADRESH en el Puerto B SI PORTB ADRESH ; Cargamos los 2 bits menos significativos que están en ADRESL en el Puerto C PORTC ADRESL 64

71 title " Conversión Analogico/Digital " ;Programa para PIC 16F877. ;Velocidad del Reloj:20 MHz. ;Reloj instrucción: 1 MHz = 200 ns. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ***************************************************************** list p=16f877, f=inhx32 ;********** Asignación de etiquetas 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 ******************************************************************** ;**************************** Registros ********************************************************************** ;**************************** Sección Código de Reset **************************************************** ORG 00h ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Sección de Configuración **************************************************** ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO BSF STATUS,RP0 ;Ir al Banco 1 BSF TRISA,0 ;Poner PORTA(0)como entrada. BCF TRISE,2 ;Poner PORTE(2)como salida de datos. CLRF TRISB ;Poner PORTB como salida de datos. CLRF TRISC ;Poner PORTC como salida de datos. MOVLW B' ' ;Seleccionar PA0 como entrada analógica MOVWF ADCON1 ;Los 8 BIT mas significativos se quedan en ADRESH. ;Los 2 BIT memos significativos se quedan en ADRESL. BCF STATUS,RP0 ;Ir al Banco 0 MOVLW B' ' ;Apagar Leds del PUERTO C MOVWF PORTC BSF PORTE,2 MOVLW B' ' ;Elegimos PA0 y habilitamos el Conversor MOVWF ADCON0 ;*************************** Principal ************************************************************************* SEG2 BSF ADCON0,GO_DONE ;Lanzamos el Conversor 65

72 SEG1 CALL Retardo_10micros ; Esperar un tiempo de adquisición de 20 us. CALL Retardo_10micros BTFSC ADCON0,GO_DONE ;Si GO_DONE es 0 la muestra esta digitalizada. GOTO SEG1 MOVF ADRESH,W ;En ADRESH se depositan los 8 BIT mas significativos. MOVWF PORTB BSF STATUS,RP0 COMF ADRESL,W ;En ADRESL se depositan los 2 BIT menos significativos. BCF STATUS,RP0 MOVWF PORTC GOTO SEG2 ;*************************** Librerías ******************************************************************** INCLUDE <RETARDOS.INC> END Ejemp_12.asm ( Entrenador Básico 3 ) Diagrama de Flujo Contar pulsos del exterior utilizando el TIMER0 1 Sección de Configuración ORG 0X05H Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades NDATOS = D'15' COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner Puerto B como salida de dato ADCON B ; Seleccionar PORTA y PORTE como entrada digitales. TRISA (4) 1 ; Poner PORTA(4) como entrada. OPTION_REG B' ' ; Configurar el TIMER0 como contador de pulsos y la cuenta se realiza por flanco de bajada en la patilla R4/T0CKI y sin preescalar. TRISE B ; Poner Puerto E como salida de dato RP0 0 ; Ir al Banco 0 PORTB B ;Apagar Leds del PUERTO B PORTE(2) 1 ;Habilitar los Leds del Puerto B ; Registros CBLOCK 0X20 ENDC Sección de código de Reset ; Cargar la cuenta inicial en el registro TMR0 TMR0 D 00 ; Cargar el registro TMR0 en el PORTB. PORTB TMR0 ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa NO TMR0 = NDATOS? 1 FIN SI 66

73 title " Contar pulsos del exterior utilizando un Temporizador TIMER 0 " ;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 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 *********************************************************************** NDATOS EQU D'15' ;**************************** Registro ************************************************************************* ;**************************** Sección Código de Reset ****************************************************** ORG 00h ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Sección de Configuración ***************************************************** ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria CLRF TRISB ; Configuro el Puerto B como salida MOVLW B' ' MOVWF ADCON1 MOVLW 0x10 MOVWF TRISA MOVLW B' ' MOVWF OPTION_REG ;Selecciono PORTA y PORTE como entrada digitales. ;Selecciono RA4 como entrada de datos. ; Configuro el TIMER0 como contador de pulsos ; y la cuenta se realiza por flanco de bajada en ; la patilla RA4/T0CKI y sin preescalar. ; Selecciono PORTE como salida de datos. ; Selecciono la pagina 0 de la memoria CLRF TRISE BCF STATUS,RP0 CLRF PORTB ; Limpio Puerto B. BSF PORTE,2 ; Habilito los Led del PORTE ;*************************** Principal *************************************************************************** SEGUIR MOVLW D 00 ; Cargar la cuenta inicial en el registro TMR0 MOVWF TMR0 SEGUIR1 MOVF TMR0,W ; Cargar el registro TMR0 en el PORTB. MOVWF PORTB XORLW NDATOS ; Si TMR0 = NDATOS ir a FINAL. BTFSC STATUS,Z GOTO FINAL GOTO SEGUIR1 FINAL GOTO FINAL 67

74 5.4.- Ejemp_13.asm ( Entrenador Básico 3 ) Diagrama de Flujo Transferir una Tabla de datos de memoria EPROM a RAM y Puerto B utilizando como subrutina de tiempo el TIMER0 y el 1 W CONTADOR TABLA Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades TABLAD = 30H NDATOS = D 05 TIEMPO1 = D'00' TIEMPO2 = D'20' ; Registros CBLOCK 0X20 CONTADOR CONT_TI ENDC ;Cargar el Acumulador donde apunta el puntero FSR (FSR) W ;Cargar el Acumulador en el PORTB. PORTB W ;Cargar el registro CONT_TI con el dato TIEMPO2 CONT_TI #TIEMPO2 TIEMPO Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa CONT_TI CONT_TI -1 CON_TI = 0? NO Sección de Configuración ORG 0X05H SI COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner Puerto B como salida de dato ADCON B ; Seleccionar PORTA y PORTE como entrada digitales. TRISE B ; Poner Puerto E como salida de dato OPTION_REG B' ' ; Configurar el TIMER0 como Temporizador y con preescalar de 256. RP0 0 ; Ir al Banco 0 PORTB B ;Apagar Leds del PUERTO B PORTE(2) 1 ;Habilitar los Leds del Puerto B CONTADOR B ; Limpiar CONTADOR. FSR #TABLAD ; Cargar el Puntero. 1 ; Incrementar Puntero FSR FSR +1 ; Incrementar CONTADOR CONTADOR CONTADOR +1 CONTADOR = NDATOS? SI FIN NO 68

75 Subrutina de TIEMPO Subrutina de TABLA ; Cargar el dato TIEMPO1 en el registro TMR0 PCL PCL + W TMR0 #TIEMPO1 NO T0IF = 1? SI RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' RETLW B' ' ;Retorna con W cargado con 02H ;Retorna con W cargado con 04H ;Retorna con W cargado con 08H ;Retorna con W cargado con 04H ;Retorna con W cargado con 02H ; Borrar flag T0IF 0 RETURN title " Transferir una Tabla de datos de memoria EPROM a RAM y Puerto B title " utilizando como subrutina de tiempo el TIMER 0 " title " direccionamiento indirecto " ;Programa para PIC 16F877. ;Velocidad del Reloj:20 MHz. ;Reloj instrucción: 1 MHz = 200 ns. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32 ;************ Asignación de etiquetas 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 *********************************************************************** TABLAD EQU 30H NDATOS EQU 5 TIEMPO1 TIEMPO2 EQU D'00' EQU D'20' ;*************************** Registros ************************************************************************* 69

76 CBLOCK 0X20 CONTADOR CONT_TI ENDC ;**************************** Sección Código de Reset ****************************************************** ORG 00h ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Sección de Configuración ******************************************************* ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria CLRF TRISB ; Configuro el Puerto B como salida MOVLW B' ' ;Selecciono PORTA y PORTE como entrada digitales. MOVWF ADCON1 CLRF TRISE ; Selecciono PORTE como salida de datos. MOVLW B' ' ; Configurar el TIMER0 como Temporizador MOVWF OPTION_REG ; y con preescalar de 256. BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria CLRF PORTB ; Apagar los LEDS del Puerto B. BSF PORTE,2 ; Habilitar los Led del PORTE. CLRF CONTADOR ; Limpiar CONTADOR. MOVLW TABLAD ; Cargar el Puntero con TABLAD. MOVWF FSR ;*************************** Principal ************************************************************************ SEGUIR MOVF CONTADOR,W ;Cargar el CONTADOR en el Acumulador. CALL TABLA MOVWF INDF MOVWF PORTB ;Devuelve en el Acumulador un Dato. ;Cargar el Acumulador donde apunta el puntero FSR. ;Cargar el Acumulador en el PORTB. MOVLW TIEMPO2 ;Cargar en el registro CONT_TI el dato TIEMPO2. MOVWF CONT_TI SEG2 CALL TIEMPO ;Llamar a la subrutina de TIEMPO. DECFSZ CONT_TI,F ;Se decrementa CONT_TI si CONT_TI<>0 ir a SEG2. GOTO SEG2 INCF FSR INCF CONTADOR MOVF CONTADOR,W XORLW NDATOS BTFSC STATUS,Z GOTO $ GOTO SEGUIR ;Incrementar el puntero FSR. ;Incrementar el CONTADOR. ;Si CONTADOR <> NDATOS ir a SEGUIR. ;Parar. ;***************************** Subrutina de Tabla *************************************************************** 70

77 TABLA ADDWF PCL,F ;Suma el Contador del Programa con el contenido de W y lo deja en el PC. RETLW 01H ;Retorna con W cargado con 01H RETLW 02H ;Retorna con W cargado con 02H RETLW 04H ;Retorna con W cargado con 04H RETLW 08H ;Retorna con W cargado con 08H RETLW 04H ;Retorna con W cargado con 04H RETLW 02H ;Retorna con W cargado con 02H ;***************************** Subrutina de Tiempo ********************************************************** TIEMPO MOVLW TIEMPO1 ;Cargar el dato TIEMPO1 en el registro TMR0 MOVWF TMR0 SEG1 BTFSS INTCON,T0IF ;Si el flag T0IF <> 1 ir a SEG1 GOTO SEG1 BCF INTCON,T0IF ;Borrar flag T0IF RETURN END Ejemp_14.asm ( Entrenador Básico 3 ) ;Resetear el registro DIGITO Diagrama de Flujo 2 DIGITO B Detectar el número mayor ;Cargar el de contenido una tabla del datos registro DIGITO en W. W DIGITO Elegimos PIC List p=16f877, f=inhx32 ;Cargar datos de la subrutina TABLA Asignación de nombres de RFS a direcciones. ;Subrutina #include que detecta <p16f877.inc> el número mayor DE_MAYOR ; Igualdades ;Incrementar N_DATOS el registro = D 5 DIGITO ; Asignamos el Número de DIGITO DIGITO +1 datos de la tabla ;Decrementar el registro N_DATOS ; Registros N_DATOS N_DATOS - 1 CBLOCK 0X20 DIGITO MAYOR N_DATOS REGISTRO = 0? NO Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración 1 ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner Puerto B como salida de dato ADCON B ; Seleccionar PORTA y PORTE como entrada digitales. TRISE B ; Poner Puerto E como salida de dato RP0 0 ; Ir al Banco 0 PORTB B PORTE(2) 1 ;Apagar Leds del PUERTO B ;Habilitar los Leds del Puerto B 2 Subrutina de TABLA ENDC SI ;Sacar el número mayor a el Puerto B PCL PCL + W PORTB MAYOR 1 FIN RETLW 3FH RETLW 06H RETLW 5BH RETLW 4FH RETLW 06H ;Retorna con W cargado con 3FH ;Retorna con W cargado con 06H ;Retorna con W cargado con 5BH ;Retorna con W cargado con 4FH ;Retorna con W cargado con 66H 71

78 Subrutina de detectar el número mayor de una tabla DE_MAYOR REGISTRO > SI NO MAYOR REGISTRO RETURN title " Detectar el numero mayor de una Tabla " 72

79 ;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 etiquetas 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 *********************************************************************** N_DATOS EQU D'5' ; Asignamos el Numero de Datos. ;**************************** Registros ************************************************************************ CBLOCK 0X20 DIGITO MAYOR REGISTRO ENDC ; Creamos un registro llamado DIGITO en la dirección 20h ; de memoria de datos. ; Creamos un registro llamado MAYOR en la dirección 21h ; de memoria de datos. ; Creamos un registro llamado REGISTRO1 en la dirección 22h ; de memoria de datos. ;**************************** Sección Código de Reset ******************************************************* ORG 00h ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Sección de Configuración ******************************************************* ORG 05h ; Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO BSF STATUS,RP0 ; Selecciono la pagina 1 de la memoria CLRF TRISB ; Configuro el Puerto B como salida MOVLW B ; Selecciono PORTA y PORTE como entrada digitales MOVWF ADCON1 CLRF TRISE BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria CLRF PORTB ; Limpiar Puerto B. BSF PORTE,2 ;*************************** Principal **************************************************************************** RESET CLRF DIGITO ;Comienzo contador con el numero digito = 0. SEGUIR MOVF DIGITO,W ;Cargo el contenido de DIGITO en W. 73

80 CALL TABLA CALL DE_MAYOR INCF DIGITO,F MOVF DIGITO,W XORLW N_DATOS BTFSS STATUS,Z GOTO SEGUIR ;Llamo a la subrutina de cargar datos de la TABLA. ;Detecta el número mayor. ;Incremento el contenido del registro ;Cargamos el contenido del Registro DIGITO a W ;Hacemos una XOR para afectar el flag Z ;Preguntamos si Z es igual a 1, si cumple salta la siguiente instrucción. ;Va a SEGUIR PARAR MOVF MAYOR,W MOVWF PORTB ;Saca el valor Mayor Puerto B. GOTO PARAR ;***************************** TABLA **************************************************************************** TABLA ADDWF PCL,F ;Suma el Contador del Programa con el contenido de W y lo deja en el PC. RETLW 3FH ;Retorna con W cargado con 3FH RETLW 06H ;Retorna con W cargado con 06H RETLW 5BH ;Retorna con W cargado con 5BH RETLW 4FH ;Retorna con W cargado con 4FH RETLW 06H ;Retorna con W cargado con 66H ;***************************** Detectar Mayor ******************************************************************** DE_MAYOR RETORNO MOVWF REGISTRO SUBWF MAYOR,W ; W F-W ( Si F >= W el BIT de carry C=0 y si F < W el BIT de carry C=1 ) BTFSC STATUS,C GOTO RETORNO MOVF REGISTRO,W MOVWF MAYOR RETURN END 74

81 6.- Entrenador Básico 4 75

82 6.1.- T_S_A.asm ( Entrenador Básico 4 ) Diagrama de Flujo Transmisión Serie Asíncrona 1 Elegimos PIC List p=16f876, f=inhx32 ; Lanzar 5 veces la transmisión serie CONTADOR NUMERO_TRANSMISIONES Asignación de nombres de RFS a direcciones. #include <p16f876.inc> ; Leer los datos del PORTB DATO_ANTERIOR PORTB ; Igualdades NUMERO_TRANSMISIONES = D 5 ;Comienzo de la transmisión de los datos serie TXREG PORTB ; Registros CBLOCK 0X20 CONTADOR DATO_ANTERIOR Ha terminado la transmisión? ENDC NO TRMT = 1? Sección de código de Reset SI ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa ; Decrementamos CONTADOR CONTADOR CONTADOR -1 Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner Puerto B como entrada de dato SPBRG D 10 ; Cargar la velocidad de transmisión de datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(10+1)) = 1420 BIT por segundo TXSTA B ; Configuración de la transmisión serie de datos (Modo Asíncrono y baja velocidad. RP0 0 ; Ir al Banco 0 SPEN 1 ;Activamos la Puerta Serie (TX) NO CONTADOR = 0? SI Si el PORTB no cambia no se transmite PORTB = DATO_ANTERIOR? NO SI 1 76

83 title " Transmisor SERIE asíncrona " ;************ Leer el Puerto B y transmitirlo vía SERIE *********************************************** ;Programa para PIC 16F876. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250KHz = 4uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ************************************************************** list p=16f876, f=inhx32 ;********** Asignación de etiquetas de Registros de Funciones especiales a direcciones ******** #include <p16f876.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 *************************************************************** NUMERO_TRANSMISIONES EQU D'05' ;***************************** Registros ***************************************************************** CBLOCK 0X20 CONTADOR DATO_ANTERIOR ENDC ;**************************** Sección Código de Reset *********************************************** ORG 0X00 ;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 BSF STATUS,RP0 ;Banco 1 MOVLW B' ' ; Poner el Puerto B como entrada de Datos MOVWF TRISB MOVLW 0X0A MOVWF SPBRG ; Cargar la Velocidad de Transmisión de Datos. MOVLW B' ' 77

84 MOVWF TXSTA BCF STATUS,RP0 BSF RCSTA,SPEN ; Configuración de la Transmisión Serie. ;Activamos la Puerta Serie (TX). ;*************************** Principal ********************************************************************* SEG0 MOVLW NUMERO_TRANSMISIONES ; Lanzar 5 veces la transmisión serie. MOVWF CONTADOR SEG1 MOVF PORTB,W ; Leer los datos del PORTB MOVWF DATO_ANTERIOR MOVWF TXREG ; Comienzo de la transmisión de datos en Serie. BSF STATUS,RP0 SEG2 BTFSS TXSTA,TRMT ; Preguntamos si se ha transmitido el dato. GOTO SEG2 BCF STATUS,RP0 DECFSZ CONTADOR,F GOTO SEG1 ; Decrementamos CONTADOR y si es 0 salta una ; instrucción. SEG3 MOVF PORTB,W ; Si el PORTB no cambia no se transmite. SUBWF DATO_ANTERIOR,W BTFSC STATUS,Z GOTO SEG3 GOTO SEG0 END 78

85 6.2.- R_S_A.asm ( Entrenador Básico 4 ) Diagrama de Flujo 1 Recepción Serie Asíncrona ( 8 BIT ) Sección de Configuración ORG 0X05H Elegimos PIC List p=16f876, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f876.inc> ; Igualdades ; Registros CBLOCK 0X20 DATO W_TEMP STATUS_TEMP ENDC Sección de código de Reset COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner Puerto B como salida de dato BRGH 0 ;Trabajar con velocidad baja de recepción. SPBRG D 10 ; Cargar la velocidad de transmisión de datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(10+1)) = 1420 BIT por segundo SYNC 0 ; Habilitamos la recepción asíncrona. INTCON B ; Habilitar la Interrupción serie PIE B ; Habilitar la Interrupción serie RP0 0 ; Ir al Banco 0 RCSTA B ; Configurar y lanzar la recepción serie (Habilitar puerto serie, 8 BIT y recepción continua). ; Cargar el registro DATO en el PORTB PORTB DATO ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Vector de Interrupción ORG 04H GOTO INTERRU Rutina de Interrupción INTERRU 1 RCIF = 1? NO RETFIE ; Borrar Flag de la recepción RCIF 0 ; Salvar Registros SI W_TEMP W STATUS_TEMP STATUS RETFI E ; Recuperar Registros STATUS STATUS_TEMP W W_TEMP ; Cargar el dato recibido en el registro RCREG en el registro DATO DATO RCREG 79

86 title " Receptor SERIE asíncrona " ;Programa para PIC 16F876a. ;Velocidad del Reloj = 1 MHz. ;Reloj instrucción: 250 khz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC **************************************************************** list p=16f876, f=inhx32 ;********* Asignación de etiquetas de Registros de Funciones especiales a direcciones ************ #include <p16f876.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 ******************************************************************* ;***************************** Registros ******************************************************************** CBLOCK 0X20 DATO W_TEMP ;Registro de salvaguarda de la Rutina de Interr. STATUS_TEMP 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 INTERRU ;Vector de Interrupción. ;**************************** Sección de Configuración *************************************************** ORG 0X05 ;Inicio de Programa ;(Una posición detrás del vector de Interrupción). COMIENZO BSF STATUS,RP0 ; Banco 1 BCF STATUS,RP1 CLRF TRISB BCF TXSTA,BRGH ;Trabajar con velocidad baja de recepción. MOVLW 0X0A MOVWF SPBRG BCF TXSTA,SYNC ; Cargar la Velocidad de Recepción de Datos. ; Habilitamos la recepción asíncrona. 80

87 MOVLW B' ' MOVWF INTCON MOVLW B' ' MOVWF PIE1 BCF STATUS,RP0 MOVLW B' ' MOVWF RCSTA ;Habilitar Interrupción Serie ;Habilitar Interrupción Serie ;Configurar y lanzar la Recepción Serie ;*************************** Principal *********************************************************************** PRINCIPAL COMF DATO,W MOVWF PORTB GOTO PRINCIPAL ;**************************** Rutina de Interrupción ****************************************************** ORG 40 INTERRU BTFSS PIR1,RCIF ; Detectamos si ha interrumpido la Recepción Serie. RETFIE SALVAR MOVWF W_TEMP ; Salvamos Registros SWAPF STATUS,W MOVWF STATUS_TEMP MOVF RCREG,W MOVWF DATO ;Cargamos el dato del registro RCREG en el registro DATO. RECUPERAR SWAPF STATUS_TEMP,W ;Recuperamos Registros. MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W BCF PIR1,RCIF RETFIE ;Borrar flag de recepción ;Retorno de Interrupción. END 81

88 6.3.- T1_S_RF.asm ( Entrenador Básico 4 ) Diagrama de Flujo Transmisión Serie Asíncrona Utilizando la Librería de 1 Elegimos PIC List p=16f876, f=inhx32 ; Leer PORTB W PORTB Asignación de nombres de RFS a direcciones. #include <p16f876.inc> ; Guardar el PORTB en un registro DATO_ANTERIOR PORTB ; Igualdades LANZAR_DATO_SERIE ; Registros CBLOCK 0X20 DATO_ANTERIOR ENDC NO Si el PORTB no cambia no se transmite SI Sección de código de Reset PORTB = DATO_ANTERIOR? ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 TRISB B ; Poner Puerto B como entrada de dato RP0 0 ; Ir al Banco 0 CONFIGURACION_TRANS_SERIE 1 82

89 title " Transmisor SERIE asíncrona utilizando Librería de Transmisión T_S_RF.INC " ;************ Leer el Puerto B y transmitirlo vía SERIE *************************************************** ;Programa para PIC 16F876. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250KHz = 4uS. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ****************************************************************** list p=16f876, f=inhx32 ;********** Asignación de etiquetas de Registros de Funciones especiales a direcciones ************ #include <p16f876.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 ******************************************************************** ;***************************** Registros ********************************************************************** CBLOCK 0X20 DATO_ANTERIOR ENDC ;**************************** Sección Código de Reset ***************************************************** ORG 0X00 ;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 BSF STATUS,RP0 ; Ir al banco 1 MOVLW B' ' ; Poner el Puerto B como entrada de Datos MOVWF TRISB BCF STATUS,RP0 ; Ir al banco 0 CALL CONFIGURACION_TRANS_SERIE ;*************************** Principal ************************************************************************** SEG1 MOVF PORTB,W ;Leer PORTB MOVWF DATO_ANTERIOR 83

90 CALL LANZAR_DATO_SERIE SEG2 MOVF PORTB,W ;Si el PORTB no cambia no se transmite. SUBWF DATO_ANTERIOR,W BTFSC STATUS,Z GOTO SEG2 GOTO SEG1 ;*************************** Librerías ************************************************************************** INCLUDE <T_S_RF.INC> END RE1_S_RF.asm ( Entrenador Básico 4 ) Diagrama de Flujo 1 Recepción Serie Asíncrona Utilizando la Librería de Recepción R_S_RF.INC Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1 Elegimos PIC List p=16f876, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f876.inc> TRISB B ; Poner Puerto B como salida de dato RP0 0 ; Ir al Banco 0 CONFIGURACION_RECEP_SERIE ; Igualdades ; Cargar el registro DATO en el PORTB PORTB DATO_SERIE_VALIDO ; Registros CBLOCK 0X20 W_TEMP STATUS_TEMP ENDC Rutina de Interrupción INTERRU Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa RETFIE RCIF = 1? NO SI Vector de Interrupción ORG 04H GOTO INTERRU ; Recuperar Registros STATUS STATUS_TEMP W W_TEMP ; Salvar Registros W_TEMP W STATUS_TEMP STATUS RETFI E 1 El Dato se queda cargado en el registro DATO_SERIE_VALIDO RECEPCION_DATO_SERIE 84

91 title " Receptor SERIE asíncrona utilizando Librería de Recepción R_S_RF.INC " ;Programa para PIC 16F876a. ;Velocidad del Reloj = 1 MHz. ;Reloj instrucción: 250 khz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;**************************** Elegimos PIC ****************************************************************** list p=16f876, f=inhx32 ;*************** Asignación de etiquetas de Registros de Funciones especiales a direcciones ******* #include <p16f876.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 ******************************************************************** ;***************************** Registros ********************************************************************* CBLOCK 0X20 W_TEMP ; Registro de salvaguarda de la Rutina de Interr. STATUS_TEMP 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 INTERRUPCION ;Vector de Interrupción. ;**************************** Sección de Configuración *************************************************** ORG 0X05 ;Inicio de Programa ;(Una posición detrás del vector de Interrupción). COMIENZO BSF STATUS,RP0 ;Configuramos el PORTB como salida de datos. CLRF TRISB BCF STATUS,RP0 CALL CONFIGURACION_RECEP_SERIE 85

92 ;*************************** Principal ************************************************************************ PRINCIPAL COMF DATO_SERIE_VALIDO,W MOVWF PORTB GOTO PRINCIPAL ;**************************** Rutina de Interrupción ******************************************************* INTERRUPCION BTFSS PIR1,RCIF ; Detectamos si ha interrumpido la Recepción Serie. RETFIE SALVAR MOVWF W_TEMP ; Salvamos Registros SWAPF STATUS,W MOVWF STATUS_TEMP CALL RECEPCION_DATO_SERIE ; El Dato se queda cargado en DATO_SERIE_VALIDO RECUPERAR SWAPF STATUS_TEMP,W ;Recuperamos Registros. MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ;Retorno de Interrupción. ;***************************** Librerias ********************************************************************** INCLUDE <R_S_RF.INC> END 86

93 6.5.- T_S_RF.INC ( Entrenador Básico 4 ) Diagrama de Flujo Librería de Transmisión de datos (Carga en el W el dato a transmitir) (Tiene una llave de entrada asociada) T_S_RF.INC ; Igualdades TODOCERO = B LLAVE_ENTRADA = B ; Registros CBLOCK DATO_TRANSMITIDO CONTADOR_TRANSMISIÓN ENDC ;Sección de Configuración CONFIGURACION_TRANS_SERIE RPO 1 ; Ir al Banco 1 SPBRG 0X0A ; Cargar la Velocidad de Transmisión de Datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(10+1)) = 1420 BIT por segundo TXSTA B ; Configuración de la transmisión serie de datos (Modo Asíncrono y baja velocidad. RP0 0 ; Ir al Banco 0 SPEN 1 ;Activamos la Puerta Serie (TX) RETUR N 1 87

94 1 LANZAR_DATO_SERIE DATO _ TRANSMITIDO W ; Cargar el número de transmisión CONTADOR_TRANSMISIÓN D 10 ; Lanzar TODOCERO TXREG #TODOCERO NO Ha terminado la transmisión? TRMT = 1? SI ; Lanzar LLAVE_ENTRADA TXREG #LLAVE_ENTRADA NO NO Ha terminado la transmisión? CONTADOR_TRANSMISIÓN = 0? SI TRMT = 1? ; Decrementar el registro CONTADOR_TRANSMISION SI CONTADOR_TRANSMISION CONTADOR_TRANSMISIÓN - 1 ; Lanzar DATO_TRANSMITIDO TXREG #DATO_TRANSMITIDO NO Ha terminado la transmisión? TRMT = 1? SI RETUR N 88

95 ; Librería Transmisor SERIE vía Radiofrecuencia para una Tarjeta ; Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0503 ) ; Llave fija ; Cargar en W el dato a transmitir ;***************************** Igualdades ********************************************************************* TODOCERO EQU B' ' ;(Dato). Llave para iniciar un código, la tarjeta de ; transmisión de datos necesita el pulso de STOP para ; transmitir un código. LLAVE_ENTRADA EQU B' ' ;(Dato). Llave Común. ;***************************** Registros *********************************************************************** CBLOCK DATO_TRANSMITIDO CONTADOR_TRANSMISION ENDC ;**************************** Sección de Configuración ***************************************************** CONFIGURACION_TRANS_SERIE BCF STATUS,RP1 ; Ir al Banco 1. BSF STATUS,RP0 MOVLW 0X0A MOVWF SPBRG MOVLW B' ' MOVWF TXSTA ; Cargar la Velocidad de Transmisión de Datos. ; Configuración de la Transmisión Serie. BCF STATUS,RP0 ; Ir al Banco 0. BCF STATUS,RP1 BSF RCSTA,SPEN ;Activamos la Puerta Serie (TX). RETURN ;*************************** Lanzar Llaves y Muestra Digital *********************************************** LANZAR_DATO_SERIE MOVWF DATO_TRANSMITIDO MOVLW d'10' MOVWF CONTADOR_TRANSMISION MOVLW TODOCERO ;Lanzar llave TODOCERO. MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG1_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG1_TRANSMISION REPETIR_TRANSMISION BCF STATUS,RP0 ;Lanzar llave LLAVE_ENTRADA. MOVLW LLAVE_ENTRADA MOVWF TXREG ;Transmisión de Datos en Serie. 89

96 BSF STATUS,RP0 SEG2_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG2_TRANSMISION BCF STATUS,RP0 ;Lanzar DATO_TRANSMITIDO. MOVF DATO_TRANSMITIDO,W MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG3_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG3_TRANSMISION BCF STATUS,RP0 DECFSZ CONTADOR_TRANSMISION,F GOTO REPETIR_TRANSMISION RETURN R_S _RF.INC ( Entrenador Básico 4 ) Diagrama de Flujo R_S_RF.INC ; Igualdades LLAVE_ENTRADA = B' ' ; Llave Común. ; Registros CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO ENDC Sección de Configuración CONFIGURACION_RECEP_SERIE RP0 1 ; Ir al Banco 1 BRGH 0 ;Trabajar con velocidad baja de recepción. SPBRG D 10 ; Cargar la velocidad de Transmisión de datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(10+1)) = 1420 BIT por segundo SYNC 0 INTCON B PIE B ; Habilitamos la recepción asíncrona. ; Habilitar la Interrupción serie ; Habilitar la Interrupción serie RP0 0 ; Ir al Banco 0 RCSTA B ; Configurar y lanzar la recepción serie (Habilitar puerto serie, 8 BIT y recepción continua). RETURN 1 90

97 1 RECEPCION_DATO_SERIE W RCREG NO Ha llegado la llave de entrada? W = LLAVE_ENTRADA? SI RETURN ; Borramos flag de Recepción RCIF 0 ;Borramos flag de Recepción RCIF 0 ;Validamos los datos recibidos DATO_SERIE_VALIDO DATO_SERIE1 SI NO Ha llegado un nuevo dato? RCIF = 1? SI ; Guardamos el dato primero DATO_SERIE1 RCREG Son iguales los datos recibidos? NO ; Borramos flag de Recepción RCIF 0 DATO_SERIE1 = DATO_SERIE2? NO Ha llegado la llave de entrada? RCREG = ; Guardamos el dato segundo DATO_SERIE2 RCREG ; Borramos flag de Recepción RCIF 0 SI NO Ha llegado un nuevo dato? RCIF = 1? SI 91

98 ; Librería Receptor SERIE vía Radiofrecuencia para una Tarjeta Emisora ; SAW para Datos 433,92 MHz. ( CEBEK C-0504 ) ; Llave de entrada fija. ; Los datos se validan si llegan dos datos idénticos consecutivos. ; El dato recibido se carga en el registro DATO_SERIE_VALIDO ; Esta configurada la Interrupción en Recepción Serie. Es necesario cargar el Vector de interrupción ; ORG 0X04 ; GOTO INTERRUPCION ; La Subrutina de Recepción Serie devuelve el dato valido en el Registro DATO_SERIE_VALIDO ;**************************** Igualdades ************************************************************************* LLAVE_ENTRADA EQU B' ' ;(Dato). Llave Común. ;**************************** Registros**************************************************************************** CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO ENDC ;**************************** Sección de Configuración ********************************************************* CONFIGURACION_RECEP_SERIE BSF STATUS,RP0 ; Banco 1 BCF STATUS,RP1 BCF TXSTA,BRGH MOVLW 0X0A MOVWF SPBRG ;Trabajar con velocidad baja de recepción. ; Cargar la Velocidad de Recepción de Datos. BCF TXSTA,SYNC MOVLW B' ' MOVWF INTCON MOVLW B' ' MOVWF PIE1 ;Habilitar Interrupción Serie ;Habilitar Interrupción Serie BCF STATUS,RP0 ; Banco 0 BCF STATUS,RP1 MOVLW B' ' MOVWF RCSTA ;Configurar y lanzar la Recepción Serie RETURN 92

99 ;****************************** Subrutina de Recepción Serie ********************************************* ;Tiene que estar dentro de la Rutina de INTERRUPCION RECEPCION_DATO_SERIE MOVF RCREG,W ;Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". XORLW LLAVE_ENTRADA BTFSS STATUS,Z ;Si es correcta la Llave volvemos a preguntar. GOTO SALIR _ SERIE ;No es correcta la Llave volvemos al PP previa recuperación de registros. BCF PIR1,RCIF ;Borramos Flag de la Recepción. NO_DATO_SERIE1 BTFSS PIR1,RCIF ;Preguntamos si hemos recibido una nuevo DATO. GOTO NO_DATO_SERIE1 MOVF RCREG,W MOVWF DATO_SERIE1 ;Guardamos el Dato Primero BCF PIR1,RCIF ;Borramos Flag de la Recepción. NO_LLAVE_ENTRADA BTFSS PIR1,RCIF ;Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". GOTO NO_LLAVE_ENTRADA MOVF RCREG,W XORLW LLAVE_ENTRADA BTFSS STATUS,Z GOTO SALIR _ SERIE ;Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". ;Si es correcta la Llave volvemos a preguntar. ;No es correcta la Llave volvemos al PP previa recuperación de registros. BCF PIR1,RCIF ;Borramos Flag de la Recepción. NO_DATO_SERIE2 BTFSS PIR1,RCIF ;Preguntamos si hemos recibido una nuevo DATO. GOTO NO_DATO_SERIE2 MOVF RCREG,W MOVWF DATO_SERIE2 ;Guardamos el Dato Segundo MOVF DATO_SERIE1,W SUBWF DATO_SERIE2,F BTFSS STATUS,Z GOTO SALIR _ SERIE ;Si ambos datos son Iguales validamos el dato serie recibido. VALIDAR_DATO_SERIE DATO_SERIE_VALIDO SALIR_SERIE MOVF DATO_SERIE1,W MOVWF DATO_SERIE_VALIDO ; El Dato se queda cargado en el Registro BCF PIR1,RCIF RETURN END 93

100 6.7.- T_M_S_RF.INC ( Entrenador Básico 4 ) Diagrama de Flujo Librería de Transmisión de datos (Carga en el W el dato a transmitir) (Cargar la llave de entrada en el registro LLAVE_ENTRADA) ; Igualdades TODOCERO = B ; Registros CBLOCK DATO_TRANSMITIDO CONTADOR_TRANSMISIÓN LLAVE-ENTRADA ENDC ;Sección de Configuración CONFIGURACION_TRANS_SERIE RPO 1 ; Ir al Banco 1 SPBRG D 39 ; Cargar la Velocidad de Transmisión de Datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(39+1)) = 1562,5 BIT por segundo TXSTA B ; Configuración de la transmisión serie de datos (Modo Asíncrono y baja velocidad. RP0 0 ; Ir al Banco 0 SPEN 1 ;Activamos la Puerta Serie (TX) RETUR N 1 94

101 1 LANZAR_DATO_SERIE DATO _ TRANSMITIDO W ; Cargar el número de transmisión CONTADOR_TRANSMISIÓN D 10 ; Lanzar TODOCERO TXREG #TODOCERO NO Ha terminado la transmisión? TRMT = 1? SI ; Lanzar LLAVE_ENTRADA TXREG #LLAVE_ENTRADA NO NO Ha terminado la transmisión? CONTADOR_TRANSMISIÓN = 0? SI TRMT = 1? ; Decrementar el registro CONTADOR_TRANSMISION SI CONTADOR_TRANSMISION CONTADOR_TRANSMISIÓN - 1 ; Lanzar DATO_TRANSMITIDO TXREG #DATO_TRANSMITIDO NO Ha terminado la transmisión? TRMT = 1? SI RETUR N 95

102 ; Librería de Transmisor SERIE vía Radiofrecuencia para una Tarjeta ; Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0503 ) ; Cargar la llave de entrada en el registro LLAVE_ENTRADA ; Cargar en W el dato a transmitir ;***************************** Igualdades **************************************************************** TODOCERO EQU B' ' ;(Dato). Llave para iniciar un código, la tarjeta de ; transmisión de datos necesita el pulso de STOP para ; transmitir un código. ;***************************** Registros ******************************************************************* CBLOCK DATO_TRANSMITIDO CONTADOR_TRANSMISION LLAVE_ENTRADA ENDC ;**************************** Sección de Configuración ************************************************* CONFIGURACION_TRANS_SERIE BCF STATUS,RP1 ; Ir al Banco 1. BSF STATUS,RP0 MOVLW D'39' MOVWF SPBRG MOVLW B' ' MOVWF TXSTA ; Cargar la Velocidad de Transmisión de Datos. ; BR = (Fosc/64(X+1)) BR = (4MHz/64(39+1)) = 1562,5 Hz ; Configuración de la Transmisión Serie. BCF STATUS,RP0 ; Ir al Banco 0. BCF STATUS,RP1 BSF RCSTA,SPEN ;Activamos la Puerta Serie (TX). RETURN ;*************************** Lanzar Llaves y Muestra Digital ****************************************** LANZAR_DATO_SERIE MOVWF DATO_TRANSMITIDO MOVLW d'10' MOVWF CONTADOR_TRANSMISION MOVLW TODOCERO ;Lanzar llave TODOCERO. MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG1_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG1_TRANSMISION 96

103 REPETIR_TRANSMISION BCF STATUS,RP0 ;Lanzar llave LLAVE_ENTRADA. MOVF LLAVE_ENTRADA,W MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG2_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG2_TRANSMISION BCF STATUS,RP0 ;Lanzar DATO_TRANSMITIDO. MOVF DATO_TRANSMITIDO,W MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG3_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG3_TRANSMISION BCF STATUS,RP0 DECFSZ CONTADOR_TRANSMISION,F GOTO REPETIR_TRANSMISION RETURN 97

104 6.8.- R_M_S_RF.INC ( Entrenador Básico 4 ) Diagrama de Flujo R_S_M_RF.INC ; Igualdades ; Registros CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO LLAVE_ENTRADA ENDC Sección de Configuración CONFIGURACION_RECEP_SERIE RP0 1 ; Ir al Banco 1 BRGH 0 ;Trabajar con velocidad baja de recepción. SPBRG D 39 ; Cargar la velocidad de Transmisión de datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(39+1)) = 1562,5 BIT por segundo SYNC 0 INTCON B PIE B ; Habilitamos la recepción asíncrona. ; Habilitar la Interrupción serie ; Habilitar la Interrupción serie RP0 0 ; Ir al Banco 0 RCSTA B ; Configurar y lanzar la recepción serie (Habilitar puerto serie, 8 BIT y recepción continua). RETURN 1 98

105 1 RECEPCION_DATO_SERIE RCIF 0 ; Borramos flag de Recepción RETURN ;Borramos flag de Recepción RCIF 0 ;Validamos los datos recibidos DATO_SERIE_VALIDO DATO_SERIE1 SI NO Ha llegado un nuevo dato? RCIF = 1? SI ; Guardamos el dato primero DATO_SERIE1 RCREG Son iguales los datos recibidos? NO ; Borramos flag de Recepción RCIF 0 DATO_SERIE1 = DATO_SERIE2? NO Ha llegado la llave de entrada? RCREG = ; Guardamos el dato segundo DATO_SERIE2 RCREG ; Borramos flag de Recepción RCIF 0 SI NO Ha llegado un nuevo dato? RCIF = 1? SI 99

106 ; Librería Receptor SERIE vía Radiofrecuencia para una Tarjeta Emisora ; SAW para Datos 433,92 MHz. ( CEBEK C-0504 ) ; La Llave de entrada aleatoria. ; Los datos se validan si llegan dos datos idénticos consecutivos. ; El dato recibido se carga en el registro DATO_SERIE_VALIDO ; ;Si se reciben dos datos consecutivos se valida el dato. ; Esta configurada la Interrupción en Recepción Serie. Es necesario cargar el Vector de interrupción ; ORG 0X04 ; GOTO INTERRUPCION ; Se pregunta primero en la rutina de interrupción serie que llave de entrada ha llegado y se carga la llave de entrada que corresponda. (Ejemplo Proyecto de Transmisión de datos) ; La Subrutina de Recepción Serie devuelve el dato valido en el Registro DATO_SERIE_VALIDO ;**************************** Igualdades *********************************************************************** ;**************************** Registros************************************************************************* CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO LLAVE_ENTRADA ENDC ;**************************** Sección de Configuración ****************************************************** CONFIGURACION_RECEP_SERIE BSF STATUS,RP0 ; Banco 1 BCF STATUS,RP1 BCF TXSTA,BRGH BSF TRISC,7 MOVLW D'39' MOVWF SPBRG ;Trabajar con velocidad baja de recepción. ; Cargar la Velocidad de Recepción de Datos. BCF TXSTA,SYNC MOVLW B' ' MOVWF INTCON MOVLW B' ' MOVWF PIE1 ;Habilitar Interrupción Serie ;Habilitar Interrupción Serie BCF STATUS,RP0 ; Banco 0 BCF STATUS,RP1 MOVLW B' ' MOVWF RCSTA ;Configurar y lanzar la Recepción Serie RETURN 100

107 ;****************************** Subrutina de Recepción Serie ******************************************************** ;Tiene que estar dentro de la Rutina de INTERRUPCION RECEPCION_DATO_SERIE BCF PIR1,RCIF ;Borramos Flag de la Recepción. NO_DATO_SERIE1 BTFSS PIR1,RCIF ;Preguntamos si hemos recibido una nuevo DATO. GOTO NO_DATO_SERIE1 MOVF RCREG,W MOVWF DATO_SERIE1 ;Guardamos el Dato Primero BCF PIR1,RCIF ;Borramos Flag de la Recepción. NO_LLAVE_ENTRADA BTFSS PIR1,RCIF ;Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". GOTO NO_LLAVE_ENTRADA MOVF RCREG,W XORWF LLAVE_ENTRADA,W BTFSS STATUS,Z GOTO SALIR_SERIE ;Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". ;Si es correcta la Llave volvemos a preguntar. ;No es correcta la Llave volvemos al PP previa recuperación de registros. BCF PIR1,RCIF ;Borramos Flag de la Recepción. NO_DATO_SERIE2 BTFSS PIR1,RCIF ;Preguntamos si hemos recibido una nuevo DATO. GOTO NO_DATO_SERIE2 MOVF RCREG,W MOVWF DATO_SERIE2 ;Guardamos el Dato Segundo MOVF DATO_SERIE1,W SUBWF DATO_SERIE2,F BTFSS STATUS,Z GOTO SALIR_SERIE ;Si ambos datos son Iguales validamos el dato serie recibido. VALIDAR_DATO_SERIE SALIR_SERIE MOVF DATO_SERIE1,W MOVWF DATO_SERIE_VALIDO BCF PIR1,RCIF RETURN ; El Dato se queda cargado en el Registro DATO_SERIE_VALIDO 101

108 7.- Entrenador Básico 5 102

109 7.1.- Tecla0.asm ( Entrenador Básico 5 ) Diagrama de Flujo 1 Manejo del Teclado utilizando la técnica ; Obtiene el valor hexadecimal de la tecla pulsada. Elegimos PIC List p=16f877, f=inhx32 Teclado_LeeHex Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades Se ha pulsado alguna tecla? Cy = 1? NO ; Registros CBLOCK 0x20 ENDC SI ; Llevar el dato a el Puerto C. PORTC W Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa ; Obtiene el valor hexadecimal de la tecla pulsada. Teclado_LeeHex Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISC B ; Poner el Puerto C como salida de datos. RP0 0 ; Ir al Banco 0 RETUR N PORTC B ; Limpiar el PORTC ; Configura las líneas del teclado. Teclado_Inicializa 1 103

110 title " Manejo del Teclado utilizando la técnica de polling " ;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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0x00 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Sección de Configuración ***************************************************** ORG 5 ; Inicio de Programa COMIENZO BCF STATUS,RP1 ; Ir al Banco 1 BSF STATUS,RP0 CLRF TRISC ; Poner el PORTC como salida de datos. BCF STATUS,RP0 ; Ir al Banco 0 CLRF PORTC ; Limpiar el PORTC CALL Teclado_Inicializa ; Configura las líneas del teclado. ;************************************* Principal ************************************************************************** ;SEG1 CALL Teclado_LeeOrdenTecla ; Obtiene el orden de la tecla pulsada. SEG1 CALL Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. BTFSS STATUS,C ; Preguntamos si se ha pulsado una tecla. GOTO SEG1 MOVWF PORTC ; Llevar el dato a el Puerto C. CALL Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter GOTO SEG1 ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <RETARDOS.INC> END 104

111 7.2.- Tecl_01.asm ( Entrenador Básico 5 ) Diagrama de Flujo Manejo del Teclado utilizando la técnica Rutina de Interrupción INTERRUP Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Obtiene el valor hexadecimal de la tecla pulsada. Teclado_LeeHex ; Llevar el dato a el Puerto C. PORTC W ; Registros CBLOCK 0x20 ENDC ; Obtiene el valor hexadecimal de la tecla pulsada. Teclado_LeeHex ; Limpia flag de la Interrupción. Sección de código de Reset RBIF 0 ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa RETFIE ORG O4H ; Dirección del vector de Interrupción GOTO INTERRUP Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISC B ; Poner el Puerto C como salida de datos. RP0 0 ; Ir al Banco 0 PORTC B ; Limpiar el PORTC ; Configura las líneas del teclado. Teclado_Inicializa INTCON B ; Habilita la interrupción RBI y la general. ; Espera en modo bajo consumo que pulse teclado. SLEEP 105

112 title " Manejo del Teclado utilizando la técnica de interrupción del programa principal " ;***************************************************** Tecl_01.asm ***************************************************** ; ; Los LEDS visualizan el valor hexadecimal de la tecla pulsada. Para la lectura del ; teclado se utiliza la interrupción RBI o por cambio en las líneas <RB7:RB4> del Puerto B. ; ; ************************************************************************************************************************** ;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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************** Sección Código de Reset ****************************************************** ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Vector de Interrupción ********************************************************* ORG 4 GOTO INTERRUP ;*********************************** Sección de Configuración ********************************************************* ORG 5 COMIENZO BCF STATUS,RP1 ; Ir al Banco 1 BSF STATUS,RP0 CLRF TRISC ; Poner el PORTC como salida de datos. BCF STATUS,RP0 ; Ir al Banco 0 CLRF PORTC ; Limpiar el Puerto C CALL Teclado_Inicializa ; Configura las líneas del teclado. MOVLW B' ' ; Habilita la interrupción RBI y la general. MOVWF INTCON 106

113 ;************************************* Principal ************************************************************************** PRINCIPAL SLEEP ; Espera en modo bajo consumo que pulse teclado. GOTO PRINCIPAL ;************************************ Rutina de Interrupción ************************************************************ INTERRUP CALL Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. MOVWF PORTC ; Llevar el Acumulador al Puerto C. CALL Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter ; mientras permanece pulsado. BCF INTCON,RBIF ; Limpia flag de la Interrupción. RETFIE ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <RETARDOS.INC> ; Subrutinas de control del teclado. END 107

114 7.3.- Tecl_02.asm ( Entrenador Básico 5 ) Diagrama de Flujo Manejo del Teclado utilizando la técnica Rutina de Interrupción INTERRUP Elegimos PIC List p=16f877, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Obtiene el valor hexadecimal de la tecla pulsada. Teclado_LeeHex ; Llevar el dato a el Puerto C. PORTC W ; Registros CBLOCK 0x20 ENDC ; Transformar el código Hexadecimal en código de 7 segmentos. HEX_7SEG Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa ; Llevar el dato a el Puerto D. PORTD W ; Obtiene el valor hexadecimal de la tecla pulsada. ORG O4H ; Dirección del vector de Interrupción GOTO INTERRUP Teclado_LeeHex Sección de Configuración ORG 0x05 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1 TRISC B ; Poner el Puerto C como salida de datos. ADCON B ; Habilitar el PORTE como señales digitales. TRISE B ; Poner el Puerto E como salida de datos. TRISD B ; Poner el Puerto D como salida de datos. RP0 0 ; Ir al Banco 0 PE0 1 ; Habilitar el display de las unidades. PORTC B ; Limpiar el PORTC ; Limpia flag de la Interrupción. RBIF 0 RETFIE ; Configura las líneas del teclado. Teclado_Inicializa INTCON B ; Habilita la interrupción RBI y la general. ; Espera en modo bajo consumo que pulse teclado. SLEEP 108

115 title " Manejo del Teclado utilizando la técnica de interrupción del programa principal y llevando los datos al display de 7 segmentos" ;************************************** Tecl_02.asm ******************************************************************** ; ; El display y los LEDS visualiza el valor hexadecimal de la tecla pulsada. Para la lectura del ; teclado se utiliza la interrupción RBI o por cambio en las líneas <RB7:RB4> del Puerto B. ; ************************************************************************************************************************** ;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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Vector de Interrupción ********************************************************* ORG 4 GOTO INTERRUP ;*********************************** Sección de Configuración ********************************************************* ORG 5 COMIENZO BCF STATUS,RP1 ; Ir al Banco 1 BSF STATUS,RP0 CLRF TRISC ; Poner el PORTC como salida de datos. MOVLW 0X07 ; Habilitar el PORTE como señales digitales. MOVWF ADCON1 CLRF TRISE ; Poner el PORTE como salida de datos. CLRF TRISD ; Poner el PORTD como salida de datos. 109

116 BCF STATUS,RP0 ; Ir al Banco 0 BSF PORTE,0 ; Habilitar el display de las unidades. CLRF PORTC ; Limpiar el Puerto C CALL Teclado_Inicializa ; Configura las líneas del teclado. MOVLW B' ' ; Habilita la interrupción RBI y la general. MOVWF INTCON ;************************************* Principal ************************************************************************** PRINCIPAL SLEEP ; Espera en modo bajo consumo. GOTO PRINCIPAL ;************************************ Rutina de Interrupción ************************************************************ INTERRUP CALL Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. MOVWF PORTC ; Llevar el Acumulador al Puerto C. CALL HEX_7SEG ; Transformar el código Hexadecimal en código de 7 segmentos. MOVWF PORTD ; Llevar el código al PORTD. CALL Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter ; mientras permanece pulsado. BCF INTCON,RBIF ; Limpia flag. RETFIE ;*********************************************** Librerías **************************************************************** INCLUDE <HEX_7SEG.INC> ; Librería de conversión de Hexadecimal a 7 Segmentos. INCLUDE <TECLADO.INC> ; Librería de control del teclado. INCLUDE <RETARDOS.INC> ; Librería de Retardos. END HEX_7SEG.INC ( Entrenador Básico 5 ) Diagrama de Flujo Librería HEX_7SEG.INC HEX_7SEG PCL PCL + W RETLW 3Fh ; El código 7 segmentos para el "0". RETLW 06h ; El código 7 segmentos RETLW 5Bh ; El código 7 segmentos RETLW 4Fh ; El código 7 segmentos RETLW 66h ; El código 7 segmentos RETLW 6Dh ; El código 7 segmentos RETLW 7Dh ; El código 7 segmentos RETLW 07h ; El código 7 segmentos RETLW 7Fh ; El código 7 segmentos 110

117 Librería HEX_7SEG.INC ;************************************ HEX_7SEG.INC ****************************************************************** ; Transforma un código hexadecimal en 7 segmentos. ;*************************************************************************************************************************** HEX_7SEG ADDWF PCL,F RETLW 3Fh ; El código 7 segmentos para el "0". RETLW 06h ; El código 7 segmentos para el "1". RETLW 5Bh ; El código 7 segmentos para el "2". RETLW 4Fh ; El código 7 segmentos para el "3". RETLW 66h ; El código 7 segmentos para el "4". RETLW 6Dh ; El código 7 segmentos para el "5". RETLW 7Dh ; El código 7 segmentos para el "6". RETLW 07h ; El código 7 segmentos para el "7". RETLW 7Fh ; El código 7 segmentos para el "8". RETLW 67h ; El código 7 segmentos para el "9". RETLW 77h ; El código 7 segmentos para el "A". RETLW 7Ch ; El código 7 segmentos para el "B". RETLW 39h ; El código 7 segmentos para el "C". RETLW 5Eh ; El código 7 segmentos para el "D". RETLW 79h ; El código 7 segmentos para el "E". RETLW 71h ; El código 7 segmentos para el "F" TECLADO.INC ( Entrenador Básico 5 ) ;****************************************** Librería "TECLADO.INC" *************************************************** ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== ; ; Librería de subrutinas para la gestión de un teclado organizado en una matriz de 4 x 4 y ; conectado al Puerto B según la disposición siguiente y explicada en la figura 19-2 del libro: ; ; RB4 RB5 RB6 RB7 ; ^ ^ ^ ^ ; ; RB0 --> ; ; RB1 --> ; ; RB2 --> ; ; RB3 --> ; ; ; Los números que se han dibujado dentro de cada cuadrado son el orden de las teclas 111

118 ; que no tienen por qué coincidir con lo serigrafiado sobre ellas. El paso del número de orden ; de la tecla al valor que hay serigrafiado sobre la misma se hace con una tabla de conversión. ;************************************** ZONA DE DATOS ************************************************************** CBLOCK Tecl_TeclaOrden ; Orden de la tecla a chequear. ENDC Tecl_UltimaTecla EQU d'15' ; Valor de orden de la última tecla utilizada. ;*****************************Subrutina "Teclado_LeeHex" ************************************************************ ; ; Cada tecla tiene asignado un número de orden que es contabilizado en la variable ; Tecl_TeclaOrden. Para convertir a su valor según el tipo de teclado en concreto se ; utiliza una tabla de conversión. ; A continuación se expone la relación entre el número de orden de la tecla y los ; valores correspondientes para el teclado hexadecimal más utilizado. ; ; ORDEN DE TECLA: TECLADO HEX. UTILIZADO: ; F ; E ; D ; A 0 B C ; ; Así, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la ; tecla "9" el orden 10. ; Si cambia el teclado también hay cambiar de tabla de conversión. ; ; Entrada: En (W) el orden de la tecla pulsada. ; Salida: En (W) el valor hexadecimal para este teclado concreto. Teclado_LeeHex call Teclado_LeeOrdenTecla ; Lee el Orden de la tecla pulsada. btfss STATUS,C ; Pulsa alguna tecla?, C=1? goto Tecl_FinLeeHex ; No, por tanto sale. call Tecl_ConvierteOrdenEnHex ; Lo convierte en su valor real mediante tabla. bsf STATUS,C ; Vuelve a posicionar el Carry, porque la Tecl_FinLeeHex return ; instrucción "addwf PCL,F" lo pone a "0". ; Tecl_ConvierteOrdenEnHex addwf PCL,F ; Según el teclado utilizado resulta: Teclado_FinTablaHex DT 7h,8h,9h,0Fh ; Primera fila del teclado. DT 4h,5h,6h,0Eh ; Segunda fila del teclado DT 1h,2h,3h,0Dh ; Tercera fila del teclado. DT 0Ah,0h,0Bh,0Ch ; Cuarta fila del teclado. ; Esta tabla se sitúa al principio de la librería con el propósito de que no supere la ; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera ; visualizaría el siguiente mensaje de error en el proceso de ensamblado: 112

119 ; IF (Teclado_FinTablaHex > 0xFF) ERROR "Atención: La tabla ha superado el tamaño de la página de los" MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente." ENDIF ;*************************************** Subrutina "Teclado_Inicializa" ************************************************ ; ; Esta subrutina configura las líneas del Puerto B según la conexión del teclado realizada ; y comprueba que no hay pulsada tecla alguna al principio. Teclado_Inicializa bsf STATUS,RP0 ; Configura las líneas del puerto: movlw b' ' ; <RB7:RB4> entradas, <RB3:RB0> salidas movwf PORTB bcf OPTION_REG,NOT_RBPU ; Habilita resistencia de Pull-Up del Puerto B. bcf STATUS,RP0 ; Acceso al banco 0. ; call Teclado_EsperaDejePulsar ; return ; ; ************************************Subrutina "Teclado_EsperaDejePulsar" *************************************** ; ;Permanece en esta subrutina mientras siga pulsada la tecla. ; Teclado_Comprobación EQU b' ' Teclado_EsperaDejePulsar movlw Teclado_Comprobacion; Pone a cero las cuatro líneas de salida del movwf PORTB ; Puerto B. Teclado_SigueEsperando call Retardo_20ms ; Espera a que se estabilicen los niveles de tensión. movf PORTB,W ; Lee el Puerto B. sublw Teclado_Comprobacion; Si es lo mismo que escribió es que ya no pulsa btfss STATUS,Z ; tecla alguna. goto Teclado_SigueEsperando return ;*********************************** Subrutina "Teclado_LeeOrdenTecla" ******************************************** ; ; Lee el teclado, obteniendo el orden de la tecla pulsada. ; ; Salida: En (W) el número de orden de la tecla pulsada. Además Carry se pone a "1" si ; se pulsa una tecla ó a "0" si no se pulsa tecla alguna. Teclado_LeeOrdenTecla: clrf Tecl_TeclaOrden ; Todavía no ha empezado a chequear el teclado. movlw b' ' ; Va a chequear primera fila. Tecl_ChequeaFila movwf PORTB ; (Ver esquema de conexión). ; Activa la fila correspondiente. Tecl_Columna1 btfss PORTB,4 ; Chequea la 1ª columna buscando un cero. goto Tecl_GuardaValor ; Sí, es cero y por tanto guarda su valor y sale. 113

120 incf Tecl_TeclaOrden,F ; Va a chequear la siguiente tecla. Tecl_Columna2 ; Repite proceso para las siguientes btfss PORTB,5 ; columnas. goto Tecl_GuardaValor incf Tecl_TeclaOrden,F Tecl_Columna3 btfss goto incf PORTB,6 Tecl_GuardaValor Tecl_TeclaOrden,F Tecl_Columna4 btfss PORTB,7 goto Tecl_GuardaValor incf Tecl_TeclaOrden,F ; ; Comprueba si ha chequeado la última tecla, en cuyo caso sale. Para ello testea si ; el contenido del registro Tecl_TeclaOrden es igual al número de teclas del teclado. Tecl_TerminaColumnas movlw Tecl_UltimaTecla subwf Tecl_TeclaOrden,W ; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla. btfsc STATUS,C ; C=0?, (W) negativo?, (Tecl_TeclaOrden)<15? goto Tecl_NoPulsada ; No, se ha llegado al final del chequeo. bsf STATUS,C ; Sí. Va a chequear la siguiente fila. rlf PORTB,W ; Apunta a la siguiente fila. goto Tecl_ChequeaFila Tecl_NoPulsada bcf STATUS,C ; Posiciona C=0, indicando que no ha pulsado goto Tecl_FinTecladoLee ; tecla alguna y sale. Tecl_GuardaValor movf Tecl_TeclaOrden,W ; El orden de la tecla pulsada en (W) y sale. bsf STATUS,C ; Como hay tecla tecla pulsada, pone C=1. Tecl_FinTecladoLee return ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== 114

121 8.- Entrenador Básico 6 115

122 8.1.- LCD_01.asm ( Entrenador Básico 6 ) title " Visualización de un mensaje en el LCD carácter a carácter" ;************************************** LCD_01.asm ******************************************************************** ; El modulo LCD visualiza el mensaje "Hola". ; ************************************************************************************************************************* ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** PRINCIPAL movlw 'H' ; Escribimos el carácter en el donde apunta call LCD_Caracter ; el Cursor del LCD e incrementa el cursor. movlw 'o' call LCD_Caracter movlw 'l' 116

123 call LCD_Caracter movlw 'a' call LCD_Caracter sleep ; Entra en modo de bajo consumo. ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END ; Subrutinas de control del módulo LCD. ; Subrutinas de retardo. ; Fin del programa LCD_02.asm ( Entrenador Básico 6 ) title " Visualización de un mensaje en el LCD carácter a carácter " title " con retardo de 500 ms, borrar pantalla y comenzar de nuevo " ;************************************** LCD_02.asm ******************************************************************* ; El modulo LCD visualiza el mensaje "Hola". La escritura de cada letra se realiza cada ; 500 ms. Después se borra y comienza de nuevo. ; ************************************************************************************************************************* ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa 117

124 ;*********************************** Sección de Configuración ********************************************************* ORG 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw 'H' ; Escribimos el carácter en el donde apunta call LCD_Caracter ; el Cursor del LCD e incrementa el cursor. call Retardo_500ms movlw 'o' call LCD_Caracter call Retardo_500ms movlw 'l' call LCD_Caracter call Retardo_500ms movlw 'a' call LCD_Caracter call Retardo_500ms call LCD_Borra ; Borra la pantalla y sitúa el cursor en el principio. call Retardo_500ms goto Principal ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END LCD_03.asm ( Entrenador Básico 6 ) title " Programa ejemplo para comprender la utilización de las subrutinas " title "LCD_ByteCompleto, LCD_Byte, LCD_Nibble y LCD_DosEspaciosBlancos" ;************************************** LCD_03.asm ******************************************************************* ; ; Programa ejemplo para comprender la utilización de las subrutinas "LCD_ByteCompleto", ; "LCD_Byte", "LCD_Nibble" y "LCD_DosEspaciosBlancos" ; ; Para ello se van a utilizar sucesivamente y en este orden las subrutinas: ; "LCD_ByteCompleto", "LCD_DosEspaciosBlancos", "LCD_Byte", ; "LCD_DosEspaciosBlancos" y "LCD_Nibble" para dos números que serán: ; ; - En la primera línea del LCD un numero con el nibble alto no cero. Por ejemplo: 1Dh. ; - En la segunda línea del LCD un numero con el nibble alto igual a cero. Ejemplo: 0Dh. ; ; Así por ejemplo, para los números "1D" y "0D" se visualizaría (donde "#" viene a significar ; espacio en blanco): ; "1D##1D##D" (Primera línea). ; "0D###D##D" (Segunda línea). ; ************************************************************************************************************************* 118

125 ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** Numero_NoCeroAlto EQU 0x1D ; Numero ejemplo nibble alto no cero. Numero_CeroAlto EQU 0x0D ; Numero ejemplo nibble alto cero. ;************************************** Registros ************************************************************************ CBLOCK 0x20 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw Numero_NoCeroAlto ;Visualizamos en el LCD Byte completo. call LCD_ByteCompleto call LCD_DosEspaciosBlancos ;Escribimos en el LCD dos espacios en blanco. movlw Numero_NoCeroAlto ;Visualizamos en el LCD Byte completo call LCD_Byte si el nible alto no es cero. call LCD_DosEspaciosBlancos ;Escribimos en el LCD dos espacios en blanco. 119

126 movlw Numero_NoCeroAlto call LCD_Nibble ;Visualizamos en el LCD nible bajo. call LCD_Linea2 ;Se sitúa el cursor en la segunda línea. movlw Numero_CeroAlto call LCD_ByteCompleto ;Visualizamos en el LCD Byte completo. call LCD_DosEspaciosBlancos ;Escribimos en el LCD dos espacios en blanco. movlw Numero_CeroAlto ;Visualizamos en el LCD nible bajo call LCD_Byte ya que el nible alto es cero. call LCD_DosEspaciosBlancos ;Escribimos en el LCD dos espacios en blanco. movlw Numero_CeroAlto call LCD_Nibble sleep ;Visualizamos en el LCD nible bajo. ; Entra en modo de bajo consumo. ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END LCD_04.asm ( Entrenador Básico 6 ) title " Visualización en el LCD un contador descendente " ;************************************** LCD_04.asm ******************************************************************** ; El modulo LCD visualiza un contador descendente que cuenta desde 59 hasta 0 y vuelve a ; repetir la cuenta ininterrumpidamente. En cada valor estará unos 500 ms en pantalla. ; ************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** 120

127 NumeroCarga EQU D'59' ; Cuenta inicial. ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw NumeroCarga ; Realiza carga inicial. movwf Contador Visualiza call VisualizaContador ; Visualiza el valor del Contador. decfsz Contador,F ; Decrementa el contador hasta llegar a cero. goto Visualiza ; Si no ha llegado a cero visualiza el siguiente. call VisualizaContador ; Ahora también debe visualizar el cero. call LCD_Borra ; Borra la pantalla call Retardo_5s ; durante 5 segundo. goto Principal ; Repite el proceso. ;*********************************** Subrutina "VisualizaContador" *************************************************** VisualizaContador call LCD_Linea1 ; Se sitúa en la primera posición de la línea 1. movf Contador,W ; Lo pasa a BCD. call BIN_a_BCD call LCD_Byte ; Visualiza el dato numérico. call Retardo_500ms ; Durante este tiempo. return ;*********************************************** Librerias **************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> END LCD_05.asm ( Entrenador Básico 6 ) 121

128 title " Visualizar en la pantalla del LCD los pulsos generados del exterior " ;************************************************* LCD_05.asm ********************************************************* ; Cada vez que presiona el pulsador conectado al pin RA4 incrementa un contador ; visualizado en el centro de la primera línea de la pantalla. ; ************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador se configura como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. 122

129 clrf Contador ; Inicializa contador y los visualiza por primera vez. call Visualiza ;************************************* Principal ************************************************************************** Principal btfss Pulsador ; Lee el pulsador. call IncrementaVisualiza ; Si pulsa salta a incrementar y visualizar el goto Principal ; contador ;**************************** Subrutina "IncrementaVisualiza" ********************************************************* IncrementaVisualiza call Retardo_20ms ; Espera a que se estabilicen los niveles de tensión. btfsc Pulsador ; Vuelve a leer el pulsador. goto Fin_Incrementa incf Contador,F ; Incrementa el contador y después lo visualiza. Visualiza movlw D'7' ; Se sitúa en el centro de la línea 1. call LCD_PosicionLinea1 movf Contador,W call BIN_a_BCD ; Se debe visualizar en decimal. call LCD_Byte EsperaDejePulsar btfss Pulsador goto EsperaDejePulsar Fin_Incrementa return ;*********************************************** Librerías **************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> END LCD_06.asm ( Entrenador Básico 6 ) title " Visualizar en la pantalla del LCD los pulsos generados del exterior " title " hasta un número máximo, se resetea y comienza de nuevo la cuenta " ;************************************** LCD_06.asm ******************************************************************** ; Cada vez que presiona el pulsador conectado al pin RA4, incrementa un contador que se ; visualiza en la pantalla. Cuando llegue a su valor máximo (por ejemplo 6) se resetea y ; comienza de nuevo la cuenta. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;************************************** Elegimos PIC ******************************************************************** list p=16f877, f=inhx32 123

130 ;**************** 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 *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ValorMaximo EQU D'6' ; Valor máximo de la cuenta. ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador se configura como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. clrf Contador ; Inicializa contador y los visualiza por primera vez. call Visualiza ;************************************* Principal ************************************************************************** Principal btfss Pulsador ; Lee el pulsador. call IncrementaVisualiza ; Si pulsa salta a incrementar y visualizar el goto Principal ; contador ;**************************** Subrutina "IncrementaVisualiza" ********************************************************* IncrementaVisualiza call Retardo_20ms ; Espera a que se estabilice el nivel de tensión. btfsc Pulsador ; Vuelve a leer el pulsador. goto Fin_Incrementa call IncrementaContador ; Incrementa el contador y después lo visualiza. Visualiza movlw D'7' ; Se sitúa en el centro de la línea 1. call LCD_PosicionLinea1 movf Contador,W call BIN_a_BCD ; Debe visualizar en decimal. call LCD_Byte 124

131 EsperaDejePulsar btfss Pulsador goto EsperaDejePulsar Fin_Incrementa return ;****************************** Subrutina "IncrementaContador" ****************************************************** ; Incrementa el valor de la variable Contador. Si llega al valor máximo lo resetea. IncrementaContador incf Contador,F ; Incrementa el contador movf Contador,W ; Ha superado su valor máximo? sublw ValorMaximo ; (W)<- #ValorMaximo-(Contador). btfss STATUS,C ; Si C =1 salta una instrucción. (Contador)> #ValorMaximo clrf Contador ; Lo inicializa si ha superado su valor máximo. return ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END ; Subrutinas de control del LCD. ; Subrutinas de retardo. ; Subrutina BIN_a_BCD. ; Fin del programa LCD_07.asm ( Entrenador Básico 6 ) title " Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador" title " que se visualiza en la pantalla del LCD." ;************************************************* LCD_07.asm ********************************************************* ; Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador ; que se visualiza en la pantalla. Cuando llegue a su valor máximo (por ejemplo 59) se resetea ; y comienza de nuevo la cuenta. Se mantiene 200 ms en cada cuenta. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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. 125

132 ;************************************** Igualdades *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ValorMaximo EQU D'59' ; Valor máximo de la cuenta. ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador se configura como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. clrf Contador ; Inicializa contador y los visualiza por primera vez. call Visualiza ;************************************* Principal ************************************************************************** Principal btfss Pulsador ; Lee el pulsador. call IncrementaVisualiza ; Si pulsa salta a incrementar y visualizar el goto Principal ; contador ;**************************** Subrutina "IncrementaVisualiza" ********************************************************* IncrementaVisualiza call Retardo_20ms ; Espera a que se estabilice el nivel de tensión. btfsc Pulsador ; Vuelve a leer el pulsador. goto Fin_Incrementa call IncrementaContador ; Incrementa el contador y después lo visualiza. Visualiza movlw D'7' ; Se sitúa en el centro de la línea 1. call LCD_PosicionLinea1 movf Contador,W call BIN_a_BCD ; Debe visualizar en decimal. call LCD_Byte call Retardo_200ms ; Se mantiene durante este tiempo. Fin_Incrementa return ;****************************** Subrutina "IncrementaContador" ****************************************************** 126

133 ; Incrementa el valor de la variable Contador. Si llega al valor máximo lo resetea. IncrementaContador incf Contador,F ; Incrementa el contador movf Contador,W ; Ha superado su valor máximo? sublw ValorMaximo ; (W)<- #ValorMaximo-(Contador). btfss STATUS,C ; Si C =1 salta una instrucción. (Contador)> #ValorMaximo clrf Contador ; Lo inicializa si ha superado su valor máximo. return ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END ; Subrutinas de control del LCD. ; Subrutinas de retardo. ; Subrutina BIN_a_BCD. ; Fin del programa LCD_08.asm ( Entrenador Básico 6 ) title " Mientras se mantenga presionado el pulsador conectado al pin RA4, incrementa un contador" title " que se visualiza en la pantalla del LCD en formato decimal,hexadecimal y binario." ;************************************** LCD_08.asm ******************************************************************** ; Mientras se mantenga presionado el pulsador conectado al pin RA4, se incrementa un contador ; visualizado en la pantalla en tres formatos: decimal, hexadecimal y binario. Un ejemplo: ; Primera Línea: "CE 206" ; Segunda Línea: " " ;************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ;************************************** Registros ************************************************************************ 127

134 CBLOCK 0x20 Contador Auxiliar Desplaza 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador se configura como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. clrf Contador ; Inicializa contador y call VisualizaContador ; lo visualiza. ;************************************* Principal ************************************************************************** Principal btfsc Pulsador ; Lee el pulsador. goto Fin ; Si no pulsa salta a final. call Retardo_20ms ; Espera a que se estabilicen los niveles de tensión. btfsc Pulsador ; Vuelve a leer el pulsador. goto Fin incf Contador,F ; Incrementa el contador. call VisualizaContador call Retardo_200ms ; Se incrementara de nuevo cuando pase este Fin goto Principal ; tiempo. ;********************************** Subrutina "VisualizaContador" ***************************************************** VisualizaContador call LCD_Borra ; Borra la pantalla. movf Contador,W ; A continuación visualiza el contador. call LCD_ByteCompleto ; Visualiza en HEXADECIMAL. call LCD_TresEspaciosBlancos ; Como separador. movf Contador,W ; Ahora se visualiza en DECIMAL. call BIN_a_BCD ; Primero se convierte a BCD. movwf Auxiliar ; Guarda las decenas y unidades. movf BCD_Centenas,W ; Visualiza centenas. call LCD_Nibble movf Auxiliar,W ; Visualiza las decenas y unidades. call LCD_ByteCompleto call LCD_Linea2 ; En la segunda línea para visualizar en BINARIO. movlw D'8' ; Utiliza el registro auxiliar como contador del 128

135 movwf Auxiliar ; numero de bits que se va visualizando por la movf Contador,W ; pantalla. movwf Desplaza VisualizaBit rlf Desplaza,F ; El BIT a visualizar pasa al Carry. movlw '1' ; En principio supone que es un uno. btfss STATUS,C ; Comprueba su valor. movlw '0' ; Ha sido cero. call LCD_Caracter ; Lo visualiza. decfsz Auxiliar,F ; Ha terminado de visualizar los 8 bits? goto VisualizaBit ; No, sigue visualizando otro bit. return ;*********************************************** Librerias **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END Mens_01.asm ( Entrenador Básico 6 ) title " Visualización de un mensaje fijo utilizando la librería LCD_4BIT.INC " ;************************************ Mens_01.asm ********************************************************************* ; En la pantalla del modulo LCD se visualiza un mensaje de menos de 16 caracteres grabado ; en la memoria ROM mediante la directiva DT. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 LCD_ApuntaCaracter ; Indica la posición del carácter a visualizar ; respecto del comienzo de todos los mensajes ; (posición de la etiqueta "Mensajes"). 129

136 LCD_ValorCaracter ENDC ; Valor del código ASCII del carácter a ; visualizar. ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* ORG 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. clrf LCD_ApuntaCaracter ; Se visualizara la primera posición del mensaje. ;************************************* Principal ************************************************************************** LCD_VisualizaOtroCaracter movf LCD_ApuntaCaracter,W call Mensajes ; Obtiene el código ASCII del carácter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carácter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto Fin ; de mensaje, sale fuera. LCD_NoUltimoCaracter call LCD_Caracter ; Visualiza el carácter ASCII leído. incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter goto LCD_VisualizaOtroCaracter ; dentro del mensaje. Fin sleep ; Pasa a modo bajo consumo. ;********************************* Subrutina "Mensajes" *************************************************************** Mensajes addwf PCL,F Mensaje0 DT "Hola!, que tal? ", 0x00 ; Posición inicial del mensaje. ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Mens_02.asm ( Entrenador Básico 6 ) title " Visualización de un mensaje fijo utilizando la librería LCD_MENS.INC " ;************************************ Mens_02.asm ********************************************************************* ; En la pantalla del modulo LCD se visualiza un mensaje de menos de 16 caracteres grabado ; en la memoria ROM mediante la directiva DT. Utiliza la subrutina LCD_Mensaje de la 130

137 ; librería LCD_MENS.INC ;************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como senales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw Mensaje0 ; Apunta donde se encuentra el mensaje. call LCD_Mensaje ; Visualiza el mensaje. sleep ; Pasa a modo bajo consumo. ;********************************* Subrutina "Mensajes" **************************************************************** Mensajes addwf PCL,F Mensaje0 DT "Hola!, que tal? ", 0x00 ; Posición inicial del mensaje. ;*********************************************** Librerías **************************************************************** 131

138 INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Mens_03.asm ( Entrenador Básico 6 ) title " Visualización de varios mensajes fijo utilizando la librería LCD_MENS.INC " ;************************************ Mensaje_03.asm ****************************************************************** ; En la pantalla se visualizan varios mensajes, uno detrás de otro. Cada mensaje permanece ; durante 2 segundos. Entre mensaje y mensaje la pantalla se apaga durante unos 200 ms. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. 132

139 movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw Mensaje0 ; Apunta al mensaje 0. call Visualiza movlw Mensaje1 ; Apunta al mensaje 1. call Visualiza movlw Mensaje2 ; Apunta al mensaje 2. call Visualiza call Retardo_5s ; Permanece apagada durante este tiempo. goto Principal ; Repite la visualización de todos los mensajes. ;************************************ Subrutina "Visualiza" ************************************************************* Visualiza call LCD_Mensaje call Retardo_2s ; Visualiza el mensaje durante este tiempo. call LCD_Borra ; Borra la pantalla y se mantiene así durante call Retardo_200ms ; este tiempo. return ;********************************* Subrutina "Mensajes" **************************************************************** Mensajes addwf PCL,F Mensaje0 DT "Estudia PIC, es", 0x00 ; Posición inicial del mensaje 0. Mensaje1 DT "bueno.", 0x00 ; Posición inicial del mensaje 1. Mensaje2 DT "IES JOAN MIRO", 0x00 ; Posición inicial del mensaje 2. ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Mens_03B.asm ( Entrenador Básico 6 ) title " Visualización de varios mensajes fijo utilizando la librería LCD_MENS.INC " title " Cuando se visualiza el ultimo mensaje el proceso se repite " ;************************************ Mens_03B.asm ******************************************************************* ; En la pantalla se visualizan varios mensajes, uno detrás de otro. Cada mensaje permanece ; durante 2 segundos. Entre mensaje y mensaje la pantalla se apaga durante unos 200 ms. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. 133

140 ;************************************** 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 *********************************************************************** ValorMaximo EQU D'6' ; Numero de mensajes a visualizar ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador 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 5 COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. clrf Contador ; Inicializa el registro Contador. ;************************************* Principal ************************************************************************** Principal movlw ValorMaximo ; Comprueba que Contador no haya llegado al máximo. subwf Contador,W ; (W) <- (Contador)-ValorMaximo btfss STATUS,C ; Si C=1 salta una instrucción. ValorMaximo > (Contador) goto Visualiza ; No. El contador todavía no ha llegado al máximo. clrf Contador ; Sí. Inicializa el contador y lo visualiza. call LCD_Borra ; Pantalla apagada durante unos instantes call Retardo_5s ; para señalar el último mensaje de la lista. Visualiza call LCD_Borra ; Borra la pantalla y se sitúa en la línea 1. call Retardo_200ms movf Contador,W ; Apunta al mensaje que se va a visualizar. call ApuntaMensaje call LCD_Mensaje ; Lo visualiza. call Retardo_2s ; Se visualiza el mensaje durante este tiempo. 134

141 incf Contador,F ; Incrementa el contador. goto Principal ; Repite el proceso. ;************************************ Subrutina "ApuntaMensaje" ****************************************************** ApuntaMensaje addwf PCL,F retlw retlw retlw retlw retlw retlw Mensaje0 Mensaje1 Mensaje2 Mensaje3 Mensaje4 Mensaje5 ;********************************* Subrutina "Mensajes" **************************************************************** Mensajes addwf PCL,F Mensaje0 DT "Estudia PIC, es", 0x00; ; Posición inicial del mensaje 0. Mensaje1 DT "muy divertido.", 0x00 ; Posición inicial del mensaje 1. Mensaje2 DT "IES JOAN MIRO", 0x00 ; Posición inicial del mensaje 2. Mensaje3 DT "S.S. de los Reyes", 0x00 ; Posición inicial del mensaje 3. Mensaje4 DT " Estudia ", 0x00 ; Posición inicial del mensaje 4. Mensaje5 DT " ELECTRONICA ", 0x00 ; Posición inicial del mensaje 5. ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Mens_04.asm ( Entrenador Básico 6 ) title " Visualización de mensajes parpadeantes en dos líneas del LCD " ;************************************ Mens_04.asm ********************************************************************* ; En las dos líneas de la pantalla apareceren dos mensajes parpadeantes. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;************************************** Elegimos PIC ******************************************************************** 135

142 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw Mensaje0 ; Apunta al mensaje de la primera línea y call LCD_Mensaje ; lo visualiza. call LCD_Linea2 ; Pasa a la segunda línea. movlw Mensaje1 ; Apunta al mensaje de la segunda línea. call LCD_Mensaje ; Lo visualiza. call Retardo_500ms ; Durante este tiempo. call LCD_Borra ; Borra la pantalla. call Retardo_500ms ; Durante este tiempo, produciendo un efecto de goto Principal ; parpadeo. ;********************************* Subrutina "Mensajes" **************************************************************** Mensajes addwf PCL,F Mensaje0 DT " Estudia un", 0x00 ; Posición inicial del mensaje 0. Mensaje1 DT "Ciclo Formativo", 0x00 ; Posición inicial del mensaje 1. ;*********************************************** Librerías **************************************************************** 136

143 INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Mens_05.asm ( Entrenador Básico 6 ) title " Visualización de un mensaje fijo y parpadeantes " ;*************************************** Mens_05.asm ****************************************************************** ; En la primera línea de la pantalla aparece un mensaje fijo. En la segunda linea aparece ; un mensaje parpadeante. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. 137

144 bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw MensajeFijo ; Apunta al mensaje fijo y lo visualiza. call LCD_Mensaje seguir call LCD_Linea2 ; Pasa a la segunda línea. movlw MensajeParpadeante ; Apunta al mensaje parpadeante. call LCD_Mensaje ; Lo visualiza. call Retardo_500ms ; Durante este tiempo. call LCD_Linea2 ; Vuelve a situarse al principio de la línea 2. call LCD_LineaEnBlanco ; Visualiza línea en blanco. call Retardo_500ms ; Durante este tiempo, produciendo un efecto de goto seguir ; parpadeo. ;********************************* Subrutina "Mensajes" **************************************************************** Mensajes addwf PCL,F MensajeFijo DT " Estudia ", 0x00; MensajeParpadeante DT " ELECTRONICA ", 0x00 ;*********************************************** Libreras **************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Mens_06.asm ( Entrenador Básico 6 ) title " Visualización de mensajes en función de un pulsador " ;************************************** Mens_06.asm ******************************************************************* ; En el modulo LCD se pueden visualizar varios mensajes diferentes. El paso de uno ; a otro se realiza al actuar sobre un pulsador conectado a la línea RA4. ; En pantalla aparecere por ejemplo: ; " Mensaje 2 " (primera línea). ; "S.S. de los Reyes." (segunda línea). ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 us. ;Perro Guardián deshabilitado. ;Tipo de Reloj XT. ;Protección de Código: OFF. ;************************************** Elegimos PIC ******************************************************************** 138

145 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 *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ValorMaximo EQU D'4' ; Numero de mensajes. ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador ; El contador a visualizar. ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador configurada como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. clrf Contador call Visualiza ; Inicializa contador y los visualiza por primera vez. ;************************************* Principal ************************************************************************** Principal btfsc Pulsador ; Lee el pulsador. goto Fin call Retardo_20ms ; Espera estabilicen niveles de tensión. btfsc Pulsador ; Vuelve a leer el pulsador. goto Fin call IncrementaContador ; Incrementa el contador. call Visualiza ; Visualiza el mensaje correspondiente. EsperaDejePulsar btfss Pulsador goto EsperaDejePulsar Fin goto Principal ;********************************** Subrutina "IncrementaContador" ************************************************** ; Incrementa el valor de la variable Contador. Si llega al valor máximo lo resetea. IncrementaContador incf Contador,F ; Incrementa el contador. 139

146 movf Contador,W ; Ha superado su valor máximo? sublw ValorMaximo-1 ; (W)<- ValorMaximo-(Contador). btfss STATUS,C ; Si C=1 salta una instrucción. (Contador)> #ValorMaximo clrf Contador ; Lo inicializa si ha superado su valor máximo. return ;************************************** Subrutina "Visualiza" ********************************************************** Visualiza call LCD_Borra ; Borra la pantalla y se sitúa en la línea 1. movlw MensajeN ; Apunta a este mensaje. call LCD_Mensaje ; Lo visualiza. movf Contador,W ; A continuación visualiza el contador. call BIN_a_BCD ; Se debe visualizar en BCD. call LCD_Byte call LCD_Linea2 ; Al principio de la segunda línea del LCD. movf Contador,W call ApuntaMensaje ; Apunta al mensaje que se va a visualizar. call LCD_Mensaje ; Lo visualiza. return ;************************************** Subrutina "ApuntaMensaje" **************************************************** ApuntaMensaje addwf retlw retlw retlw retlw PCL,F Mensaje0 Mensaje1 Mensaje2 Mensaje3 ;***************************************** Subrutina "Mensajes" ******************************************************** Mensajes addwf PCL,F Mensaje0 DT " DESARROLLO DE ",0x00 ; Posición inicial del mensaje 0. Mensaje1 DT " PROYECTOS ", 0x00 ; Posición inicial del mensaje 1. Mensaje2 DT "S.S. SEBASTIAN", 0x00 ; Posición inicial del mensaje 2. Mensaje3 DT "de los Reyes", 0x00 ; Posición inicial del mensaje 3. MensajeN DT " Mensaje ", 0x00 ; Posición inicial del mensaje primera línea del LCD. ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_MENS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END Mens_07.asm ( Entrenador Básico 6 ) title " El modulo LCD visualiza un mensaje largo (más de 16 caracteres) que se desplaza " ;**************************************************** Mens_07.asm ***************************************************** ; ; El modulo LCD visualiza un mensaje largo (más de 16 caracteres) que se desplaza a lo largo ; de la pantalla. Se utiliza la subrutina LCD_MensajeMovimiento de la librería LCD_MENS.INC. 140

147 ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. ;************************************* Principal ************************************************************************** Principal movlw Mensaje0 ; Apunta al mensaje. call LCD_MensajeMovimiento goto Principal ; Repite la visualización. ;***************************************** Subrutina "Mensajes" ******************************************************** Mensajes addwf PCL,F Mensaje0 DT " " ; Posición inicial del mensaje. ; Espacios en blanco al principio para mejor DT "Estudia un Ciclo Formativo " ; visualización. DT "de ELECTRONICA." DT " ", 0x0 ; Espacios en blanco al final. 141

148 ;*********************************************** Librerías **************************************************************** INCLUDE <LCD_MENS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END ; Subrutina LCD_MensajeMovimiento. ; Subrutinas de control del LCD. ; Subrutinas de retardos. ; Fin del programa Mens_08.asm ( Entrenador Básico 6 ) title " Juego de la Quiniela " ;*********************************************** Mens_08.asm ********************************************************** ; Programa para el juego de la Quiniela: Al presionar sobre el pulsador conectado al pin RA4 ; se incrementara en pantalla aparecerá rápidamente "1", "X", "2". Cuando se suelta el pulsador ; permanece el signo seleccionado. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ;************************************** Registros ************************************************************************ CBLOCK 0x20 Contador ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco

149 movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador que se configura como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. movlw MensajeQuiniela call LCD_Mensaje ;************************************* Principal ************************************************************************** Principal btfss Pulsador ; Lee el pulsador. call IncrementaVisualiza ; Si pulsa salta a incrementar y visualizar el goto Principal ; contador ;************************************** Subrutina "IncrementaVisualiza" *********************************************** IncrementaVisualiza incf Contador,F movlw D'7' ; Se sitúa en el centro de la línea 2. call LCD_PosicionLinea2 movf Contador,W andlw b' ' ; Se queda con las 5 líneas bajas: 32 posibilidades call SignoQuiniela ; Lo convierte a signo de la quiniela. call LCD_Caracter ; Lo visualiza. return ;******************************************** Subrutina "SignoQuiniela" ************************************************ SignoQuiniela addwf PCL,F DT "1X121X121X121X1X1X121X121X121X12" ; 50% de "1", 28% de "X" y 21% de "2". ;***************************************** Subrutina "Mensajes" ******************************************************** Mensajes addwf PCL,F MensajeQuiniela DT " Quiniela:", 0x00 ;*********************************************** Librerías **************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> END Mens_09.asm ( Entrenador Básico 6 ) title " La pantalla del LCD visualiza un mensaje en función de un pulsador " ;*********************************************** Mens_09.asm ********************************************************** ; En pantalla visualiza "Cerrado" o "Abierto" según si un pulsador esta presionado o no. ;*************************************************************************************************************************** ;Programa para PIC 16F

150 ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** #DEFINE Pulsador PORTA,4 ; Línea donde se conecta el pulsador. ;************************************** Registros ************************************************************************ CBLOCK 0x20 ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bsf Pulsador ; Línea del pulsador que se configura como entrada. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. movlw MensajePulsador call LCD_Mensaje ;************************************* Principal ************************************************************************** Principal call LCD_Linea2 movlw MensajeCerrado ; En principio considera que está presionado. btfsc Pulsador ; Lee el pulsador. movlw MensajeAbierto ; No, estaba en reposo. call LCD_Mensaje ; Visualiza el resultado. goto Principal ;*********************************** Subrutina "Mensajes" ************************************************************** 144

151 Mensajes addwf PCL,F MensajePulsador DT " Pulsador" MensajeAbierto DT " abierto", 0x00 MensajeCerrado DT " CErraDO", 0x00 ;*********************************************** Librerías **************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> END BIN_BCD.INC ( Entrenador Básico 6 ) ;******************************************** Librería "BIN_BCD.INC" ************************************************** ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== ; ; Un número binario natural de 8 bits es convertido a BCD. El resultado se guarda en tres ; posiciones de memorias llamadas: BCD_Centenas, BCD_Decenas y BCD_Unidades. ; ; El procedimiento utilizado es mediante restas de 10, tal como se explicó en el capítulo 9. ; ; Entrada: En el registro W el número binario natural a convertir. ; Salidas: En (BCD_Centenas), (BCD_Decenas) y (BCD_Unidades). ; En el registro W también las decenas (nibble alto) y unidades (nibble bajo). ;******************************************** Subrutina "BIN_a_BCD" ************************************************** CBLOCK BCD_Centenas BCD_Decenas BCD_Unidades ENDC ; En las subrutinas no se debe fijar la dirección ; de la RAM de usuario. Se toma a continuación de ; la última asignada. BIN_a_BCD clrf BCD_Centenas ; Carga los registros con el resultado inicial. clrf BCD_Decenas ; En principio las centenas y decenas a cero. movwf BCD_Unidades ; Se carga el número binario a convertir. BCD_Resta10 movlw.10 ; A las unidades se les va restando 10 en cada subwf BCD_Unidades,W ; pasada. (W)=(BCD_Unidades) -10. btfss STATUS,C ; C = 1?, (W) positivo?, (BCD_Unidades)>=10? goto BIN_BCD_Fin ; No, es menor de 10. Se acabó. BCD_IncrementaDecenas movwf BCD_Unidades ; Recupera lo que queda por restar. incf BCD_Decenas,F ; Incrementa las decenas y comprueba si ha movlw.10 ; llegado a 10. Lo hace mediante una resta. subwf BCD_Decenas,W ; (W)=(BCD_Decenas)-10). btfss STATUS,C ; C = 1?, (W) positivo?, (BCD_Decenas)>=10? goto BCD_Resta10 ; No. Vuelve a dar otra pasada, restándole ; 10 a las unidades. BCD_IncrementaCentenas clrf BCD_Decenas ; Pone a cero las decenas incf BCD_Centenas,F ; e incrementa las centenas. 145

152 goto BCD_Resta10 ; Otra pasada: Resta 10 al número a convertir. BIN_BCD_Fin swapf BCD_Decenas,W ; En el nibble alto de (W) también las decenas. addwf BCD_Unidades,W ; En el nibble bajo de (W) las unidades. return ; Vuelve al programa principal. ; La directiva "END" se debe poner en el programa principal no aquí LCD_4BIT.INC ( Entrenador Básico 6 ) ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== ;*********************************************** Librería "LCD_4BIT.INC" ********************************************** ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== ; ; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2 ; líneas por 16 caracteres, compatible con el modelo LM016L. ; ; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las ; conexiones son: ; - Las 4 líneas superiores del módulo LCD, pines <DB7:DB4> se conectan a las 4 ; líneas superiores del Puerto B del PIC, pines <RB7:RB4>. ; - Pin RS del LCD a la línea RA0 del PIC. ; - Pin R/W del LCD a la línea RA1 del PIC, o a masa. ; - Pin Enable del LCD a la línea RA2 del PIC. ; ; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería RETARDOS.INC. ; ;***************************************************** Registros ********************************************************* CBLOCK LCD_Dato LCD_GuardaDato LCD_GuardaTRISB LCD_Auxiliar1 LCD_Auxiliar2 ENDC ;***************************************************** Igualdades ******************************************************** LCD_CaracteresPorLinea EQU D 16 ; Número de caracteres por línea de la pantalla. #DEFINE LCD_PinRS #DEFINE LCD_PinRW #DEFINE LCD_PinEnable PORTA,0 PORTA,1 PORTA,2 146

153 #DEFINE LCD_BusDatos PORTB ; ********************************************* Subrutina "LCD_Inicializa" ********************************************** ; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software, ; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la ; configuración inicial hay que hacerla como sigue: ; LCD_Inicializa bsf STATUS,RP0 ; Configura las líneas conectadas al pines RS, bcf LCD_PinRS ; R/W y E. bcf LCD_PinEnable bcf LCD_PinRW bcf STATUS,RP0 bcf LCD_PinRW ; En caso de que esté conectado le indica ; que se va a escribir en el LCD. bcf LCD_PinEnable ; Impide funcionamiento del LCD poniendo E=0. bcf LCD_PinRS ; Activa el Modo Comando poniendo RS=0. call Retardo_20ms movlw b' ' call LCD_EscribeLCD ; Escribe el dato en el LCD. call Retardo_5ms movlw b' ' call LCD_EscribeLCD call Retardo_200micros movlw b' ' call LCD_EscribeLCD movlw b' ' ; Interface de 4 bits. call LCD_EscribeLCD ; Ahora configura el resto de los parámetros: call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos. call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio call LCD_CursorOFF ; de la línea 1. Cursor apagado. call LCD_CursorIncr ; Cursor en modo incrementar. return ;***************************************** Subrutina "LCD_EscribeLCD" ********************************************** ; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin ; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que ; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se ; vuelve a enviar este dato sin cambiarlo. LCD_EscribeLCD andlw b' ' ; Se queda con el nibble alto del dato que es el movwf LCD_Dato ; que hay que enviar y lo guarda. movf LCD_BusDatos,W ; Lee la información actual de la parte baja andlw b' ' ; del Puerto B, que no se debe alterar. iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada ; y en la parte baja lo que había antes. bsf STATUS,RP0 ; Acceso al Banco 1. movf TRISB,W ; Guarda la configuración que tenía antes TRISB. movwf LCD_GuardaTRISB movlw b' ' ; Las 4 líneas inferiores del Puerto B se dejan andwf PORTB,F ; como estaban y las 4 superiores como salida. bcf STATUS,RP0 ; Acceso al Banco 0. movf LCD_Dato,W ; Recupera el dato a enviar. 147

154 movwf LCD_BusDatos ; Envía el dato al módulo LCD. bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD. bsf STATUS,RP0 ; Acceso al Banco 1. Restaura el antiguo valor en movf LCD_GuardaTRISB,W ; la configuración del Puerto B. movwf PORTB ; Realmente es TRISB. bcf STATUS,RP0 ; Acceso al Banco 0. return ; *******************************Subrutinas variadas para el control del módulo LCD ******************************* ;Los comandos que pueden ser ejecutados son: LCD_CursorIncr movlw b' ' ; Cursor en modo incrementar. goto LCD_EnviaComando LCD_Linea1 movlw b' ' ; Cursor al principio de la Línea 1. goto LCD_EnviaComando ; Dirección 00h de la DDRAM LCD_Linea2 movlw b' ' ; Cursor al principio de la Línea 2. goto LCD_EnviaComando ; Dirección 40h de la DDRAM LCD_PosicionLinea1 iorlw b' ' ; Cursor a posición de la Línea 1, a partir de la goto LCD_EnviaComando ; dirección 00h de la DDRAM más el valor del ; registro W. LCD_PosicionLinea2 iorlw b' ' ; Cursor a posición de la Línea 2, a partir de la goto LCD_EnviaComando ; dirección 40h de la DDRAM más el valor del ; registro W. LCD_OFF movlw b' ' ; Pantalla apagada. goto LCD_EnviaComando LCD_CursorON movlw b' ' ; Pantalla encendida y cursor encendido. goto LCD_EnviaComando LCD_CursorOFF movlw b' ' ; Pantalla encendida y cursor apagado. goto LCD_EnviaComando LCD_Borra movlw b' ' ; Borra toda la pantalla, memoria DDRAM y pone el goto LCD_EnviaComando ; cursor a principio de la línea 1. LCD_2Lineas4Bits5x7 movlw b' ' ; Define la pantalla de 2 líneas, con caracteres goto LCD_EnviaComando ; de 5x7 puntos y conexión al PIC mediante bus de ; 4 bits. ; *************************** Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ********************************** ; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de ; comando ha sido entregada a través del registro W. Trabaja en Modo Comando. ; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a ; a través del registro W. Trabaja en Modo Dato. LCD_EnviaComando bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0. goto LCD_Envia 148

155 LCD_Carácter bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1. call LCD_CodigoCGROM ; Obtiene el código para correcta visualización. LCD_Envia movwf LCD_GuardaDato ; Guarda el dato a enviar. call LCD_EscribeLCD ; Primero envía el nibble alto. swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el ; nibble bajo del dato a enviar a parte alta del byte. call LCD_EscribeLCD ; Se envía al visualizador LCD. btfss LCD_PinRS ; Debe garantizar una correcta escritura call Retardo_2ms ; manteniendo 2 ms en modo comando call Retardo_50micros ; y 50 µs en modo carácter. return ;************************************** Subrutina "LCD_CodigoCGROM ********************************************** ; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la ; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código ; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh. ; ; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que ; que puedan ser visualizado en el módulo LM016L. ; ; Entrada: En (W) el código ASCII del carácter que se desea visualizar. ; Salida: En (W) el código definido en la tabla CGROM. LCD_CodigoCGROM movwf LCD_Dato ; Guarda el valor del carácter y comprueba si es ; un carácter especial. LCD_EnheMinuscula sublw 'ñ' ; Es la "ñ"? btfss STATUS,Z goto LCD_EnheMayuscula ; No es "ñ". movlw b' ' ; Código CGROM de la "ñ". movwf LCD_Dato goto LCD_FinCGROM LCD_EnheMayuscula movf LCD_Dato,W ; Recupera el código ASCII de entrada. sublw 'Ñ' ; Es la "Ñ"? btfss STATUS,Z goto LCD_Grado ; No es "Ñ". movlw b' ' ; Código CGROM de la "ñ". (No hay símbolo para movwf LCD_Dato ; la "Ñ" mayúscula en la CGROM). goto LCD_FinCGROM LCD_Grado movf LCD_Dato,W ; Recupera el código ASCII de entrada. sublw 'º' ; Es el símbolo "º"? btfss STATUS,Z goto LCD_FinCGROM ; No es "º". movlw b' ' ; Código CGROM del símbolo "º". movwf LCD_Dato LCD_FinCGROM movf LCD_Dato,W ; En (W) el código buscado. return ; ************************* Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" ************************** ; Visualiza espacios en blanco. 149

156 LCD_LineaEnBlanco movlw LCD_CaracteresPorLinea goto LCD_EnviaBlancos LCD_UnEspacioBlanco movlw.1 goto LCD_EnviaBlancos LCD_DosEspaciosBlancos movlw.2 goto LCD_EnviaBlancos LCD_TresEspaciosBlancos movlw.3 LCD_EnviaBlancos movwf LCD_Auxiliar1 ; (LCD_Auxiliar1) se utiliza como contador. LCD_EnviaOtroBlanco movlw ' ' ; Esto es un espacio en blanco. call LCD_Caracter ; Visualiza tanto espacios en blanco como decfsz LCD_Auxiliar1,F ; se haya cargado en (LCD_Auxiliar1). goto LCD_EnviaOtroBlanco return ; **************************** Subrutinas "LCD_ByteCompleto" y "LCD_Byte" *************************************** ; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el ; lugar actual de la pantalla. Por ejemplo, si (W)=b' ' visualiza "AE". ; ; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero ; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b' ' visualiza "AE" ; y si (W)=b' ', visualiza " E" (un espacio blanco delante). ; ; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante. LCD_Byte movwf LCD_Auxiliar2 ; Guarda el valor de entrada. andlw b' ' ; Analiza si el nibble alto es cero. btfss STATUS,Z ; Si es cero lo apaga. goto LCD_VisualizaAlto ; No es cero y lo visualiza. movlw ' ' ; Visualiza un espacio en blanco. call LCD_Caracter goto LCD_VisualizaBajo LCD_ByteCompleto movwf LCD_Auxiliar2 ; Guarda el valor de entrada. LCD_VisualizaAlto swapf LCD_Auxiliar2,W ; Pone el nibble alto en la parte baja. call LCD_Nibble ; Lo visualiza. LCD_VisualizaBajo movf LCD_Auxiliar2,W ; Repite el proceso con el nibble bajo. call LCD_Nibble ; Lo visualiza. return ; **************************************** Subrutina "LCD_Nibble" ***************************************************** ; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble ; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos: ; - Si (W)=b' ', se visualizará "6". ; - Si (W)=b' ', se visualizará "E". LCD_Nibble andlw b' ' ; Se queda con la parte baja. movwf LCD_Auxiliar1 ; Lo guarda. sublw 0x09 ; Comprueba si hay que representarlo con 150

157 btfss STATUS,C ; letra. goto LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw '0' ; El número se pasa a carácter ASCII goto LCD_FinVisualizaDigito; sumándole el ASCII del cero y lo visualiza. LCD_EnviaByteLetra movf LCD_Auxiliar1,W addlw 'A'-0x0A ; Sí, por tanto, se le suma el ASCII de la 'A'. LCD_FinVisualizaDigito goto LCD_Caracter ; Y visualiza el carácter. Se hace con un "goto" ; para no sobrecargar la pila. ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== LCD_MENS.INC ( Entrenador Básico 6 ) ;******************************************** Librería "LCD_MENS.INC" *********************************************** ; ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== ; ; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD. CBLOCK LCD_ApuntaCaracter LCD_ValorCaracter ENDC ; Indica la posición del carácter a visualizar ; respecto del comienzo de todos los mensajes, ; (posición de la etiqueta "Mensajes"). ; Código ASCII del carácter a ; visualizar. ; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la ; memoria de programa, es decir, no pueden superar la dirección 0FFh. ; *********************************************Subrutina "LCD_Mensaje" ********************************************** ; ; Visualiza por pantalla el mensaje apuntado por el registro W. ; ; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que ; tenga la siguiente estructura: ; ; Mensajes addwf PCL,F ; Etiqueta obligatoria! ; Mensaje0 DT "....", 0x00 ; Posición inicial del mensaje. ; ; Mensaje terminado en 0x00. ; Mensaje1 ;... ;... ; FinMensajes ; ; La llamada a esta subrutina se realizará siguiendo este ejemplo: ; 151

158 ; movlw Mensaje0 ; Carga la posición del mensaje. ; call LCD_Mensaje ; Visualiza el mensaje. ; LCD_Mensaje movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje. movlw Mensajes ; Halla la posición relativa del primer carácter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes". decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F". LCD_VisualizaOtroCaracter LCD_NoUltimoCaracter LCD_FinMensaje movf LCD_ApuntaCaracter,W call Mensajes ; Obtiene el código ASCII del carácter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carácter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto LCD_FinMensaje ; de mensaje, sale fuera. call LCD_Caracter ; Visualiza el carácter ASCII leído. incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter goto LCD_VisualizaOtroCaracter ; dentro del mensaje. return ; Vuelve al programa principal. ; ******************************* Subrutina "LCD_MensajeMovimiento" *********************************************** ; ; Visualiza un mensaje de mayor longitud que los 16 caracteres que pueden representarse ; en una línea, por tanto se desplaza a través de la pantalla. ; ; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para ; conseguir que el desplazamiento del mensaje sea lo más legible posible. ; CBLOCK LCD_CursorPosicion ; Contabiliza la posición del cursor dentro de la ENDC ; pantalla LCD LCD_MensajeMovimiento LCD_PrimeraPosicion movwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje. movlw Mensajes ; Halla la posición relativa del primer carácter subwf LCD_ApuntaCaracter,F ; del mensaje respecto de la etiqueta "Mensajes". decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F". clrf LCD_CursorPosicion ; El cursor en la posición 0 de la línea. call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y ; borra la pantalla. LCD_VisualizaCaracter movlw LCD_CaracteresPorLinea subwf LCD_CursorPosicion,W btfss STATUS,Z goto LCD_NoEsFinalLinea ; Ha llegado a final de línea? 152

159 LCD_EsFinalLinea call Retardo_100ms ; Lo mantiene visualizado durante este tiempo. ; call Retardo_200ms movlw LCD_CaracteresPorLinea-1 ; Apunta a la posición del segundo carácter subwf LCD_ApuntaCaracter,F ; visualizado en pantalla, que será el primero en la goto LCD_PrimeraPosicion ; siguiente visualización de línea, para producir el ; efecto de desplazamiento hacia la izquierda. LCD_NoEsFinalLinea LCD_NoUltimoCaracter2 movf LCD_ApuntaCaracter,W call Mensajes ; Obtiene el ASCII del carácter apuntado. movwf LCD_ValorCaracter ; Guarda el valor de carácter. movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso btfsc STATUS,Z ; que sea "0x00", que es código indicador final goto LCD_FinMovimiento ; de mensaje, sale fuera. call LCD_Caracter ; Visualiza el carácter ASCII leído. incf LCD_CursorPosicion,F ; Contabiliza el incremento de posición del ; cursor en la pantalla. incf LCD_ApuntaCaracter,F ; Apunta a la siguiente posición por visualizar. goto LCD_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter ; de la línea. LCD_FinMovimiento return ; Vuelve al programa principal. ; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López. ; Editorial Ra-Ma. ; =================================================================== 153

160 9.- Entrenador Básico 7 154

161 9.1.- Tecla_01.asm ( Entrenador Básico 7 ) title " La pantalla del LCD visualiza el orden de la tecla pulsada utilizando la técnica de polling" ;************************************** Tecla_01.asm ******************************************************************* ; El modulo LCD visualiza el orden de la tecla pulsada expresado en decimal. Utiliza ; técnica Polling o lectura constante del puerto al que esta conectado el teclado. ; ************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 GUARDA_TECLA ; Registro que guarda el orden de la tecla pulsada. ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ******************************************************** COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. ;************************************* Principal ************************************************************************** 155

162 Principal call Teclado_LeeOrdenTecla ; Lee el teclado. btfss STATUS,C ; Si se pulsa alguna tecla el Cy=1 y salta una instrucción. goto Fin ; No, por tanto sale. movwf GUARDA_TECLA ; Guarda el orden de la tecla pulsada. call Teclado_EsperaDejePulsar ; No sale hasta que levante el dedo. movf GUARDA_TECLA,W call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto ; Visualiza en pantalla. Fin goto Principal ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Tecla_02.asm ( Entrenador Básico 7 ) title " La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando la técnica de polling" ;************************************** Tecla_02.asm ******************************************************************* ; En pantalla aparece el valor hexadecimal de la tecla pulsada. Se esta leyendo constantemente ; el teclado mediante técnica Polling. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros *********************************************************************** 156

163 CBLOCK 0x20 GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. ;************************************* Principal ************************************************************************** Principal call Teclado_LeeHex ; Lee el teclado hexadecimal. btfss STATUS,C ; Si se pulsa alguna tecla el Cy=1 y salta una instrucción. goto Fin ; No, por tanto, sale. movwf GUARDA_TECLA ; Guarda el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; No sale hasta que levante el dedo. movf GUARDA_TECLA,W call LCD_Nibble ; Visualiza el valor en pantalla. Fin goto Principal ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Tecl_03.asm ( Entrenador Básico 7 ) title " La pantalla del LCD visualiza el valor hexadecimal de la tecla pulsada utilizando técnicas de interrupción " ;************************************************* Tecl_03.asm ********************************************************* ; El modulo LCD visualiza el valor hexadecimal de la tecla pulsada. Para la lectura del ; teclado se utiliza la interrupción RBI o por cambio en las líneas <RB7:RB4> del Puerto B. ; ************************************************************************************************************************** ;Programa para PIC 16F

164 ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;************************************** Registros ************************************************************************ CBLOCK 0x20 GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. 158

165 movwf GUARDA_TECLA ; Guarda el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter movf GUARDA_TECLA,W call LCD_Nibble ; Visualiza el valor en pantalla. movf PORTB,w ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF ; mientras permanece pulsado. Limpia flag. retfie ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Tecla_04.asm ( Entrenador Básico 7 ) title " La pantalla del LCD visualiza caracteres españoles en función de la tecla pulsada " ;************************************************** Tecla_04.asm ******************************************************* ; Supone un teclado con los 16 primeros caracteres del alfabeto español. Por tanto hay ; que cambiar la tabla respecto de los ejercicios anteriores. Lo que se va escribiendo por ; el teclado aparece en pantalla como si fuera un teclado alfabético. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;*************************************** Registros *********************************************************************** CBLOCK 0x20 GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset 159

166 GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************ ; La subrutina de atención a la interrupción obtiene el valor ASCII de la tecla pulsada. ; A continuación se expone la relaci0n entre el numero de orden de la tecla y los valores ; correspondientes para el teclado supuesto. ; ORDEN DE TECLA: TECLADO UTILIZADO: ; A B C D ; E F G H ; I J K L ; M N O P Interrupcall Teclado_LeeOrdenTecla ; Lee el Orden de la tecla pulsada movwf GUARDA_TECLA ; Guarda el orden de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GUARDA_TECLA,W call Tecl_ConvierteOrdenEnASCII ; Lo convierte en su valor ASCII mediante call LCD_Caracter ; una tabla, y lo visualiza. movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF ; Limpia flag. retfie ;************************************ Subrutina " Tecl_ConvierteOrdenEnASCII " ************************************ Tecl_ConvierteOrdenEnASCII addwf PCL,F ; Según el teclado utilizado resulta DT "ABCD" ; Primera fila del teclado. DT "EFGH" ; Segunda fila del teclado. DT "IJKL" ; Tercera fila del teclado. DT "MNÑO" ; Cuarta fila del teclado. ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> 160

167 INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Tecla_05.asm ( Entrenador Básico 7 ) title " La pantalla del LCD aparece un mensaje en movimiento y fijo en la primera línea " title " y en la segunda línea visualiza la tecla pulsada " ;************************************************* Tecla_05.asm ******************************************************** ; Primero aparece un mensaje de presentación en movimiento. Luego en la primera línea aparece ; un mensaje estático y lo que se va escribiendo por el teclado aparece en la segunda fila. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;*************************************** Registros *********************************************************************** CBLOCK 0x20 GUARDA_TECLA ; Registro que guarda el valor de la tecla pulsada. ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. 161

168 bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. movlw Mensaje presentación ; Visualiza el mensaje en movimiento. call LCD_MensajeMovimiento call LCD_Borra ; Borra la pantalla y se sitúa en la primera línea. movlw MensajePulsa ; Visualiza el mensaje fijo de la primera línea. call LCD_Mensaje call LCD_Linea2 ; Pasa a la segunda línea. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. movwf GUARDA_TECLA ; Guarda el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GUARDA_TECLA,W call LCD_Nibble ; Visualiza el valor en pantalla. movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF retfie ;******************************************* Subrutina de "Mensajes" ************************************************** Mensajes addwf PCL,F MensajePresentacion DT " " DT "Estudia Desarrollo de Productos Electrónicos" DT " ", 0x00 MensajePulsa DT "LUCAS, pulsa:", 0x00 ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Tecla_06.asm ( Entrenador Básico 7 ) title " La pantalla del LCD aparece la tecla pulsada primero " title " la línea 1 y después en la línea 2 repitiéndose el proceso " 162

169 ;************************************************* Tecla_06.asm ******************************************************** ; En pantalla aparecen el código de las teclas que se van pulsando. Cuando llega al final de la primera ; línea, pasa a la segunda línea. Cuando llega al final de la segunda línea borra todo y ; comienza de nuevo al principio de la línea 1. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** CaracteresUnaLinea EQU d'16' ; Numero de caracteres de una línea. CaracteresDosLineas EQU d'32' ; Numero de caracteres de dos líneas. ;************************************** Registros *********************************************************************** CBLOCK 0x20 GuardaTecla ContadorCaracteres ; Guarda el valor de la tecla pulsada. ; Guarda el numero de caracteres pulsados. ENDC ;*********************************** Sección Código de Reset ********************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 163

170 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON clrf ContadorCaracteres ; En principio no hay caracteres escritos. ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrup call Teclado_LeeHex ; Obtiene el valor de la tecla pulsada. movwf GuardaTecla ; Reserva el valor de la tecla pulsada. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GuardaTecla,W movlw CaracteresUnaLinea ; Comprueba si ha llegado al numero máximo de subwf ContadorCaracteres,W ; caracteres de una línea. btfsc STATUS,Z call LCD_Linea2 ; Se sitúa en la segunda línea. movlw CaracteresDosLineas ; Comprueba si ha llegado al numero máximo de subwf ContadorCaracteres,W ; caracteres de dos líneas. btfss STATUS,Z goto EscribeCaracter ; No, por tanto, sigue escribiendo. call LCD_Borra ; Si, borra pantalla e inicializa el contador. clrf ContadorCaracteres EscribeCaracter incf ContadorCaracteres,F ; Un nuevo carácter escrito. movf GuardaTecla,W call LCD_Nibble ; Visualiza el carácter en pantalla. movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF ; Limpia flag. retfie ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Tecla_07.asm ( Entrenador Básico 7 ) title " La pantalla del LCD aparece la tecla pulsada si esta es decimal " title " si se pulsa otra tecla borra pantalla " 164

171 ;***************************************** Tecla_07.asm **************************************************************** ; Los valores decimales que va escribiendo por el teclado aparecen en pantalla. Si pulsa cualquier ; otra tecla que no sea un numero decimal lo interpreta como tecla de borrado de pantalla. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ;*************************************** Registros *********************************************************************** CBLOCK 0x20 GuardaValor ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. 165

172 movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrup call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. movwf GuardaValor ; Guarda el valor leído. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf GuardaValor,W sublw 0x09 ; Comprueba si es mayor de 9. btfss STATUS,C goto BorraPantalla ; Si no es un carácter numérico salta a borrar. movf GuardaValor,W ; Recupera el valor leído y lo call LCD_Nibble ; visualiza en la pantalla. goto limpiar_flag BorraPantalla call LCD_Borra ; Borra la pantalla. limpiar_flag movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF retfie ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Tecla_08.asm ( Entrenador Básico 7 ) title " Suma el valor de tres teclas y aparece en el LCD " title " en decimal y hexadecimal " ;***************************************** Tecla_08.asm **************************************************************** ; Suma el valor de tres teclas pulsadas consecutivamente. En la primera línea de la pantalla del ; modulo LCD aparece en hexadecimal y en la segunda en decimal. Así por ejemplo, si pulsa ; "A", "6" y "F" en pantalla aparece: ; Hex: A+6+F=1F (Primera Línea) ; Dec: =31 (Segunda Línea) ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 ****************** 166

173 #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 *********************************************************************** ;************************************** Registros *********************************************************************** CBLOCK 0x20 ContadorTeclasPulsadas GuardaValor Operando1 Operando2 Operando3 Resultado ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call Teclado_Inicializa ; Configura las líneas del teclado. clrf ContadorTeclasPulsadas ; Resetea este contador. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;******************************* Macro "VisualizaHex" ****************************************************************** VisualizaHex MACRO Operando,Caracter movf GuardaValor,W ; Recupera el valor y lo visualiza. movwf Operando ; Lo guarda para sumar después. call LCD_Nibble ; Visualiza el valor en la pantalla 167

174 movlw Caracter call LCD_Caracter ; Visualiza el signo '+' o '-' según corresponda. incf ContadorTeclasPulsadas,F ENDM ;******************************* Macro "VisualizaDec" ****************************************************************** VisualizaDec MACRO Operando,Caracter movf Operando,W ; (Operando) -> (W) call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto ; Visualiza en pantalla. movlw Caracter ; A continuación signo '+' o '=' según corresponda. call LCD_Caracter ENDM ;************************************ Rutina de Interrupción "Interrup" ************************************************ Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. movwf GuardaValor ; Guarda el valor leído. call Teclado_EsperaDejePulsar ; Para que no se repita el mismo carácter. movf ContadorTeclasPulsadas,W ; Según el numero de tecla pulsada realiza una addwf PCL,F ; función distinta. goto PrimeraTeclaPulsada goto SegundaTeclaPulsada goto TerceraTeclaPulsada PrimeraTeclaPulsada call LCD_Borra ; Borra la pantalla anterior. movlw MensajeHex ; En pantalla el mensaje "Hex:" call LCD_Mensaje VisualizaHex Operando1,'+' goto FinInterrupcion SegundaTeclaPulsada VisualizaHex Operando2,'+' goto FinInterrupcion TerceraTeclaPulsada VisualizaHex Operando3,'=' movf Operando1,W ; Procede a la suma de los tres valores. addwf Operando2,W addwf Operando3,W movwf Resultado call LCD_Byte ; Visualiza el resultado. call LCD_Linea2 ; Ahora visualiza la segunda línea. movlw MensajeDec ; En pantalla el mensaje "Dec:" call LCD_Mensaje VisualizaDec Operando1,'+' VisualizaDec Operando2,'+' VisualizaDec Operando3,'=' VisualizaDec Resultado,' ' clrf ContadorTeclasPulsadas ; Resetea este contador. FinInterrupcion movf PORTB,W ; Necesario en proteus para limpiar flag. bcf INTCON,RBIF retfie ;************************************ Subrutina "Mensajes" ************************************************************* Mensajes addwf PCL,F 168

175 MensajeHex DT "Hex: ", 0x0 MensajeDec DT "Dec: ", 0x0 ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END Tecla_09.asm ( Entrenador Básico 7 ) title " Cerradura Electrónica " ;******************************************** Tecla_09.asm ************************************************************ ; Cerradura Electrónica: la salida se activa cuando una clave de varios dígitos introducida ; por teclado sea correcta. ; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos ; el electroimán de la cerradura permitiendo la apertura de la puerta: ; - Si (CerraduraSalida) = 1, la puerta se puede abrir. ; - Si (CerraduraSalida) = 0, la puerta no se puede abrir. ;Funcionamiento: ; - En pantalla visualiza "Introduzca CLAVE". Según se va escribiendo, visualiza asteriscos '*'. ; - Cuando termine de escribir la clave pueden darse dos posibilidades: ; - Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje ; "Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso. ; - Si la clave es correcta la cerradura se activa durante unos segundos y la puerta ; puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera línea) y "Abra ; la puerta" (segunda línea). Pasados unos segundos, se repite el proceso. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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. 169

176 ;************************************** Igualdades *********************************************************************** ; La clave puede tener cualquier tamaño y su longitud se calcula: #DEFINE LongitudClave #DEFINE CerraduraSalida (FinClaveSecreta-ClaveSecreta) PORTA,3 ;************************************** Registros *********************************************************************** CBLOCK 0x20 ContadorCaracteres GuardaClaveTecleada ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción. ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 bcf CerraduraSalida ; Define como salida. bcf STATUS,RP0 ; Ir al Banco 0. call LCD_Inicializa ; Inicializar el LCD. call InicializaTodo ; Inicializa el resto de los registros. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrup call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. ; Según va introduciendo los dígitos de la clave, estos van siendo almacenados a partir de ; las posiciones RAM "ClaveTecleada" mediante direccionamiento indirecto y utilizando el ; FSR como apuntador. Por cada dígito leído en pantalla se visualiza un asterisco. movwf INDF call Teclado_EsperaDejePulsar movlw '*' ; Almacena ese digito en memoria RAM con ; con direccionamiento indirecto apuntado por FSR. ; Visualiza asterisco. 170

177 call LCD_Caracter incf FSR,F ; Apunta a la próxima posición de RAM. incf ContadorCaracteres,F ; Cuenta el numero de teclas pulsadas. movlw LongitudClave ; Comprueba si ha introducido tantos caracteres subwf ContadorCaracteres,W ; como longitud tiene la clave secreta. btfss STATUS,C ; Ha terminado de introducir caracteres? goto Fin_Interr ; No, pues lee el siguiente carácter tecleado. ; Si ha llegado aquí es porque ha terminado de introducir el máximo de dígitos. Ahora ; procede a comprobar si la clave es correcta. Para ello va comparando cada uno de los ; dígitos almacenados en las posiciones RAM a partir de "ClaveTecleada" con el valor ; correcto de la clave almacenado en la posición ROM "ClaveSecreta". ; Para acceder a las posiciones de memoria RAM a partir de "ClaveTecleada" utiliza ; direccionamiento indirecto siendo FSR el apuntador. ; Para acceder a memoria ROM "ClaveSecreta" se utiliza direccionamiento indexado con el ; el registro ContadorCaracteres como apuntador. call LCD_Borra ; Borra la pantalla. clrf ContadorCaracteres ; Va a leer el primer carácter almacenado en ROM. movlw ClaveTecleada ; Apunta a la primera posición de RAM donde se ha movwf FSR ; guardado la clave tecleada. Comp_Claves movf INDF,W Lee la clave tecleada y guardada en RAM. movwf GuardaClaveTecleada ; La guarda para compararla después. movf ContadorCaracteres,W ; Apunta al carácter de ROM a leer. call LeeClaveSecreta ; En (W) el carácter de la clave secreta. subwf GuardaClaveTecleada,W ; Se comparan. btfss STATUS,Z ; Son iguales?, Z=1? goto ClaveIncorr ; No, pues la clave tecleada es incorrecta. incf FSR,F ; Apunta a la próxima posición de RAM. incf ContadorCaracteres,F ; Apunta a la próxima posición de ROM. movlw LongitudClave ; Comprueba si ha comparado tantos caracteres subwf ContadorCaracteres,W ; como longitud tiene la clave secreta. btfss STATUS,C ; Ha terminado de comparar caracteres? goto Comp_Claves ; No, pues compara el siguiente carácter. ClaveCorrecta movlw MensajeClaveCorrecta ; La clave ha sido correcta. Aparecen los mensajes call LCD_Mensaje ; correspondientes y permite la apertura de la ; puerta durante unos segundos. call LCD_Linea2 movlw MensajeAbraPuerta call LCD_Mensaje bsf CerraduraSalida ; Activa la cerradura durante unos segundos. goto Retardo ClaveIncorr movlw MensajeClaveIncorrecta call LCD_Mensaje goto Retardo1 Retardo call Retardo_2s Retardo1 call Retardo_500ms call InicializaTodo Fin_Interr movf PORTB,W bcf INTCON,RBIF 171

178 retfie ;*********************************** Subrutina "InicializaTodo" ******************************************************** InicializaTodo bcf CerraduraSalida ; Desactiva la cerradura. clrf ContadorCaracteres ; Inicializa este contador. movlw ClaveTecleada ; FSR apunta a la primera dirección de la RAM movwf FSR ; donde se va a almacenar la clave tecleada. call LCD_Borra ; Borra la pantalla. movlw MensajeTeclee ; Aparece el mensaje para que introduzca la clave. call LCD_Mensaje call LCD_Linea2 ; Los asteriscos se visualizan en la segunda línea. return ;************************************ Subrutina "Mensajes" ************************************************************* Mensajes addwf PCL,F MensajeTeclee DT "Teclee CLAVE:", 0x00 MensajeClaveCorrecta DT "Clave CORRECTA", 0x00 MensajeAbraPuerta DT "Abra la puerta", 0x00 MensajeClaveIncorrecta DT "Clave INCORRECTA", 0x00 ;************************************ Subrutina "LeeClaveSecreta" **************************************************** LeeClaveSecreta addwf PCL,F ClaveSecreta DT 4h,5h,6h,1h ; Ejemplo de clave secreta. DT 7h,8h FinClaveSecreta ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> ;***************************************** Dirección de comienzo del puntero FSR *********************************** ; Las posiciones de memoria RAM donde se guardara la clave leída se definen al final, después ; de las Librerías, ya que van a ocupar varias posiciones de memoria mediante el ; direccionamiento indirecto utilizado. CBLOCK ClaveTecleada ENDC END ; Fin del programa. 172

179 10.- Entrenador Básico

180 Tecla_10.asm ( Entrenador Básico 7-1 ) title " Cerradura Electrónica activando un motor PAP" ;******************************************** Tecla_09.asm ************************************************************* ; Cerradura Electrónica: la salida se activa cuando una clave de varios dígitos introducida ; por teclado sea correcta. ; Tiene una salida "CerraduraSalida" que, cuando se habilita, activa durante unos segundos ; el electroimán de la cerradura permitiendo la apertura de la puerta: ; - Si (CerraduraSalida) = 1, la puerta se puede abrir. ; - Si (CerraduraSalida) = 0, la puerta no se puede abrir. ;Funcionamiento: ; - En pantalla visualiza "Introduzca CLAVE". Según se va escribiendo, visualiza asteriscos '*'. ; - Cuando termine de escribir la clave pueden darse dos posibilidades: ; - Si la clave es incorrecta la cerradura sigue inactivada, en pantalla aparece el mensaje ; "Clave INCORRECTA" durante unos segundos y tiene que repetir de nuevo el proceso. ; - Si la clave es correcta la cerradura se activa durante unos segundos y la puerta ; puede ser abierta. En pantalla aparece: "Clave CORRECTA" (primera línea) y "Abra ; la puerta" (segunda línea). Pasados unos segundos, se repite el proceso. ;*************************************************************************************************************************** ;Programa para PIC 16F877. ;Velocidad del Reloj:1 MHz. ;Reloj instrucción: 250 KHz = 4 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 *********************************************************************** ; La clave puede tener cualquier tamaño y su longitud se calcula: #DEFINE LongitudClave (FinClaveSecreta-ClaveSecreta) ;************************************** Registros *********************************************************************** ; Las posiciones de memoria RAM donde se guardara la clave leída, se inicializa con una posición fija ; "ClaveTecleada", antes de las reservadas con las seudoinstrucciones CBLOCK, ya que van a ; ocupar varias posiciones de memoria mediante el direccionamiento indirecto. 174

181 ClaveTecleada equ 0x20 CBLOCK 0x30 ContadorCaracteres GuardaClaveTecleada ContadorPAP ENDC ;************************************* Sección Código de Reset ******************************************************* ORG 0 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;************************************* Vector de Interrupción *********************************************************** ORG 4 ;Dirección del Vector de Interrupción. GOTO Interrup ;Ir a rutina de Interrupción. ;*********************************** Sección de Configuración ********************************************************* COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como señales digitales. movwf ADCON1 clrf TRISD ; Poner el PORTD como salida de datos. clrf TRISC ; Poner el PORTC como salida de datos. bcf STATUS,RP0 ; Ir al Banco 0. movlw D'09' ; Inicializar el motor PAP en una posición inicial. movwf PORTC clrf ContadorPAP call LCD_Inicializa ; Inicializar el LCD. call InicializaTodo ; Inicializa el resto de los registros. call Teclado_Inicializa ; Configura las líneas del teclado. movlw b' ' ; Habilita la interrupción RBI y la general. movwf INTCON ;************************************* Principal ************************************************************************** Principal sleep ; Espera en modo bajo consumo que pulse teclado. goto Principal ;************************************ Rutina de Interrupción "Interrup" ************************************************* Interrupcall Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada. ; Según va introduciendo los dígitos de la clave, estos van siendo almacenados a partir de ; las posiciones RAM "ClaveTecleada" mediante direccionamiento indirecto y utilizando el ; FSR como apuntador. Por cada digito leído en pantalla se visualiza un asterisco. movwf INDF ; Almacena ese digito en memoria RAM con ; con direccionamiento indirecto apuntado por FSR. call Teclado_EsperaDejePulsar movlw '*' ; Visualiza asterisco. call LCD_Caracter incf FSR,F ; Apunta a la próxima posición de RAM. 175

182 incf ContadorCaracteres,F ; Cuenta el numero de teclas pulsadas. movlw LongitudClave ; Comprueba si ha introducido tantos caracteres subwf ContadorCaracteres,W ; como longitud tiene la clave secreta. btfss STATUS,C ; Ha terminado de introducir caracteres? goto Fin_Interr ; No, pues lee el siguiente carácter tecleado. ; Si ha llegado aquí es porque ha terminado de introducir el máximo de dígitos. Ahora ; procede a comprobar si la clave es correcta. Para ello va comparando cada uno de los ; dígitos almacenados en las posiciones RAM a partir de "ClaveTecleada" con el valor ; correcto de la clave almacenado en la posición ROM "ClaveSecreta". ; Para acceder a las posiciones de memoria RAM a partir de "ClaveTecleada" utiliza ; direccionamiento indirecto siendo FSR el apuntador. ; Para acceder a memoria ROM "ClaveSecreta" se utiliza direccionamiento indexado con el ; el registro ContadorCaracteres como apuntador. call LCD_Borra ; Borra la pantalla. clrf ContadorCaracteres ; Va a leer el primer carácter almacenado en ROM. movlw ClaveTecleada ; Apunta a la primera posición de RAM donde se ha movwf FSR ; guardado la clave tecleada. Comp_Claves movf INDF,W ; Lee la clave tecleada y guardada en RAM. movwf GuardaClaveTecleada ; La guarda para compararla después. movf ContadorCaracteres,W ; Apunta al carácter de ROM a leer. call LeeClaveSecreta ; En (W) el carácter de la clave secreta. subwf GuardaClaveTecleada,W ; Se comparan. btfss STATUS,Z ; Son iguales?, Z=1? goto ClaveIncorr ; No, pues la clave tecleada es incorrecta. incf FSR,F ; Apunta a la próxima posición de RAM. incf ContadorCaracteres,F ; Apunta a la próxima posición de ROM. movlw LongitudClave ; Comprueba si ha comparado tantos caracteres subwf ContadorCaracteres,W ; como longitud tiene la clave secreta. btfss STATUS,C ; Ha terminado de comparar caracteres? goto Comp_Claves ; No, pues compara el siguiente carácter. ClaveCorrecta movlw MensajeClaveCorrecta ; La clave ha sido correcta. Aparecen los mensajes call LCD_Mensaje ; correspondientes y permite la apertura de la ; puerta durante unos segundos. call LCD_Linea2 ; Mostrar mensaje "Espere por favor" movlw MensajeEsperar call LCD_Mensaje Abrir_puerta movf ContadorPAP,W ; Abrir puerta call codigos_pap movwf PORTC call Retardo_100ms movlw D'08' subwf ContadorPAP,W btfss STATUS,Z goto inc_cont_pap goto esperar inc_cont_pap incf ContadorPAP,F goto Abrir_puerta esperar bcf PORTD,1 ; Marcar el LED de Abierto. bsf PORTD,0 call LCD_Linea1 movlw MensajeAbraPuerta ; Mostrar mensaje "Abra la puerta" 176

183 call LCD_Mensaje call LCD_Linea2 movlw Tiempo1 ; Mostrar mensaje "Tienes 10 Seg." call LCD_Mensaje call Retardo_2s ; Retardo de 10 Seg. call LCD_Borra Cerrar_puerta bsf PORTD,1 ; Cerrar la puerta bcf PORTD,0 ; Marcar el LED de Cerrado. decf ContadorPAP,F sigui_codigo movf ContadorPAP,W call codigos_pap movwf PORTC call Retardo_100ms decfsz ContadorPAP,F goto sigui_codigo movf ContadorPAP,W call codigos_pap movwf PORTC call Retardo_100ms goto ir_inicializar ClaveIncorr movlw MensajeClaveIncorrecta ; Mostrar mensaje "Clave INCORRECTA" call LCD_Mensaje call Retardo_500ms ir_inicializar call InicializaTodo ; Inicializar proceso. movlw B' ' ; Necesario en proteus para que el teclado pueda interrumpir. movwf PORTB Fin_Interr movf PORTB,W ; Necesario en proteus para borrar el flag. bcf INTCON,RBIF retfie ;*********************************** Subrutina "InicializaTodo" ******************************************************** InicializaTodo bsf PORTD,1 ; Marcar el LED de Cerrado. bcf PORTD,0 clrf ContadorCaracteres ; Inicializa este contador. movlw ClaveTecleada ; FSR apunta a la primera direccion de la RAM movwf FSR ; donde se va a almacenar la clave tecleada. call LCD_Borra ; Borra la pantalla. movlw MensajeTeclee ; Aparece el mensaje para que introduzca la clave. call LCD_Mensaje call LCD_Linea2 ; Los asteriscos se visualizan en la segunda linea. return ;************************************ Subrutina "Mensajes" ************************************************************* Mensajes addwf PCL,F MensajeTeclee DT "Teclee CLAVE:", 0x00 MensajeClaveCorrecta DT "Clave CORRECTA", 0x00 MensajeAbraPuerta DT "Abra la puerta", 0x00 MensajeEsperar DT "Espere por favor", 0x00 MensajeClaveIncorrecta DT "Clave INCORRECTA", 0x00 177

184 Tiempo1 DT "Tienes 10 Seg. ", 0x00 ;************************************ Subrutina "LeeClaveSecreta" **************************************************** LeeClaveSecreta addwf PCL,F ClaveSecreta DT 4h,5h,6h,1h ; Ejemplo de clave secreta. DT 7h,8h FinClaveSecreta ;****************************************** Subrutina "Motor_PAP" ***************************************************** codigos_pap addwf PCL,F DT 09h,08h,0Ch,04h,06h,02h,03h,01h ; Secuencia de códigos para hacer ; funcionar el Motor PAP a medio paso. ;*********************************************** Librerías **************************************************************** INCLUDE <TECLADO.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END ; Fin del programa. 178

185 11.- Entrenador Básico 8 179

186

187 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' ' ; Escribimos la dirección del Esclavo1 receptor. ESCLAVO2 EQU B' ' ; 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. MOVLW ESCLAVO1 ; Seleccionar esclavo de recepción. ( 0100,A2,A1,A0,1 ) 179

188 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 MOVWF GUARDAR_DATO CALL ReStart_I2C ; Llamar a la subrutina de recepción de datos. ; Guardar dato recibido en el registro GUARDAR_DATO. ; 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 CALL Transmitir_dato_I2C CALL Bit_stop_I2C GOTO RECIBIR ; Complementar el contenido del registro GUARDAR_DATO ; y guardarlo en W. ; Llamar a la subrutina de transmisión de datos. ; Llamar a la subrutina de parada. ; Repetir proceso. ;*************************************************** LIBRERIAS ********************************************************* INCLUDE <I2C.INC> ; Librería de control de bus I2C. END 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. 180

189 ;************************************** Igualdades *********************************************************************** ESCLAVO1 EQU B' ' ; Escribimos la dirección del Esclavo1 receptor. ESCLAVO2 EQU B' ' ; 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. receptor. 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 CALL Recibir_dato_I2C MOVWF GUARDAR_DATO ; Llamar a la subrutina de recepción de datos. ; Guardar dato recibido en el registro GUARDAR_DATO. 181

190 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 CALL Transmitir_dato_I2C CALL Bit_stop_I2C BCF INTCON,INTF ; Complementar el contenido del registro GUARDAR_DATO ;y guardarlo en W. ; Llamar a la subrutina de transmisión de datos. ; Llamar a la subrutina de parada. ; 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 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' ' ; Escribimos la dirección del Esclavo1 transmisor. ESCLAVO2 EQU B' ' ; Escribimos la dirección del Esclavo2 transmisor. ;**************************** Registros ********************************************************************************** 182

191 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' ' MOVWF ADCON1 BCF STATUS,RP0 MOVLW B' ' MOVWF ADCON0 CALL Config_transmision_I2C ; Configuracion Bus_I2C ;**************************************************** Principal ********************************************************** SEG2 CALL Retardo_100ms ; Esperar un tiempo de adquisición de 100 ms. SEG1 BSF ADCON0,GO_DONE BTFSC ADCON0,GO_DONE GOTO SEG1 MOVF ADRESH,W SUBWF GUARDAR_DATO,W BTFSC STATUS,Z GOTO SEG2 MOVF ADRESH,W MOVWF GUARDAR_DATO CALL Bit_start_I2C ; Lanzar el Conversor Analogico/Digital. ; Preguntamos si el dato convertido es idéntico al anterior. ; Guardamos dato nuevo. ; 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 CALL Bit_start_I2C ; Llamar a la subrutina de parada. ; 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. ; (A2,A1,A0)=(000) por hardware. 183

192 ; El ultimo BIT a 0 para poner el C.I. PCF8476 como ; transmisor. COMF GUARDAR_DATO,W CALL Transmitir_dato_I2C CALL Bit_stop_I2C ; Complementar el contenido del registro GUARDAR_DATO ; y guardarlo en W. ; Llamar a la subrutina de transmisión de datos. ; Llamar a la subrutina de parada. GOTO SEG2 ;************************************************** LIBRERIAS ********************************************************** INCLUDE <I2C.INC> INCLUDE <Retardos.INC> END 184

193

194 12.- Entrenador Básico

195 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' ' ESCLAVO2 EQU B' ' ESCLAVO3 EQU B' ' ESCLAVO4 EQU B' ' ; Escribimos la dirección del Esclavo1 receptor. ; Escribimos la dirección del Esclavo2 receptor. ; Escribimos la dirección del Esclavo3 transmisor. ; 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 ;**************************************************** Principal ********************************************************** 187

196 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 CALL Bit_start_I2C ; Llamar a la subrutina de parada. ; 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 I2C5.asm ( Entrenador Básico 8-1 ) 188

197 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' ' ESCLAVO2 EQU B' ' ESCLAVO3 EQU B' ' ESCLAVO4 EQU B' ' ; Escribimos la dirección del Esclavo1 receptor. ; Escribimos la dirección del Esclavo2 receptor. ; Escribimos la dirección del Esclavo3 transmisor. ; 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 COMIENZO CALL Config_transmision_I2C ; Configuracion Bus_I2C 189

198 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 MOVWF GUARDAR_DATO CALL ReStart_I2C ; Llamar a la subrutina de recepción de datos. ; Guardar dato recibido en el registro GUARDAR_DATO. ; 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 CALL Bit_start_I2C ; Llamar a la subrutina de parada. ; 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 MOVWF GUARDAR_DATO CALL ReStart_I2C ; Llamar a la subrutina de recepción de datos. ; Guardar dato recibido en el registro GUARDAR_DATO. ; 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 190

199 ; 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. END 191

200 13.- Entrenador Básico 9 192

201 I2C6.asm ( Entrenador Básico 9 ) title " Leer constantemente la entrada analogica ANI0 del Esclavo 1 (PCF8591) " title " y visualiza la tension en la pantalla del modulo LCD." ;******************************************** I2C6.asm ****************************************************************** ;Programa para PIC 16F876. ;Velocidad del Reloj:1 MHz. ;Reloj instruccion: 250 KHz = 4 us. ;Perro Guardian deshabilitado. ;Tipo de Reloj XT. ;Proteccion de Codigo: OFF. ;************************************** Elegimos PIC ******************************************************************** list p=16f876, f=inhx32 ;******************** Asignacion de nombres de Registros de Funciones especiales a direcciones ************** #include <p16f876.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_Escritura_sensor EQU b' ' Esclavo1_Lectura_sensor EQU b' ' ;**************************** Registros ********************************************************************************* CBLOCK 0X20 Auxiliar ENDC ;**************************** Seccion Codigo de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Direccion del Vector Reset ;Comienzo del Programa ;*************************************** Seccion de Configuracion ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como senales digitales. movwf ADCON1 bcf STATUS,RP0 call LCD_Inicializa ; Inicializar el LCD. 193

202 call Config_transmision_I2C ; Configuracion Bus_I2C call Bit_start_I2C ; Llamar a la subrutina de Comienzo de I2C. movlw Esclavo1_Escritura_sensor call Transmitir_dato_I2C ; Seleccionar PCF8591 Transmisor. ( 1001,A2,A1,A0,0 ) ;(1001) identifica al C.I. PCF8591. ;(A2,A1,A0)=(111) por hardware. ;El ultimo bit a 0 para poner el C.I. PCF8591 como transmisor. movlw b' ' ; Carga la palabra de control utilizando la call Transmitir_dato_I2C ; entrada AIN0 en modo simple. call ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. movlw Esclavo1_Lectura_sensor call Transmitir_dato_I2C ; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1) ;(1001) identifica al C.I. PCF8591. ;(A2,A1,A0)=(111) por hardware. ;El ultimo bit a 1 para poner el C.I. PCF8591 como receptor. call Recibir_dato_I2C ; Llamar a la subrutina de recepcion de datos y leemos la entrada analógica. ; La primera lectura es incorrecta y por lo tanto la desecha. call Bit_stop_I2C ; Llamar a la subrutina de parada. call LCD_Linea1 ; Se sitúa al principio de la primera línea. movlw Mensaje1 ; Visualiza el Mensaje1 call LCD_Mensaje ;**************************************************** Principal ********************************************************** Principal call Bit_start_I2C ; Llamar a la subrutina de Comienzo de I2C. movlw Esclavo1_Lectura_sensor ; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1) CALL Transmitir_dato_I2C ;(1001) identifica al C.I. PCF8591. ;(A2,A1,A0)=(111) por hardware. ;El ultimo bit a 1 para poner el C.I. PCF8591 como receptor. call Recibir_dato_I2C ; Llamar a la subrutina de recepción de datos y leemos la entrada analógica. call Bit_stop_I2C ; Llamar a la subrutina de parada. call Visualiza ; LLamar a la subrutina Visualiza. goto Principal ;********************************************** Subrutinas "Visualiza" ************************************************** ; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tensión. ; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolución de ; LSB=10mV, el valor de entrada será 10 veces menor que la tensión real expresada en ; milivoltios. Así por ejemplo, si (W)=147 el valor de la tensión será igual a: ; VAIN = LSB x Digital = 10 x 147 = 1470 mv = 1,47 V, que es lo que se debe visualizar ; en la pantalla. ; En conclusión: 194

203 ; - Las centenas del valor de entrada corresponden a las unidades de voltio. ; - Las decenas del valor de entrada corresponden a las décimas de voltio. ; - Las unidades del valor de entrada corresponden a las centésimas de voltios. Visualiza movwf Auxiliar ; Lo guarda. call LCD_Linea2 ; Se sitúa al principio de la primera línea. movlw MensajeTension ; Visualiza la tensión deseada. call LCD_Mensaje movf Auxiliar,W ; Recupera el dato a visualizar y lo call BIN_a_BCD ; pasa a BCD. movf BCD_Centenas,W ; Visualiza las centenas que corresponden a las call LCD_Nibble ; unidades de voltios. movlw '.' ; Visualiza el punto decimal. call LCD_Caracter movf BCD_Decenas,W ; Visualiza las decenas que corresponden a las call LCD_Nibble ; décimas de voltios. movf BCD_Unidades,W ; Visualiza las unidades que corresponden a las call LCD_Nibble ; centésimas de voltios. movlw MensajeVoltios call LCD_Mensaje return ;*********************************** Subrutina "Mensajes" ************************************************************** Mensajes addwf PCL,F MensajeTension MensajeVoltios Mensaje1 DT " Ve = ", 0x00 DT " V ", 0x00 DT "Señal del Sensor", 0X00 ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <I2C.INC> END I2C7.asm ( Entrenador Básico 9 ) 195

204 title " En la salida analogica del Esclavo 2 (PCF8591) que trabaja como DAC se obtiene una tension seleccionada " title " por un pulsador conectado a la linea RB6 del PIC. La tension varia entre 0,50 y 2,50 V en " title " saltos de 0,25 V y se visualiza en el modulo LCD." ;******************************************** I2C7.asm ****************************************************************** ;Programa para PIC 16F876. ;Velocidad del Reloj:1 MHz. ;Reloj instruccion: 250 KHz = 4 us. ;Perro Guardian deshabilitado. ;Tipo de Reloj XT. ;Proteccion de Codigo: OFF. ;************************************** Elegimos PIC ******************************************************************** list p=16f876, f=inhx32 ;****************** Asignacion de nombres de Registros de Funciones especiales a direcciones **************** #include <p16f876.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 *********************************************************************** PCF8591_DireccionEscritura EQU b' ' #DEFINE IncrementarPulsador PORTB,6 ;**************************** Registros ********************************************************************************* CBLOCK 0X20 ENDC ;**************************** Seccion Codigo de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de Interrupcion ******************************************************************** ORG 0x04 GOTO Interrup ;**************************** Libreria de Mensajes ********************************************************************* 196

205 ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) Mensajes addwf PCL,F MensajeTension MensajeVoltios DT "Tension: ", 0x00 DT " V. ", 0x00 ;*************************************** Seccion de Configuracion ***************************************************** COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como senales digitales. movwf ADCON1 bcf STATUS,RP0 call LCD_Inicializa call Config_transmision_I2C ; Configuracion Bus_I2C bsf STATUS,RP0 bsf IncrementarPulsador ; Se configura como entrada. bcf STATUS,RP0 call CargaInicialContador ; Realiza la carga inicial del contador. call PCF8591_DAC ; Lo envia al DAC para su conversion. call Visualiza ; Y lo visualiza en la pantalla. movlw b' ' movwf INTCON ; Activa interrupcion por cambio en las ; lineas del Puerto B (RBIE) y la general (GIE). ;**************************************************** Principal ********************************************************** Principal sleep ; Pasa a modo de reposo. goto Principal ;*********************************************Rutina de Interrupcion **************************************************** ; Incrementa el registro Contador cada vez que se presiona el pulsador "INCREMENTAR". ; Como el PCF8591 del esquema trabaja con una resolucion de LSB=10mV el valor del (Contador) ; sera 10 veces menor que la tension analogica deseada a la salida expresada en milivoltios. ; Asi por ejemplo, si (Contador)=147 el valor de la tension de salida sera igual a: ; VOUT = LSB x Digital = 10 x 147 = 1470 mv = 1,47 V. Interrupcall Retardo_20ms ; Espera a que se estabilicen los niveles de tension. btfsc IncrementarPulsador ; Si es un rebote sale fuera. goto FinInterrupcion IncrementarTensionDeseada call IncrementaContador ; Aumenta el valor del contador. call PCF8591_DAC ; Lo envia al DAC para su conversion. call Visualiza ; Visualiza mientras espera que deje call Retardo_100ms ; de pulsar durante este tiempo. btfss IncrementarPulsador ; Mientras permanezca pulsado goto IncrementarTensionDeseada ; incrementara el digito. FinInterrupcion movf PORTB,W 197

206 bcf retfie INTCON,RBIF ;**************************************** Subrutina "PCF8591_DAC" ************************************************** ; Escribe en el PCF8591 con el dato del registro W para su conversion a tension analagica. CBLOCK PCF8591_Dato ENDC PCF8591_DAC movwf PCF8591_Dato ; Guarda el dato que tiene que enviar. ; Guarda el dato a enviar. call Bit_start_I2C ; Llamar a la subrutina de Comienzo de I2C. movlw PCF8591_DireccionEscritura ; Apunta al dispositivo. CALL Transmitir_dato_I2C movlw b' ' ; Carga la palabra de control activando la call Transmitir_dato_I2C ; salida analogica. movf PCF8591_Dato,W ; Escribe el dato dos veces para que la call Transmitir_dato_I2C ; conversion sea correcta tal como se indica en el manual. movf PCF8591_Dato,W ; los cronogramas del fabricante. call Transmitir_dato_I2C call Bit_stop_I2C movf PCF8591_Dato,W ; En (W) se recupera de nuevo el dato de entrada. return ;************************** Subrutinas "IncrementaContador" y "CargaInicialContador" **************************** CBLOCK Contador ENDC ValorMinimo EQU d'50' ; El valor minimo de tension sera 0,5 V. ValorMaximo EQU d'250' ; El valor maximo de tension sera 2,5 V. SaltoIncremento EQU d'25' ; El incremento se producira en saltos de 0,25 V. IncrementaContador movlw SaltoIncremento ; Incrementa el valor deseado. addwf Contador,F btfsc STATUS,C ; Si se desborda realiza la carga inicial. goto CargaInicialContador movf Contador,W ; Ha llegado a su valor maximo? sublw ValorMaximo ; (W) <- ValorMaximo - (Contador). btfsc STATUS,C ; Si ValorMaximo<(Contador) C=0 y (W) negativo goto FinIncrementar ; No, resulta ValorMaximo>=(Contador) y sale. CargaInicialContador movlw ValorMinimo ; Si, entonces inicializa el registro. movwf Contador FinIncrementar movf Contador,W ; En (W) el resultado. return ;****************************************** Subrutinas "Visualiza" ***************************************************** ; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tension. ; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolucion de LSB=10mV, ; el valor de entrada sera 10 veces menor que la tension real expresada en milivoltios. ; Asi por ejemplo, si (W)=147 el valor de la tension sera igual a: VOUT = LSB x Digital = 198

207 ; = 10 x 147 = 1470 mv = 1,47 V, que es lo que se debe visualizar en la pantalla. ; En conclusion: ; - Las centenas del valor de entrada corresponden a las unidades de voltio. ; - Las decenas del valor de entrada corresponden a las decimas de voltio. ; - Las unidades del valor de entrada corresponden a las centesimas de voltios. CBLOCK Auxiliar ENDC Visualiza movwf Auxiliar ; Lo guarda. call LCD_Linea1 ; Se situa al principio de la primera linea. movlw MensajeTension ; Visualiza la tension deseada. call LCD_Mensaje movf Auxiliar,W ; Recupera el dato a visualizar y lo call BIN_a_BCD ; pasa a BCD. movf BCD_Centenas,W ; Visualiza las centenas que corresponden a las call LCD_Nibble ; unidades de voltios. movlw '.' ; Visualiza el punto decimal. call LCD_Caracter movf BCD_Decenas,W ; Visualiza las decenas que corresponden a las call LCD_Nibble ; decimas de voltios. movf BCD_Unidades,W ; Visualiza las unidades que corresponden a las call LCD_Nibble ; centesimas de voltios. movlw MensajeVoltios call LCD_Mensaje return ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <I2C1.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> END I2C8.asm ( Entrenador Básico 9 ) title " Leer constantemente la entrada analogica ANI0 del Esclavo 1(PCF8591), llevarla al Esclavo 2(PCF8591) " title " y visualiza la tension en la pantalla del modulo LCD." ;******************************************** I2C8.asm ****************************************************************** ;Programa para PIC 16F876. ;Velocidad del Reloj:1 MHz. ;Reloj instruccion: 250 KHz = 4 us. ;Perro Guardian deshabilitado. ;Tipo de Reloj XT. ;Proteccion de Codigo: OFF. ;************************************** Elegimos PIC ******************************************************************** 199

208 list p=16f876, f=inhx32 ;**************** Asignacion de nombres de Registros de Funciones especiales a direcciones ****************** #include <p16f876.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_Escritura_sensor EQU b' ' Esclavo1_Lectura_sensor EQU b' ' Esclavo2_Escritura EQU b' ' ;**************************** Registros ********************************************************************************* CBLOCK 0X20 Auxiliar Dato_ADC Dato_DAC ENDC ;**************************** Seccion Codigo de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Seccion de Configuracion ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion COMIENZO clrf PORTA ; Reseteamos el PORTA. bsf STATUS,RP0 ; Ir al Banco 1. movlw 0x06 ; Poner el PORTA como senales digitales. movwf ADCON1 bcf STATUS,RP0 call LCD_Inicializa ; Inicializar el LCD. call Config_transmision_I2C ; Configuracion Bus_I2C call Bit_start_I2C ; Llamar a la subrutina de Comienzo de I2C. movlw Esclavo1_Escritura_sensor call Transmitir_dato_I2C ;Seleccionar PCF8591 Transmisor. ( 1001,A2,A1,A0,0 ) ;(1001) identifica al C.I. PCF8591. ;(A2,A1,A0)=(111) por hardware. ;El ultimo bit a 0 para poner el C.I. PCF8591 como transmisor. 200

209 movlw b' ' ; Carga la palabra de control utilizando la call Transmitir_dato_I2C ; entrada AIN0 en modo simple. call ReStart_I2C ; Llamar a la subrutina de comenzar sin pasar por parada. movlw Esclavo1_Lectura_sensor call Transmitir_dato_I2C ; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1) ; (1001) identifica al C.I. PCF8591. ; (A2,A1,A0)=(111) por hardware. ; El ultimo bit a 1 para poner el C.I. PCF8591 como receptor. call Recibir_dato_I2C ; Llamar a la subrutina de recepcion de datos y leemos la entrada analogica. ; La primera lectura es incorrecta y por lo tanto la desecha. call Bit_stop_I2C ; Llamar a la subrutina de parada. call LCD_Linea1 ; Se situa al principio de la primera linea. movlw Mensaje1 ; Visualiza el Mensaje1 call LCD_Mensaje ;**************************************************** Principal ********************************************************** Principal call Bit_start_I2C ; Llamar a la subrutina de Comienzo de I2C. movlw Esclavo1_Lectura_sensor ; Seleccionar PCF8591 Receptor. (1001,A2,A1,A0,1) CALL Transmitir_dato_I2C ; (1001) identifica al C.I. PCF8591. ; (A2,A1,A0)=(111) por hardware. ; El ultimo bit a 1 para poner el C.I. PCF8591 como receptor. call Recibir_dato_I2C ; Llamar a la subrutina de recepcion de datos y leemos la entrada analogica. call Bit_stop_I2C ; Llamar a la subrutina de parada. movwf Dato_ADC call Visualiza ; LLamar a la subrutina Visualiza. movf Dato_ADC,w call Esclavo2_DAC goto Principal ;********************************************** Subrutinas "Visualiza" ************************************************** ; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tension. ; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolucion de ; LSB=10mV, el valor de entrada sera 10 veces menor que la tension real expresada en ; milivoltios. Asi por ejemplo, si (W)=147 el valor de la tension sera igual a: ; VAIN = LSB x Digital = 10 x 147 = 1470 mv = 1,47 V, que es lo que se debe visualizar ; en la pantalla. ; En conclusion: ; - Las centenas del valor de entrada corresponden a las unidades de voltio. ; - Las decenas del valor de entrada corresponden a las décimas de voltio. ; - Las unidades del valor de entrada corresponden a las centésimas de voltios. Visualiza movwf Auxiliar ; Lo guarda. call LCD_Linea2 ; Se situa al principio de la primera linea. movlw MensajeTension ; Visualiza la tension deseada. 201

210 call LCD_Mensaje movf Auxiliar,W ; Recupera el dato a visualizar y lo call BIN_a_BCD ; pasa a BCD. movf BCD_Centenas,W ; Visualiza las centenas que corresponden a las call LCD_Nibble ; unidades de voltios. movlw '.' ; Visualiza el punto decimal. call LCD_Caracter movf BCD_Decenas,W ; Visualiza las decenas que corresponden a las call LCD_Nibble ; décimas de voltios. movf BCD_Unidades,W ; Visualiza las unidades que corresponden a las call LCD_Nibble ; centésimas de voltios. movlw MensajeVoltios call LCD_Mensaje return ;*********************************** Subrutina "Mensajes" ************************************************************** Mensajes addwf PCL,F MensajeTension DT " Ve = ", 0x00 MensajeVoltios DT " V ", 0x00 Mensaje1 DT "Señal del Sensor", 0X00 ;**************************************** Subrutina "Esclavo2_DAC " ************************************************** ; Escribe en el Esclavo 2 con el dato del registro W para su conversion a tension analagica. Esclavo2_DAC movwf Dato_DAC ; Guarda el dato a enviar. call Bit_start_I2C ; Llamar a la subrutina de Comienzo de I2C. movlw Esclavo2_Escritura ; Apunta al dispositivo. CALL Transmitir_dato_I2C movlw b' ' ; Carga la palabra de control activando la call Transmitir_dato_I2C ; salida analogica. movf Dato_DAC,W ; Escribe el dato dos veces para que la call Transmitir_dato_I2C ; conversion sea correcta tal como se indica movf Dato_DAC,W ; los cronogramas del fabricante. call Transmitir_dato_I2C call Bit_stop_I2C return ;*************************************************** LIBRERIAS ********************************************************* INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <I2C1.INC> END I2C.INC ( Entrenador Básico 9 ) 202

211 title "Libreria de Transmision y recepcion de datos con I2C " Config_transmision_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF TRISC,4 BSF TRISC,3 MOVLW 0X09 MOVWF SSPADD BCF STATUS,RP0 ; Cargas 09H en el registro SSPADD La velocidad de Transmision sera de 100 KHz ; Seleciono la pagina 0 de la memoria BCF PIR1,SSPIF BSF SSPCON,SSPM3 BCF SSPCON,SSPM2 BCF SSPCON,SSPM1 BCF SSPCON,SSPM0 BSF SSPCON,SSPEN ; I2C en modo maestro con una F de Tr. = Fosc/(4*(SSPADD+1)) ; Permites la configuracion serie de los pines SDA y SCL. GOTO VOLVER Bit_start_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF SSPCON2,SEN ; Lanzamos el bit de START. BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF ; Seleciono la pagina 0 de la memoria GOTO VOLVER Transmitir_dato_I2C MOVWF SSPBUF ; Transmitimos el dato al Esclavo BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF BSF STATUS,RP0 ; Seleciono la pagina 0 de la memoria ; Seleciono la pagina 1 de la memoria BTFSS SSPCON2,ACKSTAT ; Si el esclavo pone ACKSTAT = 0 la transmision es correcta, ; Si no hay respuesta del esclavo enviamos STOP. GOTO Trans_correcta GOTO Bit_stop_I2C Trans_correcta BCF STATUS,RP0 ; Seleciono la pagina 0 de la memoria GOTO VOLVER Recibir_dato_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF SSPCON2,RCEN ; Permito la Recepcion de datos 203

212 BCF STATUS,RP0 ; Seleciono la pagina 0 de la memoria BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF MOVF SSPBUF,W BSF STATUS,RP0 BSF SSPCON2,ACKDT BSF SSPCON2,ACKEN BCF STATUS,RP0 ; Dato recibido en el registro SSPBUF ; Seleciono la pagina 1 de la memoria ; Pone el maestro el bit de reconocimiento de que ha llegado el Dato. ; Permito que el bit de reconocimiento este activo. ; Seleciono la pagina 0 de la memoria BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF GOTO VOLVER Bit_stop_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF SSPCON2,PEN BCF STATUS,RP0 ; Seleciono la pagina 0 de la memoria BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF GOTO VOLVER ReStart_I2C BSF STATUS,RP0 BSF SSPCON2,RSEN BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF VOLVER RETURN I2C1.INC ( Entrenador Básico 9 ) 204

213 title " Libreria de Transmision y recepcion de datos con I2C1 " title " En la subrutina (Transmitir_dato_I2C) el Esclavo no confirma la transmision " Config_transmision_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF TRISC,4 BSF TRISC,3 MOVLW 0X09 MOVWF SSPADD BCF STATUS,RP0 ; Cargas 09H en el registro SSPADD La velocidad de Transmision sera de 100 KHz ; Seleciono la pagina 0 de la memoria BCF PIR1,SSPIF BSF SSPCON,SSPM3 BCF SSPCON,SSPM2 BCF SSPCON,SSPM1 BCF SSPCON,SSPM0 ; I2C en modo maestro con una F de Tr. = Fosc/(4*(SSPADD+1)) BSF SSPCON,SSPEN ; Permites la configuracion serie de los pines SDA y SCL. GOTO VOLVER Bit_start_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF SSPCON2,SEN ; Lanzamos el bit de START. BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF ; Seleciono la pagina 0 de la memoria GOTO VOLVER Transmitir_dato_I2C MOVWF SSPBUF ; Transmitimos el dato al Esclavo BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF ; Seleciono la pagina 0 de la memoria GOTO VOLVER Recibir_dato_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF SSPCON2,RCEN ;Permito la Recepcion de datos BCF STATUS,RP0 ; Seleciono la pagina 0 de la memoria BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF MOVF SSPBUF,W BSF STATUS,RP0 ; Dato recibido en el registro SSPBUF ; Seleciono la pagina 1 de la memoria 205

214 llegado el Dato. BSF SSPCON2,ACKDT BSF SSPCON2,ACKEN BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF GOTO VOLVER ; Pone el maestro el bit de reconocimiento de que ha ; Permito que el bit de reconocimiento este activo. ; Seleciono la pagina 0 de la memoria Bit_stop_I2C BSF STATUS,RP0 ; Seleciono la pagina 1 de la memoria BSF SSPCON2,PEN BCF STATUS,RP0 ; Seleciono la pagina 0 de la memoria BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF GOTO VOLVER ReStart_I2C BSF STATUS,RP0 BSF SSPCON2,RSEN BCF STATUS,RP0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF VOLVER RETURN 206

215 14.- Entrenador Básico

216 RTS232_1.asm ( Entrenador Básico 10 ) title " En la pantalla del modulo LCD se visualizaran los caracteres que se reciban " title " a través del puerto serie del ordenador. Lo que se escriba por el teclado del " title " ordenador aparecerá en la pantalla del sistema con microcontrolador." ;************************************************* RTS232_1.asm ****************************************************** ; Se utilizara un programa de comunicaciones para que el ordenador pueda enviar datos a través ; de su puerto serie. Este programa puede ser el Hyperterminal de Windows o alguno similar. ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F876.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. ;**************************** Registros ********************************************************************************* CBLOCK 0x20 ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) COMIENZO BSF STATUS,RP0 ; Poner el Puerto A como señales digitales. MOVLW D'06' MOVWF ADCON1 BCF STATUS,RP0 call LCD_Inicializa ; Inicializa el LCD y las líneas que se call RS232_Inicializa ; van a utilizar en la comunicación con el puerto ; serie RS

217 ;**************************************************** Principal ********************************************************** Principal call RS232_LeeDato ; Espera recibir un caracter. call LCD_Caracter ; Lo visualiza. goto Principal ; Repite el proceso. ;*************************************************** LIBRERIAS ********************************************************* INCLUDE <RS232_RT.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> ; Subrutinas de control de la comunicación con el ; puerto serie RS232 del ordenador. END RTS232_2.asm ( Entrenador Básico 10 ) title " En el modulo LCD se visualizan los caracteres que se escriban en el teclado " title " del ordenador y se transmiten a través de su puerto serie. Estos datos " title " volverán a ser enviados por el microcontrolador al ordenador, para que se title " visualicen en su monitor." ;************************************************** RTS232_2.asm ***************************************************** ; Se utilizara un programa de comunicaciones para que el ordenador pueda enviar datos ; a través de su puerto serie, como el HyperTerminal de Windows o alguno similar. ; Concluyendo, lo que se escriba en el teclado del ordenador aparecerá en la pantalla del ; modulo LCD y en el monitor del HyperTerminal. ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F876.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. ;**************************** Registros ********************************************************************************* CBLOCK 0x20 GuardaDato ENDC 209

218 ;************************* Sección Código de Reset ******************************************************************* ORG 0X00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;************************************* Sección de Configuración ******************************************************* ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) COMIENZO BSF STATUS,RP0 ; Poner el Puerto A como señales digitales. MOVLW D'06' MOVWF ADCON1 BCF STATUS,RP0 call LCD_Inicializa ; Inicializa el LCD y las líneas que se call RS232_Inicializa ; van a utilizar en la comunicación con el puerto ; serie RS232. ;**************************************************** Principal ********************************************************** Principal call RS232_LeeDato ; Espera recibir un caracter. movwf GuardaDato ; Guarda el dato recibido. call LCD_Caracter ; Lo visualiza. movf GuardaDato,W ; Y ahora lo reenvía otra vez al ordenador. call RS232_EnviaDato goto Principal ; Repite el proceso. ;*************************************************** LIBRERIAS ********************************************************* INCLUDE <RS232_RT.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END RTS232_3.asm ( Entrenador Básico 10 ) title " Lo que se escriba por el teclado se visualiza en el LCD y en el monitor del " title " ordenador, pero en este ultimo se visualiza un solo carácter por línea." ;************************************************ RTS232_3.asm ******************************************************* ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f

219 ;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* INCLUDE <P16F876.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 ******************************************************************************** RetornoCarro EQU d'13' ; Codigo de tecla "Enter" o "Retorno de Carro". ;**************************** Registros ********************************************************************************* CBLOCK 0x20 GuardaDato ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) COMIENZO BSF STATUS,RP0 ; Poner el Puerto A como señales digitales. MOVLW D'06' MOVWF ADCON1 BCF STATUS,RP0 call LCD_Inicializa ; Inicializa el LCD y las líneas que se call RS232_Inicializa ; van a utilizar en la comunicación con el puerto ; serie RS232. ;**************************************************** Principal ********************************************************** Principal call RS232_LeeDato ; Espera recibir un caracter. movwf GuardaDato ; Guarda el dato recibido. call LCD_Caracter ; Lo visualiza. movf GuardaDato,W ; Y ahora lo reenvía otra vez al ordenador. call RS232_EnviaDato movlw RetornoCarro ; Ahora el cursor se sitúa al principio de la call RS232_EnviaDato ; línea siguiente en la pantalla del ordenador. goto Principal ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RS232_RT.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END 211

220 RTS232_4.asm ( Entrenador Básico 10 ) title " En el modulo LCD se visualizan los caracteres que se escriben en el teclado " title " del ordenador. Si pulsa la tecla Enter se comienza a escribir en la segunda " title " línea de la pantalla del modulo LCD. " ;************************************************ RTS232_4.asm ******************************************************* ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instruccion: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F876.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 ******************************************************************************** RetornoCarro EQU d'13' ; Codigo la de tecla "Enter". CambioLinea EQU d'10' ; Codigo para el "Cambio de linea". ;**************************** Registros ********************************************************************************* CBLOCK 0x20 GuardaDato ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) COMIENZO BSF STATUS,RP0 ; Poner el Puerto A como señales digitales. MOVLW D'06' MOVWF ADCON1 BCF STATUS,RP0 call LCD_Inicializa call RS232_Inicializa 212

221 ;**************************************************** Principal ********************************************************** Principal call RS232_LeeDato ; Espera recibir un caracter. movwf GuardaDato ; Guarda el dato recibido. sublw RetornoCarro ; Comprueba si ha pulsado la tecla Enter. btfsc STATUS,Z goto SaltaLinea2 ; Si, es Enter y por tanto salta a la linea 2. movf GuardaDato,W ; No es Enter y por tanto lo visualiza call LCD_Caracter ; en el LCD. goto Env_Carac_a_Ordenador SaltaLinea2 call LCD_Linea2 ; Situar el Cursor en la Lina 2 del LCD. call RS232_EnviaDato movlw CambioLinea ; no lo visualiza en el LCD. En el monitor del call RS232_EnviaDato ; ordenador se debe apreciar también un cambio ; de línea. Env_Carac_a_Ordenador movf GuardaDato,W ; Y ahora lo reenvía otra vez al ordenador. call RS232_EnviaDato goto Principal ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RS232_RT.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END RTS232_5.asm ( Entrenador Básico 10 ) title " Este programa envía un mensaje grabado en la memoria de programa del " title " microcontrolador al ordenador. Es decir, en el monitor del ordenador " title " aparecerá el mensaje grabado en el PIC." ;************************************************** RTS232_5.asm ***************************************************** ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F876.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. 213

222 ;**************************** Igualdades ******************************************************************************** RetornoCarro EQU d'13' ; Codigo de tecla "Enter" o "Retorno de Carro". ;**************************** Registros ********************************************************************************* CBLOCK 0x20 ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) COMIENZO call LCD_Inicializa ; Inicializa el modulo LCD y las líneas que se van a call RS232_Inicializa ; utilizar en la comunicación con el puerto serie RS232. ;**************************************************** Principal ********************************************************** Principal movlw Mensaje0 ; Carga la primera posicion del mensaje. call RS232_Mensaje ; Lo visualiza en el ordenador. call Retardo_1s goto Principal ;********************************************* Subrutina de "Mensajes" ************************************************ Mensajes addwf PCL,F Mensaje0 DT RetornoCarro DT " En el I.E.S. Joan Miro de San Sebastián de los Reyes" DT RetornoCarro DT " se puede estudiar el Ciclo Formativo" DT RetornoCarro DT " DESARROLLO de PRODUCTOS ELECTRONICOS." DT RetornoCarro, 0x00 ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RS232_RT.INC> INCLUDE <RS232MEN.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END 214

223 RTS232_6.asm ( Entrenador Básico 10 ) title " Este programa envía varios mensajes grabados en la memoria de programa " title " del microcontrolador al ordenador. Cada mensaje permanecerá en pantalla " title " durante unos segundos hasta que sea sustituido por el siguiente." ;************************************************** RTS232_6.asm ***************************************************** ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F876.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 ******************************************************************************** RetornoCarro EQU d'13' ; Codigo de tecla "Enter" o "Retorno de Carro". ;**************************** Registros ********************************************************************************* CBLOCK 0x20 ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Dirección del Vector Reset ;Comienzo del Programa ;**************************************** Subrutina de "Mensajes" ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) Mensajes addwf PCL,F ; Los mensajes se ponen al principio para no ; superar la posición 0xFF de memoria de programa. Mensaje0 Mensaje1 DT " Quieres trabajar en dos años?." DT RetornoCarro DT " Quieres aprender hacer estos mensajes?",0x00 DT " Pues estudia CICLOS FORMATIVOS!.",0x00 215

224 Mensaje2 FinMensajes DT "En el I.E.S. Joan Miro de San Sebastian de los Reyes" DT RetornoCarro DT " se puede estudiar el Ciclo Formativo " DT RetornoCarro DT " DESARROLLO de PRODUCTOS ELECTRONICOS.", 0x00 IF (FinMensajes > 0xFF) correctamente." ERROR MESSG "ATENCION: La tabla ha superado el tamano de la pagina de los" "primeros 255 bytes de memoria ROM. NO funcionara ENDIF ;*************************************** Sección de Configuración ***************************************************** COMIENZO call RS232_Inicializa ; Inicializa las lineas que se van a ; utilizar en la comunicación con el puerto serie RS232. ;**************************************************** Principal ********************************************************** Principal movlw Mensaje0 ; Carga la primera posición del mensaje. call VisualizaMensaje ; Lo visualiza en el ordenador. movlw Mensaje1 ; El mismo procedimiento para las siguientes. call VisualizaMensaje movlw Mensaje2 call VisualizaMensaje goto Principal ;***************************************** Subrutina "VisualizaMensaje" *********************************************** VisualizaMensaje call RS232_Mensaje ; Lo visualiza en el ordenador. call RS232_LineasBlanco ; Visualiza unas lineas en blanco despues del call Retardo_1s ; mensaje durante este tiempo. call RS232_LineasBlanco ; Líneas en blanco al principio del próximo mensaje. return ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RS232MEN.INC> INCLUDE <RS232_RT.INC> INCLUDE <RETARDOS.INC> END 216

225 RTS232_7.asm ( Entrenador Básico 10 ) title " En el monitor del ordenador se visualizan mensajes grabados en la memoria " title " de programa del microcontrolador. El cambio de mensaje se ejecuta cada " title " vez que se pulse la tecla Enter." ;************************************************* RTS232_7.asm ****************************************************** ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;********************* Asignación de nombres de Registros de Funciones especiales a direcciones ************* INCLUDE <P16F876.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 ******************************************************************************** RetornoCarro EQU d'13' ; Codigo de tecla "Enter" o "Retorno de Carro". ;**************************** Registros ********************************************************************************* CBLOCK 0x20 ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Dirección del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************************** Subrutina de "Mensajes" ***************************************************** ORG 0X05 ; Inicio de Programa (Una posicion detras del vector de Interrupcion) Mensajes addwf PCL,F ; Los mensajes se ponen al principio para no ; superar la posición 0xFF de memoria de programa. Mensaje0 Mensaje1 DT " Quieres trabajar en dos años?." DT RetornoCarro DT " Quieres aprender hacer estos mensajes?",0x00 DT " Pues estudia CICLOS FORMATIVOS!.",0x00 217

226 Mensaje2 FinMensajes DT "En el I.E.S. Joan Miro de San Sebastian de los Reyes" DT RetornoCarro DT " se puede estudiar el Ciclo Formativo " DT RetornoCarro DT " DESARROLLO de PRODUCTOS ELECTRONICOS.", 0x00 IF (FinMensajes > 0xFF) correctamente." ERROR MESSG "ATENCION: La tabla ha superado el tamano de la pagina de los" "primeros 255 bytes de memoria ROM. NO funcionara ENDIF ;*************************************** Sección de Configuración ***************************************************** COMIENZO call RS232_Inicializa ; Inicializa las lineas que se van a ; utilizar en la comunicación con el puerto serie RS232. call RS232_LineasBlanco ; Visualiza unas cuantas líneas en blanco. ;**************************************************** Principal ********************************************************** Principal movlw Mensaje0 ; Carga la primera posicion del mensaje. call Visualiza_y_Espera ; Lo visualiza en el ordenador y espera movlw Mensaje1 ; pulse "Enter". call Visualiza_y_Espera movlw Mensaje2 call Visualiza_y_Espera goto Principal ;******************************************** Subrutina "Visualiza_y_Espera" ***************************************** Visualiza_y_Espera call RS232_Mensaje ; Lo visualiza en el ordenador. call RS232_LineasBlanco ; Visualiza unas líneas en blanco. EsperaPulseEnter call RS232_LeeDato ; Lee el teclado del ordenador. xorlw RetornoCarro ; Si no ha pulsado el "Enter" vuelve a btfss STATUS,Z ; leer de nuevo goto EsperaPulseEnter return ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RS232MEN.INC> INCLUDE <RS232_RT.INC> INCLUDE <RETARDOS.INC> END 218

227 RTS232_8.asm ( Entrenador Básico 10 ) title " Programa que visualiza en el modulo LCD el código ASCII en formato " title " hexadecimal de la tecla pulsada y también en el monitor del ordenador " title " en formato decimal. " ;************************************************ RTS232_8.asm ******************************************************* ; Por ejemplo: ; - Monitor del ordenador: " k-107", donde la "k" es la tecla pulsada y el "107" el ; código ASCII en formato decimal. ; - Pantalla del LCD: " k-6b", donde la "k" es la tecla pulsada y el "6B" el ; código ASCII en formato hexadecimal. ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F876.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 ******************************************************************************** ;**************************** Registros ********************************************************************************* CBLOCK 0x20 GuardaDato ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 COMIENZO BSF STATUS,RP0 ; Poner el Puerto A como señales digitales. MOVLW D'06' MOVWF ADCON1 219

228 BCF call call STATUS,RP0 LCD_Inicializa RS232_Inicializa ;**************************************************** Principal ********************************************************** Principal call RS232_LeeDato ; Espera recibir un caracter. movwf GuardaDato ; Guarda el dato recibido. call LCD_Borra ; Despeja la pantalla del visualizador LCD. movf GuardaDato,W ; Recupera el dato leido. call LCD_Caracter ; Visualiza el caracter de la tecla pulsada. movlw '-' ; Visualiza el guión. call LCD_Caracter movf GuardaDato,W call LCD_ByteCompleto ; Visualiza en el LCD el codigo ASCII. movlw '-' call RS232_EnviaDato ; Visualiza en el ordenador el guion. movf GuardaDato,W ; Lo pasa a BCD antes de visualizarlo. call BIN_a_BCD movf BCD_Centenas,W ; Visualiza el resultado en la pantalla del call RS232_EnviaNumero ; ordenador comenzando por las centenas. movf BCD_Decenas,W call RS232_EnviaNumero movf BCD_Unidades,W call RS232_EnviaNumero movlw ' ' ; Envia un espacio en blanco para separarlo del call RS232_EnviaDato ; anterior. movlw ' ' ; Envia un espacio en blanco para separarlo del call RS232_EnviaDato ; anterior goto Principal ;**************************************************** LIBRERIAS ******************************************************** INCLUDE <RS232_RT.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END RTS232_9.asm ( Entrenador Básico 10 ) title " SISTEMA DE MONITORIZACION: Se trata de leer el estado de las entradas " title " conectadas a las líneas <RB7:RB4> del Puerto B y se envia por el puerto " title " RS232 a un terminal para monitorizar el estado de los mismos. El estado de " title " las entradas se mostrara cada 1 segundos. " ;*************************************************** RTS232_9.asm **************************************************** ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. 220

229 ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F876.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 ******************************************************************************** RetornoCarro EQU d'13' ; Codigo de tecla "Enter" o "Retorno de Carro". CambioLinea EQU d'10' ; Codigo para el cambio de linea. #DEFINE Entrada0 PORTB,4 ; Define donde se situan las entradas. #DEFINE Entrada1 PORTB,5 #DEFINE Entrada2 PORTB,6 #DEFINE Entrada3 PORTB,7 ;**************************** Registros ********************************************************************************* CBLOCK 0x20 ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Subrutina de "Mensajes" ***************************************************************** ORG 0X05 Mensajes addwf PCL,F ; Los mensajes no deben sobrepasar las 256 ; primeras posiciones de memoria de programa. MensajeEntradas DT RetornoCarro, CambioLinea DT "Entrada 3 Entrada 2 Entrada 1 Entrada 0" DT RetornoCarro, CambioLinea DT " " DT RetornoCarro, CambioLinea, 0x00 MensajeAbierto DT " Abierto ", 0x00 MensajeCerrado DT " Cerrado ", 0x00 ;*************************************** Sección de Configuración ***************************************************** COMIENZO call RS232_Inicializa bsf STATUS,RP0 ; Configura como entrada las 4 lineas correspondientes bsf Entrada0 ; del Puerto B respetando la configuracion del 221

230 Puerto B. bsf Entrada1 ; resto de las lineas. bsf Entrada2 bsf Entrada3 bcf OPTION_REG,NOT_RBPU ; Activa las resistencias de Pull_Up del bcf STATUS,RP0 call RS232_LineasBlanco ; Visualiza unas cuantas lineas en blanco. ;**************************************************** Principal ********************************************************** Principal call RS232_LineasBlanco ; Para limpiar la pantalla. call LeeEntradasVisualiza ; Lee las entradas y las visualiza. call Retardo_1s ; Cada cierto tiempo. goto Principal ;*************************************** Subrutina "LeeEntradasVisualiza" ******************************************** ; Lee el estado de las entradas y las monitoriza en la pantalla del HyperTerminal. LeeEntradasVisualiza call RS232_LineasBlanco ; Visualiza unas cuantas lineas en blanco. movlw MensajeEntradas ; Nombre de las entradas. call RS232_Mensaje ; Lo visualiza en el HyperTerminal. LeeEntrada3 btfss Entrada3 ; Entrada = 1?, Entrada = Abierta? goto Entrada3Cerrado ; No, esta cerrada. call VisualizaAbierto goto LeeEntrada2 Entrada3Cerrado call VisualizaCerrado LeeEntrada2 btfss Entrada2 ; Se repite el procedimiento para las goto Entrada2Cerrado ; demas entradas. call VisualizaAbierto goto LeeEntrada1 Entrada2Cerrado call VisualizaCerrado LeeEntrada1 btfss Entrada1 goto Entrada1Cerrado call VisualizaAbierto goto LeeEntrada0 Entrada1Cerrado call VisualizaCerrado LeeEntrada0 btfss Entrada0 goto Entrada0Cerrado call VisualizaAbierto goto FinVisualiza Entrada0Cerrado call VisualizaCerrado FinVisualiza call RS232_LineasBlanco return ;*************************************** Subrutina "VisualizaAbierto" ************************************************ VisualizaAbierto movlw MensajeAbierto ; Visualiza el mensaje "Abierto" call RS232_Mensaje ; en el HyperTerminal. return 222

231 ;*************************************** Subrutina "VisualizaCerrado" ************************************************ VisualizaCerrado movlw MensajeCerrado ; Visualiza el mensaje "Cerrado" call RS232_Mensaje ; en el HyperTerminal. return ;************************************** Librerias ******************************************************************** INCLUDE <RS232_RT.INC> INCLUDE <RS232MEN.INC> INCLUDE <RETARDOS.INC> END RTS23_10.asm ( Entrenador Básico 10 ) title " SISTEMA DE MONITORIZACION: Se trata de leer el estado de las entradas " title " conectadas a las líneas <RB7:RB4> del Puerto B y se envia por el puerto " title " RS232 a un terminal para monitorizar el estado de los mismos. " title " Se utilizara las interrupciones por cambio de nivel en una línea del Puerto B, " title " por ello, las entradas deben conectarse a la parte alta del Puerto B." ;*************************************************** RTS23_10.asm **************************************************** ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F876.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 ******************************************************************************** RetornoCarro EQU d'13' ; Codigo de tecla "Enter" o "Retorno de Carro". CambioLinea EQU d'10' ; Codigo para el cambio de linea. #DEFINE Entrada0 PORTB,4 ; Define donde se situan las entradas. #DEFINE Entrada1 PORTB,5 #DEFINE Entrada2 PORTB,6 #DEFINE Entrada3 PORTB,7 223

232 ;**************************** Registros ********************************************************************************* CBLOCK 0x20 ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;*************************** Vector de Interrupción ********************************************************************* ORG 0X04 GOTO LeeEntradasVisualiza ;**************************** Subrutina de "Mensajes" ***************************************************************** ORG 0X05 Mensajes addwf PCL,F ; Los mensajes no deben sobrepasar las 256 ; primeras posiciones de memoria de programa. MensajeEntradas DT RetornoCarro, CambioLinea DT "Entrada 3 Entrada 2 Entrada 1 Entrada 0" DT RetornoCarro, CambioLinea DT " " DT RetornoCarro, CambioLinea, 0x00 MensajeAbierto DT " Abierto ", 0x00 MensajeCerrado DT " Cerrado ", 0x00 ;*************************************** Sección de Configuración ***************************************************** COMIENZO call RS232_Inicializa bsf STATUS,RP0 ; Configura como entrada las 4 lineas correspondientes bsf Entrada0 ; del Puerto B respetando la configuracion del bsf Entrada1 ; resto de las lineas. bsf Entrada2 bsf Entrada3 bcf OPTION_REG,NOT_RBPU ; Activa las resistencias de Pull-Up del Puerto B. bcf STATUS,RP0 call RS232_LineasBlanco ; Visualiza unas cuantas lineas en blanco call RS232_LineasBlanco ; para limpiar la pantalla. call LeeEntradasVisualiza ; Lee las entradas y visualiza por primera vez. movlw b' ' ; Habilita la interrupcion RBI y la general. movwf INTCON ;**************************************************** Principal ********************************************************** Principal sleep ; Espera en modo de bajo consumo que se goto Principal ; modifique una entrada. ;************************************* Rutina de Servicio a la Interrupción" ******************************************* 224

233 ; Lee el estado de las entradas y las monitoriza en la pantalla del HyperTerminal. LeeEntradasVisualiza call RS232_LineasBlanco movlw MensajeEntradas ; Nombre de las entradas. call RS232_Mensaje ; Lo visualiza en el ordenador. LeeEntrada3 btfss Entrada3 ; Entrada = 1?, Entrada = Abierta? goto Entrada3Cerrado ; No, esta cerrada. call VisualizaAbierto goto LeeEntrada2 Entrada3Cerrado call VisualizaCerrado LeeEntrada2 btfss Entrada2 ; Se repite el procedimiento para las goto Entrada2Cerrado ; demas entradas. call VisualizaAbierto goto LeeEntrada1 Entrada2Cerrado call VisualizaCerrado LeeEntrada1 btfss Entrada1 goto Entrada1Cerrado call VisualizaAbierto goto LeeEntrada0 Entrada1Cerrado call VisualizaCerrado LeeEntrada0 btfss Entrada0 goto Entrada0Cerrado call VisualizaAbierto goto FinVisualiza Entrada0Cerrado call VisualizaCerrado FinVisualiza call RS232_LineasBlanco bcf INTCON,RBIF ; Limpia el flag de reconocimiento de la ; interrupción. retfie ;*************************************** Subrutina "VisualizaAbierto" ************************************************ VisualizaAbierto movlw MensajeAbierto ; Visualiza el mensaje "Abierto" call RS232_Mensaje ; en el HyperTerminal. return ;*************************************** Subrutina "VisualizaCerrado" ************************************************ VisualizaCerrado movlw MensajeCerrado ; Visualiza el mensaje "Cerrado" call RS232_Mensaje ; en el HyperTerminal. return ;************************************** Librerias ******************************************************************** INCLUDE <RS232_RT.INC> INCLUDE <RS232MEN.INC> INCLUDE <RETARDOS.INC> END RTS23_11.asm ( Entrenador Básico 10 ) 225

234 title " SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un " title " ordenador se desea comandar el movimiento de una estructura móvil. " ;************************************************* RTS23_11.asm ****************************************************** ; La estructura móvil, obedece a la siguiente tabla: ; TECLA (Por ejemplo) MOVIMIENTO ; ; t Adelante ; b Atras ; a Izquierda ; l Derecha ; Espacio Parada ; La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente ; RB3 (Adelante), RB2 (Atras), RB1 (Izquierda), RB0 (Derecha) y apaga el resto. ; ; El movimiento que se esta realizando aparece reflejado en un mensaje en el visualizador LCD ; del sistema y también en la pantalla del ordenador. ; ; El programa debe permitir modificar fácilmente en posteriores revisiones en el hardware de ; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit ; en lugar de por byte (utilizar instrucciones "bsf" y "bcf", en lugar de "mov.."). ; Programa para PIC 16F876a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f876 ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F876.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 ******************************************************************************** #DEFINE SalidaAdelante PORTB,3 ; Define donde se situan las salidas. #DEFINE SalidaAtras PORTB,2 #DEFINE SalidaIzquierda PORTB,1 #DEFINE SalidaDerecha PORTB,0 Numero_Espacios EQU D'5' TeclaAdelante EQU 't' ; Codigo de las teclas utilizadas. TeclaAtras EQU 'b' TeclaIzquierda EQU 'a' TeclaDerecha EQU 'l' 226

235 TeclaParada EQU ' ' ; Codigo de la tecla espaciadora, (hay un espacio, ; tened cuidado al teclear el programa). Espacio EQU D'32' Retorno_de_carro EQU D'13' ;**************************** Registros ********************************************************************************* CBLOCK 0x20 TeclaPulsada MensajeApuntado Reg_Blancos ; Va a guardar el contenido de la tecla pulsada. ; Va a guarda la direccion del mensaje apuntado. ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Subrutina de "Mensajes" ***************************************************************** ORG 0X05 Mensajes addwf PCL,F MensajeParado MensajeAdelante MensajeAtras MensajeIzquierda MensajeDerecha Blanco DT "Sistema PARADO", 0x00 DT "Marcha ADELANTE", 0x00 DT "Marcha ATRAS", 0x00 DT "Hacia IZQUIERDA", 0x00 DT "Hacia DERECHA", 0x00 DT " ",0x00 ;*************************************** Sección de Configuración ***************************************************** COMIENZO BSF STATUS,RP0 ; Poner el Puerto A como señales digitales. MOVLW D'06' MOVWF ADCON1 BCF STATUS,RP0 call LCD_Inicializa call RS232_Inicializa bsf STATUS,RP0 ; Configura como salidas las 4 lineas del bcf SalidaAdelante ; del Puerto B respetando la configuracion del bcf SalidaAtras ; resto de las lineas. bcf SalidaIzquierda bcf SalidaDerecha bcf STATUS,RP0 call Parado ; En principio todas las salidas deben estar apagadas. ;**************************************************** Principal ********************************************************** 227

236 Principal call RS232_LeeDato ; Espera a recibir un caracter. call TesteaTeclado goto Principal ;******************************************* Subrutina "TesteaTeclado" ************************************************ ; Testea el teclado y actúa en consecuencia. TesteaTeclado movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada. xorlw TeclaAdelante ; Es la tecla del movimiento hacia adelante? btfsc STATUS,Z goto Adelante ; Si, se desea movimiento hacia adelante. movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TeclaAtras ; Es la tecla del movimiento hacia atrás? btfsc STATUS,Z goto Atras ; Si, se desea movimiento hacia atras. movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TeclaIzquierda ; Es la tecla del movimiento hacia la izquierda? btfsc STATUS,Z goto Izquierda ; Si, se desea movimiento hacia la izquierda. movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TeclaDerecha ; Es tecla del movimiento hacia la derecha? btfsc STATUS,Z goto Derecha ; Si, se desea movimiento hacia la derecha. movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada. xorlw TeclaParada ; Es la tecla de parada?. btfss STATUS,Z goto Fin ; No es ninguna tecla de movimiento y sale. Parado bcf SalidaAdelante ; Como se ha pulsado la tecla de parada se bcf SalidaAtras ; desactivan todas las salidas. bcf SalidaIzquierda bcf SalidaDerecha movlw MensajeParado goto Visualiza Adelante bcf SalidaAtras bsf SalidaAdelante bcf SalidaIzquierda bcf SalidaDerecha movlw MensajeAdelante goto Visualiza Atras bcf SalidaAdelante bsf SalidaAtras bcf SalidaIzquierda bcf SalidaDerecha movlw MensajeAtras goto Visualiza Izquierda bcf SalidaAdelante bcf SalidaAtras bsf SalidaIzquierda bcf SalidaDerecha 228

237 movlw MensajeIzquierda goto Visualiza Derecha bcf SalidaAdelante bcf SalidaAtras bcf SalidaIzquierda bsf SalidaDerecha movlw MensajeDerecha ; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en ; el monitor del ordenador. Visualiza movwf MensajeApuntado ; Guarda la posicion del mensaje. call LCD_Borra ; Borra la pantalla del modulo LCD. movf MensajeApuntado,W ; Visualiza el mensaje en la pantalla call LCD_Mensaje ; del visualizador LCD. movlw Numero_Espacios movwf Reg_Blancos ; Introducimos Espacios en Blanco. No_Fin_Blancos movlw Espacio call RS232_EnviaDato decfsz Reg_Blancos,f goto No_Fin_Blancos movf MensajeApuntado,W call RS232_Mensaje ; Lo visualiza en el HyperTerminal. movlw Retorno_de_carro call RS232_EnviaDato ; Saltamos de lineas. Fin return ;************************************** Librerías ******************************************************************** INCLUDE <RS232_RT.INC> INCLUDE <RS232MEN.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END RS232_RT.INC ( Entrenador Básico 10 ) title " Librería de transmisión-recepción serie asíncrona según normas RS-232." ;******************************************** Librería "RS232_RT.INC" ************************************************ ; Utiliza las patillas propias del PIC 16f 876a para la transmisión/recepción serie que son: ; RC6/TX/CK y RC7/RX/DT ; Los parámetros adoptados para la comunicación son los siguientes: ; - Velocidad de transmisión de 1200 baudios. ; - Un bit de inicio o Start a nivel bajo. ; - Dato de 8 bits. 229

238 ; - Sin paridad. ; - 1 bits de final o Stop a nivel alto. ;************************************** Subrutina "RS232_Inicializa" ************************************************** RS232_Inicializa BSF STATUS,RP0 ; Banco 1 BCF TXSTA,BRGH MOVLW D'12' MOVWF SPBRG BSF TXSTA,TXEN BCF TXSTA,SYNC ; Trabajar con velocidad alta de recepción, Baud Rate = Fosc/64(X+1) ; Cargar la Velocidad de transmisión de Datos. ; Baud Rate = Fosc/64(X+1)= 1MHz/64(12+1)=1200 Bit/Segundo. ; Habilitamos la Transmision serie. ; Habilitamos modo asíncrono. BCF STATUS,RP0 ; Banco 0 BSF RCSTA,SPEN BSF RCSTA,CREN ; Activamos la Puerta Serie ; (Configuramos las patillas RC7/RX/DT y RC6/TX/CK como serie). ; Permitimos las recepciones múltiples RETURN ;**************************** Subrutinas "RS232_EnviaDato" y "RS232_EnviaNumero" **************************** ; El microcontrolador envía un dato por la línea de salida comenzando por el bit de menor ; peso. En dato enviado será el que le llegue a través del registro de trabajo W. ; Entrada: En (W) el dato a enviar. RS232_EnviaNumero ADDLW '0' ; Envia el codigo ASCII de un numero. ; Lo pasa a código ASCII sumándole el ASCII del 0. RS232_EnviaDato MOVWF TXREG ; Comienzo de la transmision de datos en Serie. BSF STATUS,RP0 No_transmision BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO No_transmision BCF STATUS,RP0 RETURN ;*****************************************Subrutina "RS232_LeeDato" ************************************************ ; El microcontrolador lee el dato por la línea de entrada comenzando por el bit de menor ; peso. El dato leído se envía finalmente en el registro de trabajo W. RS232_LeeDato BTFSS PIR1,RCIF ; Preguntamos si ha llegado el dato. GOTO RS232_LeeDato MOVF RCREG,W ;Cargamos el dato del registro RCREG en el registro DATO. BCF PIR1,RCIF ;Borrar flag de recepcion. RETURN RS232MEN.INC ( Entrenador Básico 10 ) 230

239 title " Librería de transmisión de mensajes desde el microcontrolador hacia el " title " ordenador a través del puerto serie RS232. " ;******************************************** Librería "RS232MEN.INC" *****************:***************************** ;****************************************** Subrutina "RS232_Mensaje" ********************************************** ; envía por el puerto serie el mensaje apuntado por el registro W y grabado en memoria ; de programa del PIC. El mensaje se visualizara en el monitor del ordenador. Esta ; subrutina sigue la estructura de funcionamiento similar a la ya conocida "LCD_Mensaje" ; para visualización de mensajes en pantallas de módulos LCD. CBLOCK RS232_ApuntaCaracter RS232_ValorCaracter ; Apunta al caracter a visualizar. ; Valor ASCII del caracter a visualizar. ENDC RS232_Mensaje movwf RS232_ApuntaCaracter ; Posicion del primer caracter del mensaje. movlw Mensajes ; Halla la posicion relativa del primer subwf RS232_ApuntaCaracter,F ; caracter del mensaje respecto del ; comienzo de todos los mensajes ; (identificados mediante la etiqueta ; "Mensajes"). decf RS232_ApuntaCaracter,F ; Para compensar la posicion que ocupa la ; instrucción "addwf PCL,F". RS232_VisualizaOtroCaracter movf RS232_ApuntaCaracter,W ; Apunta al caracter a visualizar. call Mensajes ; Obtiene el codigo ASCII del ; carácter apuntado. movwf RS232_ValorCaracter ; Guarda el valor de carácter. movf RS232_ValorCaracter,F ; Lo unico que hace es posicionar ; flag Z. En caso que sea "0x00", btfsc STATUS,Z ; que es codigo indicador final goto RS232_FinMensaje ; de mensaje, sale fuera. RS232_NoUltimoCaracter call RS232_EnviaDato ; Visualiza el caracter ASCII leido. incf RS232_ApuntaCaracter,F ; Apunta a la posicion del siguiente goto RS232_VisualizaOtroCaracter ; caracter dentro del mensaje. RS232_FinMensaje return ;**************************************** Subrutina "RS232_LineasBlanco" ******************************************* ; Visualiza unas cuantas líneas en blanco en el monitor del ordenador. CBLOCK RS232_ContadorLineas ENDC RS232_LineasBlanco movlw d'10' ; Por ejemplo este número de lineas movwf RS232_ContadorLineas ; en blanco. R232_LineasBlancoLazo movlw d'10' ; Codigo del salto de linea call RS232_EnviaDato decfsz RS232_ContadorLineas,F 231

240 goto R232_LineasBlancoLazo movlw d'13' ; Codigo del retorno de carro. call RS232_EnviaDato ; Finaliza con un retorno de carro. return 232

241 15.- Entrenador Básico

242 Int_T_01.asm ( Entrenador Básico 11 ) title " Onda cuadrada de 10 khz aproximadamente, mediante la interrupción por desbordamiento del Timer 0 " ;************************************************** Int_T_01.asm ******************************************************* ; Por la línea 3 del puerto B se genera una onda cuadrada de 10 khz, cada semiperiodo dura ; 50 us. Los tiempos de temporización se lograran mediante la interrupción por desbordamiento ; del Timer 0. A la línea de salida se puede conectar un altavoz que producirá un pitido. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* INCLUDE <P16F84A.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 ******************************************************************************** TMR0_Carga50us EQU d'50' #DEFINE Salida PORTB,2 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0x05 COMIENZO bsf STATUS,RP0 ; Acceso al Banco 1. bcf Salida ; línea configurada como salida. 234

243 movlw b' ' movwf OPTION_REG ; Sin prescaler para TMR0 (se asigna al Watchdog). bcf STATUS,RP0 ; Acceso al Banco 0. movlw TMR0_Carga50us ; Carga el TMR0. movwf TMR0 movlw b' ' movwf INTCON ; Autoriza interrupcion T0I y la general (GIE). ;**************************************************** Principal ********************************************************** Principal ; No puede pasar a modo de bajo consumo goto $ ; porque detendria el Timer 0. ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* ; Como el PIC trabaja a una frecuencia de 4 MHz el TMR0 evoluciona cada microsegundo. Para ; conseguir un retardo de 50 us con un prescaler de 1 el TMR0 tiene que contar 50 impulsos. ; Efectivamente: 1 us x 50 x 1 = 50 us. Timer0_interrupción movlw TMR0_Carga50us movwf TMR0 ; Recarga el timer TMR0. btfsc Salida ; Testea el anterior estado de la salida. goto EstabaAlto EstabaBajo bsf Salida ; Estaba bajo y lo pasa a alto. goto FinInterrupcion EstabaAlto bcf Salida ; Estaba alto y lo pasa a bajo. FinInterrupcion bcf INTCON,T0IF ; Repone flag del TMR0. retfie ; Comprobando con el simulador del MPLAB se obtienen unos tiempos para la onda cuadrada de ; 56 us para el nivel alto y de 55 us para el bajo. END Int_T_02.asm ( Entrenador Básico 11 ) title " Onda cuadrada de 10 khz exactos, mediante la interrupción por desbordamiento del Timer 0 " ;*********************************************** Int_T_02.asm ********************************************************** ; Por la linea 3 del puerto B se genera una onda cuadrada de 10 khz. Cada semiperiodo dura ; 50 us exactos. Los tiempos de temporización se lograran mediante la interrupción del ; Timer 0. A la línea de salida se puede conectar un altavoz que producirá un pitido. ; El calculo de la carga del TMR0 se realiza teniendo en cuenta los tiempos que tardan en ; ejecutarse las instrucciones y saltos para conseguir tiempos exactos. Para calcular el valor ; de carga del TMR0 se ayuda del simulador del MPLAB y de la ventana de reloj Stopwatch. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. 235

244 ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* INCLUDE <P16F84A.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 ******************************************************************************** TMR0_Carga50us EQU d'43' #DEFINE Salida PORTB,3 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C ENDC ;**************************** Sección Código de Reset *************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0x05 COMIENZO bsf STATUS,RP0 ; Acceso al Banco 1. bcf Salida ; Esta línea se configura como salida. movlw b' ' movwf OPTION_REG ; Sin prescaler para TMR0 (se asigna al Watchdog). bcf STATUS,RP0 ; Acceso al Banco 0. movlw TMR0_Carga50us ; Carga el TMR0. movwf TMR0 movlw b' ' movwf INTCON ; Autoriza interrupcion T0I y la general (GIE). ;**************************************************** Principal ********************************************************** Principal ; No puede pasar a modo de bajo consumo goto $ ; porque detendria el Timer

245 ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* ; Como el PIC trabaja a una frecuencia de 4 MHz el TMR0 evoluciona cada microsegundo. Para ; conseguir un retardo de 50 microsegundos con un prescaler de 1 el TMR0 tiene que contar ; 43 impulsos. Efectivamente: 1us x 1 x 43 + tiempo de los saltos y otros = 50 us. ; ; Las instrucciones "nop" se ponen para ajustar el tiempo a 50 us exacto y lograr una onda ; cuadrada perfecta. El simulador del MPLAB comprueba unos tiempos para la onda cuadrada de ; 10 khz exactos de 50 us para el nivel alto y otros 50 us para el bajo. Timer0_interrupción EstabaBajo nop movlw TMR0_Carga50us movwf TMR0 ; Recarga el TMR0. btfsc Salida ; Testea el anterior estado de la salida. goto EstabaAlto nop bsf Salida ; Estaba bajo y lo pasa a alto. goto FinInterrupcion EstabaAlto bcf Salida ; Estaba alto y lo pasa a bajo. FinInterrupcion bcf INTCON,T0IF ; Repone flag del TMR0. retfie ; Retorno de interrupcion END Int_T_03.asm ( Entrenador Básico 11 ) title " Led ON/OFF 500 ms utilizando la interrupción por desbordamiento del Timer 0 " ;*********************************************** Int_T_03.asm ********************************************************** ; Un LED conectado a la línea 1 del puerto de salida se enciende durante 500 ms y apaga ; durante otros 500 ms. Los tiempos de temporización se realiza mediante la utilización ; de la interrupción por desbordamiento del Timer 0 del PIC. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F84A.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. 237

246 ;**************************** Igualdades ******************************************************************************** Carga500ms EQU d'10' TMR0_Carga50ms EQU d'195' #DEFINE LED PORTB,1 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C Registro50ms ENDC ; Registro auxiliar para conseguir una temporizacion mayor. ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Direccion del Vector Reset ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0x05 COMIENZO bsf STATUS,RP0 ; Acceso al Banco 1. bcf LED ; Linea del LED configurada como salida. movlw b' ' movwf OPTION_REG ; Prescaler de 256 para el TMR0 bcf STATUS,RP0 ; Acceso al Banco 0. movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw Carga500ms movwf Registro50ms movlw b' ' movwf INTCON ; Activa interrupcion del TMR0 (TOIE) y la general. ;**************************************************** Principal ********************************************************** Principal ; No se puede utilizar el modo bajo consumo goto $ ; porque el Timer se detiene. ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* ; Como el PIC trabaja a una frecuencia de 4MHz, el TMR0 evoluciona cada microsegundo. ; El bucle central se hace en un tiempo de 50 ms. Para ello se utiliza un prescaler ; de 256 y el TMR0 tiene que contar 195 impulsos. Efectivamente: ; 195 x 256 = us = 50 ms aproximadamente. ; Para conseguir una temporización de 500 ms, habrá que repetir 10 veces el lazo de 50 ms. Timer0_interrupción movlw TMR0_Carga50ms movwf TMR0 decfsz Registro50ms,F goto FinInterrupcion movlw Carga500ms movwf Registro50ms ; Recarga el TMR0. ; Decrementa el contador. ; Repone el contador nuevamente 238

247 btfsc LED ; Testea el ultimo estado del LED. goto EstabaEncendido EstabaApagado bsf LED ; Estaba apagado y lo enciende. goto FinInterrupcion EstabaEncendido bcf LED ; Estaba encendido y lo apaga. FinInterrupcion bcf INTCON,T0IF ; Repone flag del TMR0. retfie ; Con el simulador del MPLAB se comprueba que los tiempos son: En alto us y en ; bajo us. END Int_T_04.asm ( Entrenador Básico 11 ) title " Led ON (800 ms) Led OFF (500 ms), utilizando la interrupción por desbordamiento del Timer 0 " ;********************************************** Int_T_04.asm *********************************************************** ; Un LED conectado a la línea 1 del puerto de salida se enciende durante 800 ms y apaga ; durante otros 500 ms. Los tiempos de temporización se realizaran mediante la utilización ; de la interrupción por desbordamiento del Timer 0 del PIC. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F84A.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 ******************************************************************************** Carga500ms EQU d'10' Carga800ms EQU d'16' TMR0_Carga50ms EQU d'195' #DEFINE LED PORTB,1 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C 239

248 Registro50ms ; Registro auxiliar para conseguir una temporizacion mayor. ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración **************************************************** ORG 0x05 COMIENZO bsf STATUS,RP0 ; Acceso al Banco 1. bcf LED ; Linea del LED configurada como salida. movlw b' ' movwf OPTION_REG ; Prescaler de 256 asignado al TMR0 bcf STATUS,RP0 ; Acceso al Banco 0. movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw Carga500ms movwf Registro50ms movlw b' ' movwf INTCON ; Autoriza interrupcion del TMR0 (T0IE) y la GIE. ;**************************************************** Principal ********************************************************** Principal ; No puede pasar a modo bajo consumo porque goto $ ; el Timer 0 se detendria. ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* ; Como el PIC trabaja a una frecuencia de 4 MHz el TMR0 evoluciona cada microsegundo. ; El bucle central se hace en un tiempo de 50 ms. Para ello se utiliza un prescaler ; de 256 y el TMR0 tiene que contar 195. Efectivamente 195 x 256 = us = 50 ms. ; Para conseguir una temporización de 500 ms habrá que repetir 10 veces el lazo de 50 ms. ; Para conseguir una temporización de 800 ms habrá que repetir 16 veces el lazo de 50 ms. Timer0_interrupción movlw TMR0_Carga50ms movwf TMR0 ; Recarga el TMR0. decfsz Registro50ms,F ; Decrementa el contador. goto FinInterrupcion btfsc LED ; Testea el ultimo estado del LED. goto EstabaEncendido EstabaApagado bsf LED ; Estaba apagado y lo enciende. movlw Carga800ms ; Repone el contador nuevamente para que este goto CargaRegistro50ms ; 800 ms encendido. EstabaEncendido bcf LED ; Estaba encendido y lo apaga. movlw Carga500ms ; Repone el contador nuevamente para que este ; 500 ms apagado. 240

249 CargaRegistro50ms movwf Registro50ms FinInterrupcion bcf INTCON,T0IF ; Repone flag del TMR0. retfie ; Retorno de interrupción. END Int_T_05.asm ( Entrenador Básico 11 ) title " Sistema multitarea ( Mostrar mensajes en el LCD y LED ON/OFF (500 ms) " ;********************************************** Int_T_05.asm *********************************************************** ; El modulo LCD visualiza constantemente un mensaje largo que se desplaza por la pantalla. ; Al mismo tiempo el diodo LED conectado a la línea RB1 se enciende durante 500 ms y se apaga ; durante otros 500 ms a modo de segundero ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F84A.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 ******************************************************************************** Carga500ms EQU d'10' TMR0_Carga50ms EQU d'195' #DEFINE LED PORTB,1 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C Registro50ms Guarda_W Guarda_STATUS ; Registro auxiliar para conseguir una temporizacion mayor. ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa 241

250 ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0x05 COMIENZO call LCD_Inicializa bsf STATUS,RP0 bcf LED movlw b' ' movwf OPTION_REG ; Prescaler de 256 para el TMR0 bcf STATUS,RP0 movlw TMR0_Carga50ms ; Carga el Timer 0. movwf TMR0 movlw Carga500ms movwf Registro50ms ; Número de veces a repetir la interrupcion. movlw b' ' ; Activa interrupcion del TMR0 (TOIE) y la movwf INTCON ; general (GIE). ;**************************************************** Principal ********************************************************** Principal movlw MensajeLargo call LCD_MensajeMovimiento goto Principal ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* ; La interrupción se produce cada 50 ms aproximadamente. Para conseguir una temporización ; de 500 ms habrá que repetir 10 veces el lazo de 50 ms. ; Como esta subrutina altera los valores del registro de trabajo W y del STATUS ; habrá que preservar su valor previo y restaurarlos al final. Timer0_interrupción movwf Guarda_W ; Guarda W y STATUS. swapf STATUS,W ; Ya que "movf STATUS,W" corrompe el bit Z. movwf Guarda_STATUS bcf STATUS,RP0 ; Para asegurarse de que trabaja con el banco 0. movlw TMR0_Carga50ms movwf TMR0 ; Recarga el TMR0. decfsz Registro50ms,F ; Decrementa el contador. goto FinInterrupcion movlw Carga500ms ; Repone el contador nuevamente. movwf Registro50ms btfsc LED ; Pasa a conmutar el estado del LED. goto EstabaEncendido EstabaApagado bsf LED ; Lo enciende. goto FinInterrupcion EstabaEncendido bcf LED ; Lo apaga. FinInterrupcion swapf Guarda_STATUS,W ; Restaura el STATUS. movwf STATUS swapf Guarda_W,F ; Restaura W como estaba antes de producirse swapf Guarda_W,W ; la interrupción. 242

251 bcf retfie INTCON,T0IF ;******************************************** Subrutina "Mensajes" **************************************************** Mensajes addwf PCL,F MensajeLargo DT " " DT "Estudia \"Desarrollo de Productos Electrónicos"." DT " ", 0x00 ;******************************************** Librerías *************************************************************** INCLUDE <LCD_MENS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Int_T_06.asm ( Entrenador Básico 11 ) title " Mostrar mensajes en el LCD fijo en la primera línea e intermitente en la " title " segunda línea utilizando la interrupción del Timer 0 " ;********************************************** Int_T_06.asm *********************************************************** ; En la línea superior de la pantalla aparece un mensaje fijo. En la línea inferior aparece ; un mensaje intermitente que se enciende durante 500 ms y se apaga durante 300 ms. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F84A.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 ******************************************************************************** Carga500ms EQU 10 ; 500 ms, ya que 50ms x 10 = 500ms Carga300ms EQU 6 ; 300ms, ya que 50ms x 6 = 300ms TMR0_Carga50ms EQU d'195' ; Para conseguir la interrupcion del ; Timer 0 cada 50 ms. ;**************************** Registros ********************************************************************************* CBLOCK 0x0C Registro50ms 243

252 Intermitencia ENDC ; Si es cero se apaga en intermitencia. Para ; cualquier otro valor se enciende. ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0x05 COMIENZO call LCD_Inicializa movlw MensajeFijo ; Visualiza mensaje fijo en la primera call LCD_Mensaje ; linea. bsf STATUS,RP0 movlw b' ' ; Prescaler de 256 para el TMR0. movwf OPTION_REG bcf STATUS,RP0 movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw Carga500ms movwf Registro50ms movlw b' ' movwf INTCON ;**************************************************** Principal ********************************************************* Principal goto $ ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* Timer0_interrupción movlw TMR0_Carga50ms ; Carga el Timer 0. movwf TMR0 decfsz Registro50ms,F ; Decrementa el contador. goto FinInterrupcion comf Intermitencia,F ; Conmuta la intermitencia call Visualiza FinInterrupcion bcf INTCON,T0IF retfie ;*********************************************** Subrutina "Visualiza" ************************************************** ; Visualiza, o no, un mensaje en función del contenido del registro Intermitencia. Visualiza call LCD_Linea2 ; Se situa en la segunda linea. btfss Intermitencia,0 ; Apaga o enciende el mensaje en intermitencia? goto ApagaMensaje ; Apaga el mensaje. movlw MensajeIntermitente ; Visualiza el mensaje intermitente. call LCD_Mensaje 244

253 movlw Carga500ms movwf Registro50ms goto FinVisualiza ; Debe estar 500 ms encendido. ApagaMensaje call LCD_LineaEnBlanco ; Visualiza una linea en blanco. movlw Carga300ms ; Debe estar 300 ms apagado. movwf Registro50ms FinVisualiza return ;********************************************** Subrutina "Mensajes" *************************************************** Mensajes addwf PCL,F MensajeFijo DT " Estudia", 0x00 MensajeIntermitente DT " ELECTRONICA", 0x00 ;******************************************** Librerías *************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> END Int_C_01.asm ( Entrenador Básico 11 ) title " Generar una señal cuadrada por PB2, de frecuencia variable en " title " función de PB7. El modulo LCD visualiza dicha frecuencia " ;*************************************************** Int_C_01.asm ****************************************************** ; Por la línea 2 del puerto B se genera una onda cuadrada. La frecuencia de la onda cuadrada cambia ; mediante activación del pulsador conectado al pin 7 del puerto B, de la siguiente forma: ; ; PULSACION FRECUENCIA SEMIPERIODO ; ; (Inicial) 10 khz 50 us. = 1 x 50 us ; Primera 5 khz 100 us. = 2 x 50 us ; Segunda 2 khz 250 us. = 5 x 50 us ; Tercera 1 khz 500 us. = 10 x 50 us ; Cuarta 500 Hz 1000 us. = 20 x 50 us ; Quinta 200 Hz 2500 us. = 50 x 50 us ; Sexta 100 Hz 5000 us. = 100 x 50 us ; Septima 50 Hz us. = 200 x 50 us ; Al conectarlo por primera vez se genera una frecuencia de 10 khz, al activar el ; pulsador cambia a 5 khz, al actuar una segunda vez cambia a 2 khz, y así sucesivamente. ; El modulo LCD visualizara la frecuencia generada. A la línea de salida se puede conectar ; un altavoz que producirá un pitido. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. 245

254 ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F84A.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 ******************************************************************************** TMR0_Carga50us EQU d'42' ; El semiperiodo patron va a ser de 50 us. NumeroFrec EQU d'8' ; Ocho posibles frecuencias: 10 khz, 5 khz, 2 khz, ; 1 khz, 500 Hz, 200 Hz, 100 Hz y 50 Hz. #DEFINE Salida PORTB,2 #DEFINE Pulsador PORTB,7 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C ApuntadorFrecuencia Semiperiodo ENDC ;**************************** Sección Código de Reset *************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto ServicioInterrupcion ;*********************************** Subrutina "CargaContador" ******************************************************* ORG 0x05 CargaContador addwf PCL,F retlw d'1' ; Semiperiodo 1 x 50 = 50 us, frecuencia = 10 khz. retlw d'2' ; Semiperiodo 2 x 50 = 100 us, frecuencia = 5 khz. retlw d'5' ; Semiperiodo 5 x 50 = 250 us, frecuencia = 2 khz. retlw d'10' ; Semiperiodo 10 x 50 = 500 us, frecuencia = 1 khz. retlw d'20' ; Semiperiodo 20 x 50 = 1000 us, frecuencia = 500 Hz. retlw d'50' ; Semiperiodo 50 x 50 = 2500 us, frecuencia = 200 Hz. retlw d'100' ; Semiperiodo 100 x 50 = 5000 us, frecuencia = 100 Hz. retlw d'200' ; Semiperiodo 200 x 50 = us, frecuencia = 50 Hz. ;************************************* Subrutina "CargaMensaje" ***************************************************** CargaMensaje addwf PCL,F 246

255 retlw retlw retlw retlw retlw retlw retlw retlw Mensaje10kHz Mensaje5kHz Mensaje2kHz Mensaje1kHz Mensaje500Hz Mensaje200Hz Mensaje100Hz Mensaje50Hz ;**************************************** Subrutina "Mensajes" ********************************************************* Mensajes addwf PCL,F MensajeFrecuencia Mensaje10kHz Mensaje5kHz Mensaje2kHz Mensaje1kHz Mensaje500Hz Mensaje200Hz Mensaje100Hz Mensaje50Hz DT "Frec.: ", 0x00 DT "10 khz. ", 0x00 DT "5 khz. ", 0x00 DT "2 khz. ", 0x00 DT "1 khz. ", 0x00 DT "500 Hz. ", 0x00 DT "200 Hz. ", 0x00 DT "100 Hz. ", 0x00 DT "50 Hz. ", 0x00 ;*************************************** Sección de Configuración ***************************************************** COMIENZO call LCD_Inicializa bsf STATUS,RP0 bcf Salida bsf Pulsador movlw b' ' ; TMR0 sin prescaler. movwf OPTION_REG bcf STATUS,RP0 call EstadoInicial ; Visualiza la frecuencia inicial. movlw TMR0_Carga50us ; Carga el TMR0. movwf TMR0 movlw b' ' movwf INTCON ; Activa interrupciones del TMR0, RBI y general. ;**************************************************** Principal ********************************************************* Principal goto Principal ;********************************* Rutina de interrupción "ServicioInterrupcion" ************************************** ServicioInterrupcion btfsc INTCON,T0IF ; Interrupcion por desbordamiento del TMR0?. call Timer0_interrupción btfsc INTCON,RBIF ; Interrupcion por cambio en el Puerto B?. call Pulsador_Interrupcion bcf INTCON,T0IF ; Repone flag del TMR0. bcf INTCON,RBIF ; Repone flag del RBI. retfie 247

256 ;**************************************** Subrutina "Pulsador_Interrupcion" ******************************************* ; Subrutina de atención a la interrupción por cambio en la línea RB7 donde se ha ; conectado un pulsador. ; Incrementa el registro (ApuntadorFrecuencia) desde b' ' (que corresponde a una ; frecuencia de 10 khz) hasta b' ' (que corresponde a una frecuencia de 50 Hz), según ; la tabla especificada en el enunciado del ejercicio. Pulsador_Interrupcion call Retardo_20ms btfsc Pulsador goto Fin_PulsadorInterrupcion incf ApuntadorFrecuencia,F ; Apunta a la siguiente frecuencia. movlw NumeroFrec ; Va a comprobar si ha llegado al máximo. subwf ApuntadorFrecuencia,W ; (W)=(ApuntadorFrecuencia)- NumeroFrec btfsc STATUS,C ; Ha llegado a su maximo? EstadoInicial clrf ApuntadorFrecuencia ; Si llega al maximo lo inicializa. movf ApuntadorFrecuencia,W ; Va a cargar el valor del factor de call CargaContador ; multiplicacion del semiperiodo movwf Semiperiodo ; segun la tabla. movwf Timer0_ContadorA call Retardo_200ms call LCD_Linea1 ; Visualiza la frecuencia seleccionada. movlw MensajeFrecuencia call LCD_Mensaje movf ApuntadorFrecuencia,W call CargaMensaje call LCD_Mensaje EsperaDejePulsar btfss Pulsador goto EsperaDejePulsar Fin_PulsadorInterrupcion return ; ************************************** Subrutina "Timer0_interrupción" ********************************************* CBLOCK Timer0_ContadorA ENDC Timer0_interrupción movlw TMR0_Carga50us movwf TMR0 ; Recarga el TMR0. decfsz Timer0_ContadorA,F ; Decrementa el contador. goto Fin_Timer0_interrupción movf Semiperiodo,W ; Repone el contador nuevamente. movwf Timer0_ContadorA btfsc Salida ; Testea el ultimo estado de la salida. goto EstabaAlto EstabaBajo bsf Salida ; Estaba bajo y lo pasa a alto. goto Fin_Timer0_interrupción EstabaAlto bcf Salida ; Estaba alto y lo pasa a bajo. Fin_Timer0_interrupción return 248

257 ;******************************************** Librerías *************************************************************** INCLUDE <LCD_MENS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> END Int_C_02.asm ( Entrenador Básico 11 ) title " Generar una señal cuadrada por PB2, de frecuencia variable desde 300Hz hasta 4000Hz " ;*************************************************** Int_C_02.asm ****************************************************** ; A la línea de salida se conecta un altavoz que produce el sonido de una sirena que será fijado ; por el diseñador. En esta solución la frecuencia es de 300 Hz, subiendo hasta 4 khz y bajando ; después, mas lentamente, a su valor inicial y repitiendo el proceso. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F84A.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 ******************************************************************************** MaximoPeriodo EQU d'200' ; Corresponden a una frecuencia entre 300 Hz y MinimoPeriodo EQU d'15' ; 4 khz tal como se demuestra posteriormente. #DEFINE Salida PORTB,2 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C ApuntadorFrecuencia SentidoFrecuencia Guarda_W Guarda_STATUS ; (SentidoFrecuencia)=0 (frecuencia ascendente). ; (SentidoFrecuencia)=1 (frecuencia descendente). ENDC ;**************************** Sección Código de Reset **************************************************************** 249

258 ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 COMIENZO bsf STATUS,RP0 bcf Salida movlw b' ' ; Prescaler de 8 asignado al TMR0. movwf OPTION_REG bcf STATUS,RP0 clrf SentidoFrecuencia ; Inicializa el sentido de la variacion de movlw MaximoPeriodo ; frecuencia ascendente en la sirena. movwf ApuntadorFrecuencia ; Inicializa a la frecuencia minima. sublw d'0' ; Carga en el Timer 0 con signo negativo. movwf TMR0 movlw b' ' movwf INTCON ; Activa interrupcion del TMR0 (TOIE). ;**************************************************** Principal ********************************************************* Principal btfss SentidoFrecuencia,0 goto FrecuenciaAscendente FrecuenciaDescendente call Retardo_20ms ; Mantiene la frecuencia durante este tiempo. incf ApuntadorFrecuencia,F ; Aumenta el periodo, disminuye la frecuencia. movlw MaximoPeriodo ; Ha llegado a su maximo valor de periodo? subwf ApuntadorFrecuencia,W ; (W)=(ApuntadorFrecuencia)- MaximoPeriodo btfsc STATUS,C ; C=0?,(W) negativo?, (ApuntadorFrecuencia)< máximo. clrf SentidoFrecuencia ; No. La siguiente pasada entra en "FrecuenciaAscendente". goto Fin FrecuenciaAscendente call Retardo_10ms ; Mantiene la frecuencia durante este tiempo. decf ApuntadorFrecuencia,F ; Disminuye el periodo, aumenta la frecuencia. movlw MinimoPeriodo ; Ha llegado a su minimo valor de periodo? subwf ApuntadorFrecuencia,W ; (W)=(ApuntadorFrecuencia)- MinimoPeriodo btfss STATUS,C ; C=1?,(W) positivo?, (ApuntadorFrecuencia)>=Mínimo. incf SentidoFrecuencia,F ; No. La siguiente pasada entra en "FrecuenciaDescendente". Fin goto Principal 250

259 ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* ; Con un prescaler de 8 el periodo variara según el valor de ApuntadorFrecuencia entre: ; - Para (ApuntadorFrecuencia)=15, frecuencia = 4 khz. ; (efectivamente 15 x 8 = 120 us de semiperiodo que son 4 khz aproximadamente). ; - Para (ApuntadorFrecuencia)=200, frecuencia = 300 Hz. ; (efectivamente 200 x 8 = 1600 us de semiperiodo que son 300 Hz aproximadamente). Timer0_interrupción movwf Guarda_W ; Guarda el valor de W y STATUS. swapf STATUS,W movwf Guarda_STATUS bcf STATUS,RP0 movf ApuntadorFrecuencia,W sublw d'0' ; Carga en el Timer 0 con signo negativo. movwf TMR0 btfsc Salida goto EstabaAlto EstabaBajo bsf Salida goto Fin_Timer0_interrupción EstabaAlto bcf Salida Fin_Timer0_interrupción swapf Guarda_STATUS,W ; Restaura el valor de W y STATUS. movwf STATUS swapf Guarda_W,F swapf Guarda_W,W bcf INTCON,T0IF retfie ;******************************************** Librerías *************************************************************** INCLUDE <RETARDOS.INC> END Int_C_03.asm ( Entrenador Básico 11 ) title " Encender y apagar una sirena en función de RB7 y RB6, mostrar en el modulo LCD como esta la sirena " ;************************************************** Int_C_03.asm ******************************************************* ; Al actuar sobre el pulsador conectado a la línea RB7 se produce la activación de una ; sirena y el modulo LCD visualiza un mensaje del tipo "Sirena ACTIVADA". ; Para apagar la sirena hay que actuar sobre el pulsador conectado a la línea RB6. En la ; pantalla visualiza un mensaje del tipo "Sirena APAGADA". ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON 251

260 ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;***************** Asignación de nombres de Registros de Funciones especiales a direcciones ***************** INCLUDE <P16F84A.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 ******************************************************************************** MaximoPeriodo EQU d'200' ; Corresponden a una frecuencia entre 300 Hz y MinimoPeriodo EQU d'15' ; 4 khz tal como se demuestra posteriormente. #DEFINE Salida PORTB,2 #DEFINE EntradaActivar PORTB,7 #DEFINE EntradaApagarPORTB,6 #DEFINE AutorizaSirena Flags,0 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C Flags ApuntadorFrecuencia SentidoFrecuencia Guarda_W Guarda_STATUS Guarda_R_ContA Guarda_R_ContB ; (SentidoFrecuencia)=0 (frecuencia ascendente). ; (SentidoFrecuencia)=1 (frecuencia descendente). ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto ServicioInterrupcion ;*************************************** Sección de Configuración ***************************************************** ORG 0X05 COMIENZO call LCD_Inicializa bsf STATUS,RP0 bcf Salida bsf EntradaApagar bsf EntradaActivar movlw b' ' movwf OPTION_REG bcf STATUS,RP0 ; Prescaler de 8 asignado al TMR0. 252

261 call ApagarSirena ; En principio apaga la sirena. clrf SentidoFrecuencia ; Inicializa el sentido de la variacion de movlw MaximoPeriodo ; frecuencia ascendente en la sirena. movwf ApuntadorFrecuencia ; Inicializa a la frecuencia minima. sublw d'0' ; Carga en el Timer 0 con signo negativo. movwf TMR0 movlw b' ' ; Activa interrupcion del TMR0 (TOIE), por cambio movwf INTCON ; lineas del Puerto B (RBIE) y la general (GIE) ; El programa principal se dedica exclusivamente a generar el sonido de la sirena con ; ayuda de la interrupción del Timer 0 en caso de que esta activada. ;**************************************************** Principal ********************************************************* Principal btfss AutorizaSirena goto SirenaNoAutorizada ; Si no se autoriza sirena, va a modo de bajo consumo SirenaAutorizada btfss SentidoFrecuencia,0 goto FrecuenciaAscendente FrecuenciaDescendente call Retardo_20ms ; Mantiene la frecuencia durante este tiempo. incf ApuntadorFrecuencia,F ; Aumenta el periodo, disminuye la frecuencia. movlw MaximoPeriodo ; Ha llegado a su maximo valor de periodo? subwf ApuntadorFrecuencia,W ; (W)=(ApuntadorFrecuencia)- MaximoPeriodo. btfsc STATUS,C ; C=0?,(W) negativo?, (ApuntadorFrecuencia)<máximo? clrf SentidoFrecuencia ; No. La siguiente pasada entra en "FrecuenciaAscendente". goto Fin FrecuenciaAscendente call Retardo_10ms ; Mantiene la frecuencia durante este tiempo. decf ApuntadorFrecuencia,F ; Disminuye el período, aumenta la frecuencia. movlw MinimoPeriodo ; Ha llegado a su minimo valor de periodo? subwf ApuntadorFrecuencia,W ; (W)=(ApuntadorFrecuencia)- MinimoPeriodo btfss STATUS,C ; C=1?,(W) positivo?, (ApuntadorFrecuencia)>=Mínimo. incf SentidoFrecuencia,F ; No. La siguiente pasada entra en "FrecuenciaDescendente". goto Fin SirenaNoAutorizada bcf Salida ; Pone la salida en bajo. sleep ; Detiene el Timer 0 y espera en modo bajo consumo Fin goto Principal ; una interrupcion del pulsador. ;********************************* Rutina de interrupción "ServicioInterrupcion" ************************************** ServicioInterrupcion movwf Guarda_W swapf STATUS,W 253

262 movwf Guarda_STATUS bcf STATUS,RP0 ; Garantiza que se trabaja en el Banco 0. movf R_ContA,W ; Guarda los registros utilizados en esta movwf Guarda_R_ContA ; subrutina y también en la principal. movf R_ContB,W movwf Guarda_R_ContB btfsc INTCON,RBIF ; Interrupcion por cambio en el Puerto B? call RBI_Interrupcion btfsc INTCON,T0IF ; Interrupcion por desbordamiento del TMR0? call Timer0_interrupción ; No. Entonces ha sido el Timer 0. swapf Guarda_STATUS,W ; Restaura registros W y STATUS. movwf STATUS swapf Guarda_W,F swapf Guarda_W,W movf Guarda_R_ContA,W movwf R_ContA movf Guarda_R_ContB,W movwf R_ContB bcf bcf INTCON,RBIF INTCON,T0IF retfie ;**************************************** Subrutina "RBI_Interrupcion" ************************************************ RBI_Interrupcion call Retardo_20ms ; Espera a que se estabilicen niveles. btfsc EntradaApagar ; Esta presionado el pulsador de apagado? goto CompruebaActivar ; No, compueba el pulsador de activacion. ApagarSirena CALL Retardo_100ms bcf AutorizaSirena ; La sirena se apaga en el programa principal. call LCD_Borra movlw MensajeApagado ; Visualiza el mensaje. goto Visualiza CompruebaActivar btfsc EntradaActivar ; Esta presionado el pulsador de activacion?. goto EsperaDejePulsar ; No hay activado pulsador alguno y sale. ActivarSirena CALL Retardo_100ms bsf AutorizaSirena ; La sirena se activa en el programa principal. call LCD_Borra movlw MensajeActivada ; Visualiza el mensaje. Visualiza call LCD_Mensaje EsperaDejePulsar btfss EntradaApagar ; Espera que desaparezcan las señales de entrada. goto EsperaDejePulsar btfss EntradaActivar goto EsperaDejePulsar return ;********************************** Subrutina "Timer0_interrupción" *************************************************** ; Con un prescaler de 8 el periodo variara según el valor de ApuntadorFrecuencia entre: 254

263 ; - Para (ApuntadorFrecuencia)=15, frecuencia = 4 khz. ; (efectivamente 15 x 8 = 120 us de semiperiodo que son 4 khz aproximadamente). ; - Para (ApuntadorFrecuencia)=200, frecuencia = 300 Hz. ; (efectivamente 200 x 8 = 1600 us de semiperiodo que son 300 Hz aproximadamente). Timer0_interrupción movf ApuntadorFrecuencia,W sublw d'0' ; Carga en el Timer 0 con signo negativo. movwf TMR0 btfsc Salida ; Testea el ultimo estado de la salida. goto EstabaAlto EstabaBajo bsf Salida ; Estaba bajo y lo pasa a alto. goto Fin_Timer0_interrupción EstabaAlto bcf Salida ; Estaba alto y lo pasa a bajo. Fin_Timer0_interrupción return ;***************************************** Subrutina "Mensajes" ******************************************************** Mensajes addwf PCL,F MensajeApagado MensajeActivada DT " Sirena APAGADA", 0x00 DT " Ahora ACTIVADA", 0x00 ;******************************************** Librerías *************************************************************** INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <RETARDOS.INC> END Int_C_04.asm ( Entrenador Básico 11 ) title " Control del Ciclo de Trabajo de un señal cuadrada " ;**************************************************** Int_C_04.asm ***************************************************** ; Ejemplo de control del ciclo de trabajo. ; Por la línea 2 del Puerto B se genera una onda cuadrada de frecuencia constante a 100 Hz y ; ciclo de trabajo variable desde 0% a 100%, es decir, el tiempo en alto varia entre 0 us (0%) ; y us (100%). ; El valor del ciclo de trabajo cambia mediante activación del pulsador conectado al pin ; 7 del Puerto B, de la siguiente forma: ; PULSACIÓN DC (%) SEMIPERIODO ALTO SEMIPERIODO BAJO ; ; Inicial 0 % 0 us = 0 x 100 us us = 100 x 100 us ; Primera 10 % 1000 us = 10 x 100 us 9000 us = 90 x 100 us ; Segunda 20 % 2000 us = 20 x 100 us 8000 us = 80 x 100 us ; Tercera 30 % 3000 us = 30 x 100 us 7000 us = 70 x 100 us ; Cuarta 40 % 4000 us = 40 x 100 us 6000 us = 60 x 100 us ; Quinta 50 % 5000 us = 50 x 100 us 5000 us = 50 x 100 us ; Sexta 60 % 6000 us = 60 x 100 us 4000 us = 40 x 100 us ; Septima 70 % 7000 us = 70 x 100 us 3000 us = 30 x 100 us ; Octava 80 % 8000 us = 80 x 100 us 2000 us = 20 x 100 us ; Novena 90 % 9000 us = 90 x 100 us 1000 us = 10 x 100 us ; Décima 100 % us = 100 x 100 us 0 us = 0 x 100 us 255

264 ; Al conectarlo por primera vez se genera un ciclo de trabajo de 0%, al presionar el pulsador ; cambia al 10%, al actuar una segunda vez cambia al 20%, y así sucesivamente. ; El modulo LCD visualiza el ciclo de trabajo vigente en cada momento. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* INCLUDE <P16F84A.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 ******************************************************************************** TMR0_Carga EQU d'89' ; El semiperiodo patron va a ser de 100 us. IncrementoDC EQU d'10' ; Incremento de cada paso del ciclo de trabajo. #DEFINE Salida #DEFINE Pulsador PORTB,2 PORTB,7 ;**************************** Registros ********************************************************************************* CBLOCK 0x0C CicloTrabajo Timer0_ContadorA ; Ciclo de trabajo deseado. ; Contador auxiliar. ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto ServicioInterrupcion ;****************************************** Subrutina "Mensajes" ******************************************************* ORG 0X05 Mensajes addwf PCL,F Mensaje_DC Mensaje_TantoPorCiento DT "Duty Cycle: ", 0x00 DT "% ", 0x00 256

265 ;*************************************** Sección de Configuración ***************************************************** COMIENZO bsf STATUS,RP0 bcf Salida bsf Pulsador movlw b' ' ; TMR0 sin prescaler. movwf OPTION_REG bcf STATUS,RP0 call LCD_Inicializa call DC_CeroPorCiento ; Inicializa con un DC=0%, por tanto salida movlw b' ' ; en bajo permanentemente. movwf INTCON ; Habilita solo interrupcion RBI. ;**************************************************** Principal *********************************************************** Principal goto Principal ;********************************* Rutina de interrupción "ServicioInterrupcion" ************************************** ServicioInterrupcion btfsc INTCON,RBIF ; Interrupcion por cambio en el Puerto B? call Pulsador_Interrupcion btfsc INTCON,T0IF ; Interrupcion por desbordamiento del TMR0? call Timer0_interrupción bcf INTCON,RBIF ; Limpia flags de reconocimiento. bcf INTCON,T0IF retfie ;*************************************** Subrutina "Pulsador_Interrupcion" ******************************************** ; Subrutina de atención a la interrupción por cambio en la línea RB7 donde se ha ; conectado un pulsador. ; Incrementa el registro (CicloTrabajo), desde 0 (que corresponde a un DC = 0% ; hasta d'100' (que corresponde a un ciclo de trabajo del 100%). Pulsador_Interrupcion call Retardo_20ms btfsc Pulsador ; Si no es la linea del pulsador sale. goto Fin_PulsadorInterrupcion bsf INTCON,T0IE ; En principio habilita interrupciones TMR0. movlw IncrementoDC ; Se le va a sumar al ciclo de trabajo addwf CicloTrabajo,W ; (W)=(CicloTrabajo)+IncrementoDC movwf CicloTrabajo ; Guarda resultado. sublw d'100' ; Si DC ha llegado al 100% la salida btfsc STATUS,Z ; pasa a alto permanentemente. goto DC_100PorCiento btfsc STATUS,C ; Si pasa de 100, lo inicializa. goto Visualiza DC_CeroPorCiento bcf Salida ; Pone la salida siempre en bajo. clrf CicloTrabajo ; Inicializa el ciclo de trabajo a 0%. goto InhabilitaInterrupcionTMR0 DC_100PorCiento bsf Salida ; Pone la salida siempre en alto. movlw d'100' ; Esta al maximo, DC=100%. movwf CicloTrabajo InhabilitaInterrupcionTMR0 bcf INTCON,T0IE Visualiza call VisualizaCicloTrabajo ; Visualiza el ciclo de trabajo seleccionado. 257

266 EsperaDejePulsar btfss Pulsador goto EsperaDejePulsar Fin_PulsadorInterrupcion movf CicloTrabajo,W ; Carga todos los contadores. movwf Timer0_ContadorA movlw TMR0_Carga movwf TMR0 return ;************************************* Subrutina "Timer0_interrupción" ************************************************ ; Mantiene la salida en alto un tiempo igual a 100us x (CicloTrabajo) ; y en bajo un tiempo igual a 100us x (100-CicloTrabajo). Timer0_interrupción EstabaBajo movlw TMR0_Carga movwf TMR0 decfsz Timer0_ContadorA,F ; Decrementa el contador. goto Fin_Timer0_interrupción btfsc Salida ;Testea el anterior estado de la salida. goto EstabaAlto nop bsf Salida ; Estaba bajo y lo pasa a alto. movf CicloTrabajo,W ; Repone el contador nuevamente movwf Timer0_ContadorA ; con el tiempo en alto. nop goto Fin_Timer0_interrupción EstabaAlto bcf Salida ; Estaba alto y lo pasa a bajo. movf CicloTrabajo,W ; Repone el contador nuevamente sublw.100 ; con el tiempo en bajo. movwf Timer0_ContadorA Fin_Timer0_interrupción return ;********************************* Subrutina "VisualizaCicloTrabajo" ************************************************** ; Visualiza el ciclo de trabajo en el visualizador LCD. Se hace de manera tal que cuando ; haya que visualizar un numero mayor de 9, las decenas siempre se visualicen aunque sean ; cero. Y cuando sea menor de 99 las decenas no se visualicen si es cero. VisualizaCicloTrabajo call Retardo_100ms call LCD_Linea1 ; Visualiza el ciclo de trabajo seleccionado. movlw Mensaje_DC call LCD_Mensaje movf CicloTrabajo,W call BIN_a_BCD ; Lo pasa a BCD. movf BCD_Centenas,W ; Visualiza las centenas. btfss STATUS,Z ; Si son cero no visualiza las centenas. goto VisualizaCentenas movf CicloTrabajo,W ; Vuelve a recuperar este valor. call BIN_a_BCD ; Lo pasa a BCD. call LCD_Byte ; Visualiza las decenas y unidades. goto VisualizaTantoPorCiento VisualizaCentenas call LCD_Nibble ; Visualiza las centenas. movf CicloTrabajo,W ; Vuelve a recuperar este valor. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto ; Visualiza las decenas (aunque sea cero) y ; unidades. 258

267 VisualizaTantoPorCiento movlw Mensaje_TantoPorCiento ; Y ahora el símbolo "%". call LCD_Mensaje return ;******************************************** Librerías *************************************************************** INCLUDE <LCD_MENS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> END Int_Re_01.asm ( Entrenador Básico 11 ) title "Reloj digital en tiempo real sin puesta en hora " title " utilizando la interrupción del Timer 0 " ;********************************************** Int_Re_01.asm ********************************************************** ; Programa para un reloj digital en tiempo real sin puesta en hora. Visualiza en un formato: ; " 8:47:39" (Segunda línea). ; Las temporizaciones necesarias del reloj se logran mediante interrupciones por desbordamiento ; del Timer 0 cada 50 ms. también actualiza un contador llamado MedioSegundo incrementado cada ; 500 ms y que será utilizado en las intermitencias de posteriores programas. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;*************** Asignación de nombres de Registros de Funciones especiales a direcciones ******************* INCLUDE <P16F84A.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 ******************************************************************************** TMR0_Carga50ms EQU d'195' ; Para conseguir la interrupcion del ; Timer 0 cada 50 ms. ;**************************** Registros ********************************************************************************* CBLOCK 0x0C Hora ; Guarda las horas. 259

268 Minuto Segundo MedioSegundo Registro50ms ; Guarda los minutos. ; Guarda los segundos. ; Se incrementa cada medio segundo. ; Se incrementa cada 50ms. ENDC ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 ;Direccion del Vector Reset GOTO COMIENZO ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto Timer0_interrupción ;*************************************** Sección de Configuración ***************************************************** ORG 0x05 COMIENZO call LCD_Inicializa bsf STATUS,RP0 ; Acceso al Banco 1. movlw b' ' ; Prescaler de 256 para el TMR0 y habilita movwf OPTION_REG ; resistencias de Pull-Up del Puerto B. bcf STATUS,RP0 ; Acceso al Banco 0. clrf Hora ; Inicializa todos los datos del reloj. clrf Minuto clrf Segundo clrf MedioSegundo clrf Registro50ms movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw b' ' ; Activa interrupcion del TMR0 (TOIE) movwf INTCON ; y la general (GIE). ;**************************************************** Principal *********************************************************** ; La sección "Principal" es de mantenimiento. Solo espera las interrupciones. ; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0. Principal goto Principal ;********************************* Rutina de interrupción "Timer0_interrupción" ************************************* Timer0_interrupción btfsc INTCON,T0IF ; Si es una interrupcion procedente del call Reloj ; desbordamiento del Timer 0, actualiza el reloj. ; correspondiente. FinInterrupcion bcf INTCON,T0IF retfie ;************************************************ Subrutina "Reloj" ***************************************************** ; Esta subrutina actualiza los contadores Horas, Minutos, Segundos, MedioSegundo y Registro50ms. ; Se ejecuta debido a la petición de interrupción del Timer 0, cada 50 ms. ; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada us y se desborda cada ; 195 x 256 = µ. Sumándole el retardo de 71 us y el pequeño tiempo de los saltos iniciales 260

269 ; y de carga del contador, resulta un total de us exactos. Es decir, el TMR0 producirá ; una interrupción cada 50 ms exactos, comprobado experimentalmente con la ventana Stopwatch del ; simulador del MPLAB. Reloj call Retardo_50micros ; Retardo de 71 us para call Retardo_20micros ; ajustar a 50 ms exactos. nop movlw TMR0_Carga50ms ; Carga el timer 0. movwf TMR0 call IncrementaRegistro50ms btfss STATUS,C ; Ha contado 10 veces 50 ms = 1/2 segundo? goto FinReloj ; No. Pues sale sin visualizar el reloj. IncrementaReloj call IncrementaMedioSegundo btfss STATUS,C ; Ha pasado 1 segundo? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaSegundos ; Si. Incrementa el segundero. btfss STATUS,C ; Han pasado 60 segundos? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaMinutos ; Si. Incrementa el minutero. btfss STATUS,C ; Han pasado 60 minutos? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaHoras ; Si. Incrementa las horas. ActualizaReloj call VisualizaReloj ; Visualiza el reloj. FinReloj return ;******************************************* Subrutina "VisualizaReloj" ************************************************* ; Visualiza el reloj en la segunda línea en formato: " 8:47:39" (Segunda línea). VisualizaReloj movlw d'4' ; Se coloca para centrar la visualizacion call LCD_PosicionLinea2 ; en la segunda linea. movf Hora,W ; Va a visualizar las horas. call BIN_a_BCD ; Lo pasa a BCD. call LCD_Byte ; Visualiza rechazando el cero de las decenas. movlw ':' ; Envia ":" para separar datos. call LCD_Caracter movf Minuto,W ; Visualiza minutos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto movlw ':' ; Envia ":" para separar datos. call LCD_Caracter movf Segundo,W ; Visualiza segundos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto return ;***************************************** Subrutina "IncrementaRegistro50ms" ************************************** ; Incrementa el valor de la variable Registro50ms. Cuando llega a 10, lo cual supone ; medio segundo (50 ms x 10 = 500 ms), lo resetea y sale con el Carry a "1". IncrementaRegistro50ms incf Registro50ms,F movlw d'10' subwf Registro50ms,W ; (W)=(Registro50ms)-10 btfsc STATUS,C ; C=0?, (W) negativo?, (Registro50ms)<10? clrf Registro50ms ; Lo inicializa si ha superado su valor máximo. return 261

270 ;************************************* Subrutina "IncrementaMedioSegundo" ***************************************** ; Incrementa el valor de la variable MedioSegundo. Su bit de menor peso se pondrá a "1" una ; vez por segundo. IncrementaMedioSegundo incf MedioSegundo,F ; Incrementa. bsf STATUS,C ; Supone que ha llegado al segundo. btfss MedioSegundo,0 ; El bit 0 se pondrá a "1" cada segundo. bcf STATUS,C return ;************************************* Subrutina "IncrementaSegundos" ********************************************** ; Incrementa el valor de la variable Segundos. Si es igual al valor máximo de 60 lo resetea ; y sale con el Carry a "1". IncrementaSegundos incf Segundo,F ; Incrementa los segundos. movlw d'60' subwf Segundo,W ; Ha superado valor máximo?. (W)=(Segundo)-60. btfsc STATUS,C ; C=0?, (W) negativo?, (Segundo)<60? clrf Segundo ; Lo inicializa si ha superado su valor maximo. return ;***************************************** Subrutina "IncrementaMinutos" ********************************************* ; Incrementa el valor de la variable Minuto. Si es igual al valor máximo de 60 lo resetea ; y sale con el Carry a "1". IncrementaMinutos incf Minuto,F ; Incrementa los minutos. movlw d'60' subwf Minuto,W ; Ha superado su valor máximo?. (W)=(Minuto)-60. btfsc STATUS,C ; C=0?, (W) negativo?, (Minuto)<60? clrf Minuto ; Lo inicializa si ha superado su valor maximo. return ;******************************************* Subrutina "IncrementaHoras" ********************************************* ; Incrementa el valor de la variable Hora. Si es igual al valor máximo de 24 lo resetea ; y sale con el Carry a "1". IncrementaHoras incf Hora,F ; Incrementa las horas. movlw.24 subwf Hora,W ; Ha superado su valor máximo?. (W)=(Hora)-24. btfsc STATUS,C ; C=0?, (W) negativo?, (Hora)<24? clrf Hora ; Lo inicializa si ha superado su valor máximo. return ;******************************************** Librerias *************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <BIN_BCD.INC> END 262

271 Int_Re_04.asm ( Entrenador Básico 11 ) title " Reloj digital en tiempo real con puesta en hora. " ;***************************************************** Int_R_04.asm **************************************************** ; Programa para un reloj digital en tiempo real con puesta en hora. Visualiza los datos ; en formato: ; - "Mensaje Publicitario" (Primera línea) ; - "Horas:Minutos:Segundos", (Segunda Linea) ; (por ejemplo "I.E.S. Joan Miro" (Primera línea) ; " 8:47:39" (Segunda Línea). ; Las temporizaciones necesarias del reloj se logran mediante el Timer 0 que ; produce una interrupción cada 50 ms. ; La "PuestaEnHora" se logra mediante dos pulsadores: "MODO" e "INCREMENTAR". ; Su modo de operación es: ; 1º. Pulsa MODO, las "Horas" se ponen intermitente y se ajustan mediante el ; pulsador INCREMENTAR. ; 2º. Pulsa MODO y pasa a ajustar los "Minutos" de forma similar. ; 3º. Pulsa "MODO" y se acabo la "PuestaEnHora", pasando a visualización normal. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a ;****************** Asignación de nombres de Registros de Funciones especiales a direcciones **************** INCLUDE <P16F84A.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 ******************************************************************************** #DEFINE ModoPulsador PORTB,7 ; Los pulsadores se conectan a estos #DEFINE IncrementarPulsador PORTB,6 ; pines del Puerto B. #DEFINE F_AjusteHora FlagsAjuste,1 ; Flags utilizados en la puesta en hora. #DEFINE F_AjusteMinuto FlagsAjuste,0 #DEFINE F_Intermitencia Intermitencia,0 ; Si es 0, apaga en intermitencia. TMR0_Carga50ms EQU d'195' ; Para conseguir la interrupcion del ; Timer 0 cada 50 ms. ;**************************** Registros ********************************************************************************* CBLOCK 0x0C 263

272 Hora Minuto Segundo MedioSegundo Registro50ms Intermitencia FlagsAjuste ENDC ; Guarda las horas. ; Guarda los minutos. ; Guarda los segundos. ; Incrementa cada medio segundo. ; Incrementa cada 50 ms ; Para lograr la intermitencia. ; Guarda los flags para establecer los ; ajustes de hora y minuto. ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Direccion del Vector Reset ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto ServicioInterrupcion ;****************************************** Subrutina "Mensajes" ******************************************************* ORG 0X05 Mensajes addwf PCL,F MensajePublicitario DT "I.E.S. Joan Miro", 0x00 ;*************************************** Sección de Configuración ***************************************************** COMIENZO call LCD_Inicializa movlw MensajePublicitario call LCD_Mensaje bsf STATUS,RP0 ; Acceso al Banco 1. movlw b' ' ; Prescaler de 256 para el TMR0 y habilita movwf OPTION_REG ; resistencias de Pull-Up del Puerto B. bsf ModoPulsador ; Configurados como entrada. bsf IncrementarPulsador bcf STATUS,RP0 ; Acceso al Banco 0. clrf FlagsAjuste ; Inicializa todos los flags de la puesta en hora. clrf Hora ; Inicializa todos los datos del reloj. clrf Minuto clrf Segundo clrf MedioSegundo clrf Registro50ms movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw b' ' ; Activa interrupcion del TMR0 (TOIE), por cambio movwf INTCON ; lineas del Puerto B (RBIE) y la general (GIE). call PuestaEnHoraReset ; Puesta en hora por primera vez. ;**************************************************** Principal ********************************************************** ; La sección "Principal" es mantenimiento. Solo espera las interrupciones. ; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0. Principal goto Principal 264

273 ;********************************* Rutina de interrupción "ServicioInterrupcion" ************************************** ; Detecta que ha producido la interrupción y ejecuta la subrutina de atención correspondiente. ServicioInterrupcion btfsc INTCON,T0IF ; Si es una interrupcion procedente del call Reloj ; desbordamiento del Timer 0, actualiza el reloj. btfss INTCON,RBIF ; Si es una interrupcion RBI, lee los pulsadores. goto FinInterrupcion btfss ModoPulsador ; Esta presionado el pulsador de "MODO"? call PuestaEnHora ; Si, pasa a poner en hora. btfss IncrementarPulsador ; Pulsado "INCREMENTAR"?. call Incrementar ; Si, pasa a incrementar el registro de tiempo ; correspondiente. FinInterrupcion bcf INTCON,RBIF bcf INTCON,T0IF retfie ;********************************************* Subrutina "Reloj" ********************************************************* ; Esta subrutina actualiza los contadores Horas, Minutos, Segundos y Registro50ms. ; Se ejecuta debido a la petición de interrupción del Timer 0 cada 50 ms. ; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada us y se desborda cada ; 195 x 256 = us. Sumándole el retardo de 71 us y el pequeño tiempo de los saltos ; iniciales y de carga del contador, resulta un total de us exactos. Es decir, el ; TMR0 producirá una interrupción cada 50 ms exactos, comprobado experimentalmente con la ; ventana Stopwatch del simulador del MPLAB. Reloj call Retardo_50micros ; Retardo de 71 microsegundos para call Retardo_20micros ; ajustar a 50 milisegundos exactos. nop movlw TMR0_Carga50ms ; Carga el Timer 0. movwf TMR0 call IncrementaRegistro50ms btfss STATUS,C ; Ha contado 10 veces 50 ms = 1/2 segundo? goto FinReloj ; No. Pues sale sin visualizar el reloj. ; Si esta en "ModoAjusteHora", o "ModoAjusteMinuto" conmuta el flag de intermitencia y ; salta a visualizar el reloj. movf FlagsAjuste,F btfsc STATUS,Z goto IncrementaReloj movlw b' ' ; Conmuta el flag F_Intermitencia cada 500 ms. xorwf Intermitencia,F goto ActualizaReloj ; Visualiza el reloj y sale. IncrementaReloj bsf F_Intermitencia ; Se mantendra siempre encendido durante call IncrementaMedioSegundo ; el funcionamiento normal. btfss STATUS,C ; Ha pasado 1 segundo? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaSegundos ; Si. Incrementa el segundero. btfss STATUS,C ; Han pasado 60 segundos? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaMinutos ; Si. Incrementa el minutero. btfss STATUS,C ; Han pasado 60 minutos? goto ActualizaReloj ; No. Pues sale visualizando el reloj. call IncrementaHoras ; Si. Incrementa las horas. 265

274 ActualizaReloj call VisualizaReloj ; Visualiza el reloj. FinReloj return ;***************************************** Subrutina "VisualizaReloj" *************************************************** ; Visualiza el reloj en la segunda línea en formato: " 8:47:39". ; Cuando se ajusta una variable, esta debe aparecer en intermitencia. Para ello, utiliza ; el flag F_Intermitencia que conmuta cada 500 ms en la subrutina Reloj. VisualizaReloj movlw d'4' ; Para centrar visualizacion call LCD_PosicionLinea2 ; en la segunda linea. btfss F_AjusteHora ; Esta en la puesta en hora? goto EnciendeHoras ; No. visualización normal. btfss F_Intermitencia ; Si. Intermitencia si procede. goto ApagaHoras ; Apaga las horas en la intermitencia. EnciendeHoras movf Hora,W ; Va a visualizar las horas. call BIN_a_BCD ; Lo pasa a BCD. call LCD_Byte ; Visualiza rechazando cero de las decenas. goto VisualizaMinutos ApagaHoras call LCD_DosEspaciosBlancos ; Visualiza dos espacios en blanco. VisualizaMinutos movlw ':' ; Envia ":" para separar datos. call LCD_Caracter btfss F_AjusteMinuto ; Esta en la puesta en hora?. goto EnciendeMinutos btfss F_Intermitencia goto ApagaMinutos EnciendeMinutos movf Minuto,W ; Visualiza minutos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto goto VisualizaSegundos ApagaMinutos call LCD_DosEspaciosBlancos ; Visualiza dos espacios en blanco. VisualizaSegundos movlw ':' ; Envía ":" para separar datos. call LCD_Caracter movf Segundo,W ; Visualiza segundos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_ByteCompleto return ;****************************************** Subrutina "Incrementar" **************************************************** ; Subrutina de atención a la interrupción por cambio de la línea RB6 al cual se ha conectado ; el pulsador "INCREMENTAR". Incrementa según corresponda una sola de las variables. Incrementar call Retardo_20ms ; Espera se estabilicen niveles de tension. btfsc IncrementarPulsador ; Si es un rebote sale fuera. goto FinIncrementar bsf F_Intermitencia ; Visualiza siempre mientras incrementa. btfsc F_AjusteHora call IncrementaHoras btfsc F_AjusteMinuto call IncrementaMinutos 266

275 call Retardo_100ms call VisualizaReloj ; Visualiza mientras espera que deje call Retardo_200ms ; de pulsar. btfss IncrementarPulsador ; Mientras permanezca pulsado, goto Incrementar ; incrementa el digito. FinIncrementar return ;************************************** Subrutina "IncrementaRegistro50ms" ***************************************** ; Incrementa el valor de la variable Registro50ms. Cuando llega a 10, lo cual supone ; medio segundo (50 ms x 10 = 500 ms), lo resetea y sale con el Carry a "1". IncrementaRegistro50ms incf Registro50ms,F movlw d'10' subwf Registro50ms,W ; (W)=(Registro50ms)-10. btfsc STATUS,C ; C=0?, (W) negativo?, (Registro50ms)< 10? clrf Registro50ms ; Lo inicializa si ha superado su valor máximo. return ;************************************** Subrutina "IncrementaMedioSegundo" **************************************** ; Incrementa el valor de la variable MedioSegundo. Su bit de menor peso se pondrá a "1" una ; vez por segundo. IncrementaMedioSegundo incf MedioSegundo,F ; Incrementa. bsf STATUS,C ; Supone que ha llegado al segundo. btfss MedioSegundo,0 ; El bit 0 se pondrá a uno cada segundo. bcf STATUS,C return ;***************************************** Subrutina "IncrementaSegundos" ****************************************** ; Incrementa el valor de la variable Segundo. Si es igual al valor máximo de 60 lo resetea ; y sale con el Carry a "1". IncrementaSegundos incf Segundo,F ; Incrementa los segundos. movlw d'60' subwf Segundo,W ; Ha superado valor máximo?. (W)=(Segundo)-60. btfsc STATUS,C ; C=0?, (W) negativo?, (Segundo)<60? clrf Segundo ; Lo inicializa si ha superado su valor maximo. return ;******************************************* Subrutina "IncrementaMinutos" ******************************************* ; Incrementa el valor de la variable Minuto. Si es igual al valor máximo de 60 lo resetea ; y sale con el Carry a "1". IncrementaMinutos incf Minuto,F ; Incrementa los minutos. movlw d'60' subwf Minuto,W ; Ha superado su valor máximo?. (W)=(Minuto)-60. btfsc STATUS,C ; C=0?, (W) negativo?, (Minuto)<60? clrf Minuto ; Lo inicializa si ha superado su valor maximo. return 267

276 ;******************************************** Subrutina "IncrementaHoras" ******************************************** ; Incrementa el valor de la variable Hora. Si es igual al valor máximo de 24 lo resetea ; y sale con el Carry a "1". IncrementaHoras incf Hora,F ; Incrementa las horas. movlw.24 subwf Hora,W ; Ha superado su valor máximo?. (W)=(Hora)-24. btfsc STATUS,C ; C=0?, (W) negativo?, (Hora)<24? clrf Hora ; Lo inicializa si ha superado su valor maximo. return ;********************************************* Subrutina "PuestaEnHora" ********************************************** ; Subrutina de atención a la interrupción producida por el pulsador "MODO" que pone en hora ; el reloj. Cada vez que se pulsa, el "1" es desplazado a través del registro (FlagsAjuste), ; pasando a ajustar secuencialmente: horas y minutos. ; Para comprender el funcionamiento de esta subrutina hay que saber que el registro FlagsModos ; contiene 2 flags que permiten diferenciar cada uno de los ajustes de registros de tiempo. ; - "F_AjusteHora": bit 1 de "FlagsAjuste", para ajustar las horas. ; - "F_AjusteMinuto": bit 0 de "FlagsAjuste", para ajustar los minutos. ; así pues el contenido del registro FlagAjuste identifica los siguientes ajustes: ; - (FlagsAjuste)= Esta ajustando el registro Hora. ; - (FlagsAjuste)= Esta ajustando el registro Minuto. ; - (FlagsAjuste)= Esta en visualización normal del reloj en tiempo real. ; Pueden ocurrir tres casos: ; - Que pulse "MODO" estando en modo de visualización normal que se identifica porque ; (FlagsAjuste)=0. En este caso debe activar el flag F_AjusteHora, es decir carga ; (FlagsAjuste)=b' ', ya que "F_AjusteHora" es el bit 1 del registro FlagsAjuste. ; - Que pulse "MODO" estando ya en la puesta en hora, en cuyo caso debe pasar al ajuste ; del siguiente registro de tiempo (minutos). Esto lo hace mediante un desplazamiento a ; derechas. así, por ejemplo, si antes estaba ajustando las horas (FlagsAjuste)=b' ', ; pasara a (FlagsAjuste)=b' ' identificado como ajuste de los minutos. ; - Que pulse "MODO" estando en el último ajuste correspondiente a los minutos, ; (FlagsAjuste)=b' ', pasara a (FlagsAjuste)=b' ', indicando que la puesta ; en hora ha terminado y pasa a visualización normal del reloj en tiempo real. PuestaEnHora call Retardo_20ms ; Espera a que se estabilicen niveles. btfsc ModoPulsador ; Si es un rebote sale fuera. goto FinPuestaEnHora PuestaEnHoraReset siguiente. ; Al pulsar "MODO" se apaga la variable de bcf F_Intermitencia ; tiempo que se va a ajustar. movf FlagsAjuste,F ; Si antes estaba en funcionamiento normal, ahora btfss STATUS,Z ; pasa a ajustar la hora. goto AjustaSiguiente ; Si no pasa a ajustar la variable de tiempo bsf F_AjusteHora ; Pasa a ajustar la hora. clrf Segundo ; Inicializa contador de segundos y el resto. clrf MedioSegundo clrf Registro50ms goto FinPuestaEnHora 268

277 AjustaSiguiente ; Desplaza un "1" a la derecha del registro bcf STATUS,C ; FlagsAjuste para ajustar secuencialmente rrf FlagsAjuste,F ; cada uno de los registros de tiempo: ; hora y minuto. FinPuestaEnHora call VisualizaReloj btfss ModoPulsador ; Ahora espera deje de pulsar. goto FinPuestaEnHora return ;******************************************** Librerías *************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <BIN_BCD.INC> END Int_Temp.asm ( Entrenador Básico 11 ) title " Temporizador digital de precisión " ;************************************************* INT_Temp.asm ****************************************************** ; Programa de control para un temporizador digital de precisión. La programación del tiempo ; de temporización se realiza mediante dos pulsadores: "AJUSTE" y "ON/INCREM". Funcionamiento: ; - En estado de reposo la salida del temporizador esta apagada y el pantalla aparece el ; tiempo deseado para la próxima temporización. ; - Si se pulsa "ON/INCREM" comienza la temporización. ; - Cuando acaba la temporización pasa otra vez a reposo. ; - Si pulsa "AJUSTE" antes que haya acabado el tiempo de temporización actúa como pulsador ; de paro: interrumpe la temporización, apaga la carga y pasa al estado de reposo. ; Para ajustar la temporización al tiempo deseado. ; - Pulsa "AJUSTE" y ajusta el tiempo deseado mediante el pulsador "ON/INCREM". ; - Se vuelve a pulsar "AJUSTE" y pasa a modo de reposo. ; Al apagar el sistema debe conservar el tiempo de temporización deseado para la próxima vez ; que se encienda. ; Programa para PIC 16F84a. ; Velocidad del Reloj:1 MHz. ; Reloj instrucción: 250 KHz = 4 us. ; Perro Guardián deshabilitado. ; Tipo de Reloj XT. ; Protección de Código: OFF. ; Power Reset: ON ;************************************** Elegimos PIC ******************************************************************** LIST p=16f84a 269

278 ;**************** Asignación de nombres de Registros de Funciones especiales a direcciones ****************** INCLUDE <P16F84A.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 ******************************************************************************** ;***************************** Registros ********************************************************************************* CBLOCK 0x0C Tiempo deseado Tiempo FlagsModos ENDC ; El tiempo deseado de temporización. ; Tiempo que resta de temporización. ; Guarda los flags con los diferentes ; modos de funcionamiento. ;**************************** Igualdades en zona EEPROM *********************************************************** ORG 0x2100 ; Corresponde a la direccion 0 de la zona ; EEPROM de datos. Aquí se va a guardar el DE 0x00 ; tiempo de temporización deseado. #DEFINE F_Temporizador_ON #DEFINE F_Temporizador_Ajuste #DEFINE F_Temporizador_OFF FlagsModos,2 FlagsModos,1 FlagsModos,0 #DEFINE SalidaTemporizador PORTB,1 ; Salida donde se conecta la carga. #DEFINE Zumbador PORTB,2 ; Salida donde se conecta el zumbador. #DEFINE AjustePulsador PORTB,7 ; Los pulsadores estan conectados a estas #DEFINE IncrementarPulsador PORTB,6 ; lineas del Puerto B. ;**************************** Sección Código de Reset **************************************************************** ORG 0X00 GOTO COMIENZO ;Direccion del Vector Reset ;Comienzo del Programa ;**************************** Vector de interrupción ******************************************************************** ORG 0x04 goto ServicioInterrupcion ;**************************** Subrutina de "Mensajes" ***************************************************************** ORG 0X05 Mensajes addwf PCL,F Mensaje_ON Mensaje_Ajuste DT " En MARCHA", 0x00 DT "Tiempo deseado:", 0x00 Mensaje_OFF DT " PARADO", 0x00 270

279 ;*************************************** Sección de Configuración ***************************************************** COMIENZO call LCD_Inicializa bsf STATUS,RP0 movlw b' ' ; Prescaler de 256 asignado al TMR0 habilita movwf OPTION_REG ; resistencias de Pull-Up del Puerto B. bsf AjustePulsador ; Configurados como entradas. bsf IncrementarPulsador bcf SalidaTemporizador ; Configurados como salidas. bcf Zumbador bcf STATUS,RP0 clrw ; Lee la posicion 0x00 de memoria EEPROM de call EEPROM_LeeDato ; datos donde se guarda el tiempo deseado de la movwf Tiempo deseado ; ultima vez que se ajusto. call ModoTemporizador_OFF ; Modo de funcionamiento inicial. movlw b' ' ; Activa interrupciones RBI. movwf INTCON ;**************************************************** Principal ********************************************************** Principal goto Principal ;******************************* Rutina de interrupción "ServicioInterrupcion" **************************************** ; Detecta que ha producido la interrupción y ejecuta la subrutina de atención correspondiente. ServicioInterrupcion btfsc INTCON,T0IF call Temporizador btfss INTCON,RBIF ; Si es una interrupcion RBI lee los pulsadores. goto FinInterrupcion btfss AjustePulsador ; Esta presionado el pulsador de "AJUSTE"?. call CambiarModo ; Si, pues salta a la subrutina correspondiente. btfsc IncrementarPulsador ; Pulsado "ON/INCREM"?. goto FinInterrupcion ; No, pues salta al final y sale. call Retardo_20ms ; Espera que se estabilice el nivel de tensión. btfsc IncrementarPulsador ; Si es un rebote del pulsador "ON/INCREM" sale fuera. goto FinInterrupcion btfsc F_Temporizador_OFF ; Estaba en reposo cuando pulso "ON/INCREM"? call ModoTemporizador_ON ; Si, pues comienza la temporizacion. btfsc F_Temporizador_Ajuste ; Estaba ajustando tiempo? call IncrementarTiempoDeseado ; Si, pues pasa a incrementar el tiempo deseado. FinInterrupcion bcf INTCON,RBIF ; Limpia los flags de reconocimiento. bcf INTCON,T0IF retfie ;******************** Subrutinas "CambiarModo" y todas las de MODO de funcionamiento *********************** ; ; Subrutina de atención a la interrupción producida al presionar el pulsador "AJUSTE" que cambia ; el modo de funcionamiento. ; Hay identificados tres modos de funcionamiento que se diferencian mediante los tres flags: ; A) Modo "Temporizador_OFF" o estado inicial. A el se pasa en el estado inicial cada vez 271

280 ; que termina una temporización o cuando se aborta la temporización sin esperar a que ; finalice. Reconocido por el flag F_Temporizador_OFF, bit 0 del registro FlagsModos. ; una temporización o cada vez que se aborta la temporización sin esperar a que finalice. ; B) Modo "Temporizador_Ajuste", donde se ajusta la temporización deseada cuando funcione ; como temporizador. Reconocido por el flag F_Temporizador_Ajuste, bit 1 del FlagsModos. ; C) Modo "Temporizador_ON", la salida esta activada mientras dure la temporización. ; Reconocido por el flag F_Temporizacion_ON, que es el bit 2 del registro FlagsModos. ; El programa consigue que esta activado uno solo de los flags anteriores. ; El contenido del registro (FlagsModos) diferencia los siguientes modos de funcionamiento: ; - (FlagsModos)=b' '. Está en el modo "Temporizador_OFF", en reposo. ; - (FlagsModos)=b' '. Está en el modo "Temporizador_Ajuste", ajustando tiempo deseado. ; - (FlagsModos)=b' '. Está en el modo "Temporizador_ON", activa la carga y temporizador. ; Al pulsar "AJUSTE" pueden darse tres casos: ; - Si estaba en modo "Temporizador_OFF", pasa a modo "Temporizador_Ajuste". ; - Si estaba en modo "Temporizador_Ajuste", pasa a modo "Temporizador_OFF", pero antes salva ; el tiempo de temporización deseado en la EEPROM de datos. ; - Si estaba en modo "Temporizador_ON", pasa a modo "Temporizador_OFF". (Interrumpe la ; temporización). CambiarModo call PitidoCorto ; Cada vez que pulsa origina un pitido. btfsc AjustePulsador ; Si es un rebote sale fuera. goto EsperaDejePulsar btfsc F_Temporizador_OFF ; Esta en reposo? goto ModoTemporizador_Ajuste ; Si, pues pasa a ajustar la temporizacion. btfss F_Temporizador_Ajuste ; Esta ajustando? goto ModoTemporizador_OFF ; No, pues pasa a reposo. ; Si, pues antes de pasar a reposo salva en la clrw ; posicion 00h de memoria EEPROM de datos el movwf EEADR ; tiempo de temporizacion deseado. Se conserva movf TiempoDeseado,W ; aunque se apague la alimentacion. call EEPROM_EscribeDato ModoTemporizador_OFF bcf SalidaTemporizador ; Apaga la carga y resetea tiempo deseado. call Pitido movlw b' ' ; Actualiza el registro FlagsModos pasando movwf FlagsModos ; al modo inicial "Temporizador_OFF". bcf INTCON,T0IE ; Prohibe las interrupciones del TMR0. movf TiempoDeseado,W ; Repone otra vez el tiempo que se desea movwf Tiempo ; para la proxima temporizacion. call LCD_Borra ; Borra la pantalla. movlw Mensaje_OFF ; En pantalla el mensaje correspondiente. goto FinCambiarModo ModoTemporizador_Ajuste call Retardo_100ms bcf SalidaTemporizador ; Apaga la carga movlw b' ' ; Actualiza el registro FlagsModos pasando movwf FlagsModos ; al modo "Temporizador_Ajuste". clrf Tiempo ; Resetea el tiempo. clrf Tiempo deseado bcf INTCON,T0IE ; Prohíbe las interrupciones del TMR0. call LCD_Borra movlw Mensaje_Ajuste ; En pantalla el mensaje correspondiente. goto FinCambiarModo 272

281 ModoTemporizador_ON movf TiempoDeseado,W ; Si el tiempo deseado es cero pasa a modo btfsc STATUS,Z ; de trabajo "Temporizador_OFF". goto ModoTemporizador_OFF movwf Tiempo call PitidoCorto movlw b' ' ; Actualiza el registro FlagsModos pasando movwf FlagsModos ; al modo "Temporizador_ON". movlw TMR0_Carga50ms ; Carga el TMR0. movwf TMR0 movlw Carga_1s ; Y el registro cuyo decremento contará los movwf Registro50ms ; segundos. bsf INTCON,T0IE ; Autoriza las interrupciones de TMR0. call LCD_Borra bsf SalidaTemporizador ; Enciende la carga. call Retardo_100ms movlw Mensaje_ON ; En pantalla el mensaje correspondiente. FinCambiarModo call LCD_Mensaje call VisualizaTiempo EsperaDejePulsar btfss AjustePulsador ; Espera deje de pulsar. goto EsperaDejePulsar return ;********************************* Subrutina "Temporizador" *********************************************************** ; Esta subrutina va decrementando el tiempo de temporización y visualizándolo en la pantalla. ; Se ejecuta debido a la petición de interrupción del Timer 0 cada 50 ms exactos, comprobado ; experimentalmente con la ventana "Stopwatch" del simulador del MPLAB. CBLOCK Registro50ms ; Guarda los incrementos cada 50 ms. ENDC TMR0_Carga50ms EQU d'195' ; Para conseguir la interrupcion cada 50 ms. Carga_1s EQU d'20' ; Leera cada segundo (20 x 50ms = 1000 ms). Temporizador call Retardo_50micros ; Ajuste fino de 71 microsegundos para call Retardo_20micros ; ajustar a 50 milisegundos exactos. nop movlw TMR0_Carga50ms ; Carga el Timer0. movwf TMR0 decfsz Registro50ms,F ; Decrementa el contador. goto FinTemporizador ; No ha pasado 1 segundo y por tanto sale. movlw Carga_1s ; Repone el contador nuevamente. movwf Registro50ms btfss F_Temporizador_ON ; Si no está en modo "Temporizador_ON" sale goto FinTemporizador ; fuera. decfsz Tiempo,F goto VisualizaContador ; Visualiza el tiempo restante. bcf SalidaTemporizador ; Apaga la salida call VisualizaTiempo ; Visualiza cero segundos en la pantalla. call Pitido ; Tres pitidos indican final de la temporización. call Retardo_500ms call Pitido call Retardo_500ms call PitidoLargo 273

282 call Retardo_500ms call ModoTemporizador_OFF ; Acabo la temporizacion. goto FinTemporizador VisualizaContador call VisualizaTiempo FinTemporizador return ;**************************************** Subrutina "VisualizaTiempo" ************************************************* ; Visualiza el registro Tiempo en formato "Minutos:Segundos". así por ejemplo, si ; (Tiempo)=124 segundos en la segunda línea de la pantalla visualiza " 2:04", ya que 124 ; segundos es igual a 2 minutos mas 4 segundos. VisualizaTiempo call Retardo_100ms movlw d'5' ; Para centrar visualizacion en la call LCD_PosicionLinea2 ; segunda linea. movf Tiempo,W ; Convierte el tiempo deseado (y expresado solo en call MinutosSegundos ; segundos) a minutos y segundos. movf TemporizadorMinutos,W ; Visualiza los minutos. call BIN_a_BCD ; Lo pasa a BCD. call LCD_Byte movlw ':' ; Visualiza dos puntos. call LCD_Caracter movf TemporizadorSegundos,W ; Visualiza los segundos. call BIN_a_BCD ; Lo pasa a BCD. goto LCD_ByteCompleto return ;**************************************** Subrutina "MinutosSegundos" *********************************************** ; Una cantidad expresada exclusivamente en segundos y contenida en el registro W es ; convertida a minutos y segundos. El resultado se guarda en dos posiciones de memoria ; llamadas TemporizadorMinutos y TemporizadorSegundos. ; El máximo numero a convertir será el 255 que es el máximo valor que puede adquirir el ; numero binario de entrada de 8 bits. (255 segundos = 4 minutos + 15 segundos) ; El procedimiento utilizado es mediante restas de 60 tal como se explica en el siguiente ; ejemplo que trata de la conversión del 124 segundos a minutos y segundos. ; 124 segundos = 2 minutos + 4 segundos. ; Minutos Segundos (Segundos)<60? ; ; NO. Resta 60 a (Segundos) e incrementa (Minutos). ; 1 64 NO. Resta 60 e (Segundos) e incrementa (Minutos). ; 2 4 Si, se acabo. ; ; Entrada: En el registro W el numero de segundos a convertir. ; Salidas: En (TemporizadorMinutos) y (TemporizadorSegundos) el resultado. CBLOCK TemporizadorMinutos TemporizadorSegundos ENDC ; MinutosSegundos movwf TemporizadorSegundos ; Carga el numero de segundos a convertir. clrf TemporizadorMinutos ; Carga los registros con el resultado inicial. Resta60 movlw d'60' ; Resta 60 en cada pasada. subwf TemporizadorSegundos,W ; (W)=(TemporizadorSegundos)

283 FinMinutosSegundos btfss STATUS,C ; (W) positivo?, (TemporizadorSegundos)>=60?. goto FinMinutosSegundos ; No, es menor de 60. Acabo. movwf TemporizadorSegundos ; Si, por tanto, recupera lo que queda por restar. incf TemporizadorMinutos,F ; Incrementa los minutos. goto Resta60 ; Y vuelve a dar otra pasada. return ;******************************* Subrutina "IncrementarTiempoDeseado" ******************************************** ; Subrutina de atención a la interrupción por cambio de la línea RB6 a la cual se ha ; conectado el pulsador "INCREMENTAR". ; Estando en el modo "Temporizador_Ajustar" incrementa el valor del tiempo deseado ; expresado en segundos en intervalos de 5 segundos y hasta un máximo de 255 segundos. SaltoIncremento EQU d'5' IncrementarTiempoDeseado call PitidoCorto ; Cada vez que pulsa se oye un pitido. movlw SaltoIncremento ; Incrementa el tiempo deseado de temporización addwf Tiempo,F ; saltos de "SaltoIncremento" segundos. btfsc STATUS,C ; Si pasa del valor maximo lo inicializa. clrf Tiempo call VisualizaTiempo ; Visualiza mientras espera que deje de pulsar. call Retardo_100ms btfss IncrementarPulsador ; Mientras permanezca pulsado, goto IncrementarTiempoDeseado ; incrementa el digito. movf Tiempo,W ; Actualiza el tiempo deseado. movwf Tiempo deseado ; Este es el tiempo deseado. return ;******************************* Subrutinas "PitidoLargo", "Pitido" y "PitidoCorto" *********************************** PitidoLargo bsf Zumbador call Retardo_500ms Pitido bsf Zumbador call Retardo_200ms PitidoCorto bsf Zumbador call Retardo_20ms bcf Zumbador return ;********************************************* Librerías ***************************************************************** INCLUDE <RETARDOS.INC> INCLUDE <BIN_BCD.INC> INCLUDE <LCD_4BIT.INC> INCLUDE <LCD_MENS.INC> INCLUDE <EEPROM.INC> END 275

Coche Teledirigido. Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes

Coche Teledirigido. Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes Coche Teledirigido Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes Índice Página 1.- Hardware... 2 1.1.- Esquema Eléctrico simulado del Mando y Coche Teledirigido...

Más detalles

Practica de PIC 16F84

Practica de PIC 16F84 Practica de PIC 16F84 Los PIC son circuitos que pueden controlar dispositivos y diferentes sistemas, son como los PLC (controles lógico programable), además debo decir que es un circuito que tiene todas

Más detalles

Microcontrolador PIC 16F84

Microcontrolador PIC 16F84 PROGRAMACIÓN PIC (II) Microcontrolador PIC 16F84 mail : enric.serra 0 - INTRODUCCIÓN. Este documento es una continuación al documento de programación del PIC 16f84. Este documento se puede copiar y utilizar

Más detalles

Bucles: o Bucles infinitos o Bucles finitos o Bucles anidados Medir tiempos con MPLAB Ejemplos y ejercicios

Bucles: o Bucles infinitos o Bucles finitos o Bucles anidados Medir tiempos con MPLAB Ejemplos y ejercicios SISTEMAS ELECTRÓNICOS Y AUTOMÁTICOS PRACTICAS DE MICROCONTROLADORES PIC PRÁCTICA 3: Bucles Bucles: o Bucles infinitos o Bucles finitos o Bucles anidados Medir tiempos con MPLAB Ejemplos y ejercicios -

Más detalles

[CURSO BÁSICO DE PIC TABLAS]

[CURSO BÁSICO DE PIC TABLAS] 2009 GRUPO ESTUDIANTIL INVENTRONICA Joel Oswaldo Campos Pérez [CURSO BÁSICO DE PIC ] En esta sección explicaremos que son las tablas, para que se usan y como se hacen. Se describe un ejercicio completo

Más detalles

Jesús Alberto Díaz Carmona Ingeniería en Informática. Curso 2005/06. Diseño de Sistemas Basados en Microprocesador

Jesús Alberto Díaz Carmona Ingeniería en Informática. Curso 2005/06. Diseño de Sistemas Basados en Microprocesador Jesús Alberto Díaz Carmona Ingeniería en Informática. Curso 2005/06. Diseño de Sistemas Basados en Microprocesador Descripción El proyecto se trata de un sistema de cámaras de vigilancia en circuito cerrado,

Más detalles

El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario.

El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario. 1 LENGUAJE ENSAMBLADOR El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario. El lenguaje ensamblador expresa las instrucciones de una

Más detalles

Programación en PIC Los primeros pasos

Programación en PIC Los primeros pasos Capítulo V Programación en PIC Los primeros pasos Encender y apagar un LED Secuenciador con cuatro LED's Leer los pulsadores y encender el LED correspondiente Programa avanzado utilizando el entrenador

Más detalles

Las Instrucciones. A continuación vamos a presentar el conjunto de instrucciones básico de los Microcontroladores Picmicro.

Las Instrucciones. A continuación vamos a presentar el conjunto de instrucciones básico de los Microcontroladores Picmicro. Las Instrucciones A continuación vamos a presentar el conjunto de instrucciones básico de los Microcontroladores Picmicro. En general la instrucciones de los microcontroladores pueden clasificarse como:

Más detalles

Programa del PIC 16F877A

Programa del PIC 16F877A APÉNDICE B Programa del PIC 16F877A ;* "CONTROL AUTOMÁTICO DE VELOCIDAD VEHICULAR". * ;* EL PRESENTE PROGRAMA TIENE COMO FINALIDAD CONTROLAR LA VELOCIDAD DEL * ;* VEHÍCULO, DEPENDIENDO DE LA SEÑAL RECIBIDA

Más detalles

Indice. Escrito por Administrator Martes, 02 de Septiembre de 2008 17:45 - Actualizado Domingo, 20 de Septiembre de 2009 07:45 1 / 15

Indice. Escrito por Administrator Martes, 02 de Septiembre de 2008 17:45 - Actualizado Domingo, 20 de Septiembre de 2009 07:45 1 / 15 1 / 15 El contenido del libro " MICROCONTROLADOR PIC16F84. Desarrollo de proyectos " de la Editorial Ra CAPÍTULOS: 1. MICROCONTROLADOR PIC16F84 2. PERIFÉRICOS BÁSICOS 3. GRABACIÓN DE MICROCONTROLADORES

Más detalles

Registros SFR vistos hasta ahora: Microcontroladores PIC

Registros SFR vistos hasta ahora: Microcontroladores PIC Registros SFR vistos hasta ahora: Microcontroladores PIC Microcontroladores PIC: Timer Características del Timer TMR0: Cumple básicamente la función de contador de eventos (o divisor de frecuencia). El

Más detalles

1. Proponer un circuito que tenga el puerto b como salida conectando 8 leds, realizando un programa que me encienda los bits 0, 1, 3, 5, 7.

1. Proponer un circuito que tenga el puerto b como salida conectando 8 leds, realizando un programa que me encienda los bits 0, 1, 3, 5, 7. 1. Proponer un circuito que tenga el puerto b como salida conectando 8 leds, realizando un programa que me encienda los bits 0, 1, 3, 5, 7. a. Diagrama de flujo b. Circuito C1 4 MHZ C2 R2 10k 16 15 4 R1

Más detalles

Proyectos con el PIC16F84

Proyectos con el PIC16F84 Capítulo 2 Proyectos con el PIC6F84 Conexión de LED y dipswitch Manejo de un display de siete segmentos Multiplexaje de teclados y displays Conexión de memorias seriales al PIC Manejo de un módulo LCD

Más detalles

Instrucciones para programar el PIC16F877

Instrucciones para programar el PIC16F877 Instrucciones para programar el PIC16F877 2 Estos microcontroladores responden a una serie de instrucciones o códigos que se deben grabar en su memoria de programa, en total son 35. A continuación se encuentra

Más detalles

Proyecto ROBOT-BALIZA

Proyecto ROBOT-BALIZA Proyecto ROBOT-BALIZA Departamento de Electricidad-Electrónica Alumno: Juan Manuel Romero Rodríguez Profesores: Pedro Alonso Sanz Alfonso García Gallego Juan Dongil García Instituto: I.E.S. Joan Miró Localidad:

Más detalles

Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A

Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A Proyecto Fin de Carrera 95 Antonio Andújar Caballero 8. PROGRAMACIÓN DEL PIC 16F876A. A la hora de realizar el programa de control para nuestro ecualizador,

Más detalles

LCD. Las pantallas de cristal líquido o módulos LCD, como. Módulo. con interface serial

LCD. Las pantallas de cristal líquido o módulos LCD, como. Módulo. con interface serial Módulo Módulo LCD con interface serial LCD con interface serial EDISON DUQUE C. Este módulo permite mostrar, en una pantalla de cristal líquido, los mensajes que son enviados desde una computadora o un

Más detalles

PIC MICRO ESTUDIO Reloj en tiempo real RTCU2 Clave: 719 www.electronicaestudio.com

PIC MICRO ESTUDIO Reloj en tiempo real RTCU2 Clave: 719 www.electronicaestudio.com PIC MICRO ESTUDIO Reloj en tiempo real RTCU2 Clave: 719 www.electronicaestudio.com Guía de Operación Reloj en tiempo real Modulo: RTCU2iempo real Clave: 719 El modulo 719 Reloj en tiempo real- utiliza

Más detalles

Tema: Utilización del módulo ADC en los microcontroladores PIC.

Tema: Utilización del módulo ADC en los microcontroladores PIC. 1 Facultad: Ingeniería Escuela: Electrónica Asignatura: Microcontroladores Lugar de ejecución: Laboratorio de microprocesadores, Edif. 3 Electrónica. Tema: Utilización del módulo ADC en los microcontroladores

Más detalles

1. ÍNDICE. Índice de contenido 2. INTRODUCCIÓN 3. CONTENIDO 1. OBJETIVOS DEL PROYECTO

1. ÍNDICE. Índice de contenido 2. INTRODUCCIÓN 3. CONTENIDO 1. OBJETIVOS DEL PROYECTO ULPGC, Universidad de Las Palmas de Gran Canarias. Facultad de Informática. Asignatura: Diseño de Sistemas Basados en Microprocesadores Profesor: Ricardo Pérez García. Regador Automático ACOSTA PADRÓN,

Más detalles

CALCULADORA DE FUNCIONES BÁSICAS Oscar Gregorio Pérez Macías [email protected]

CALCULADORA DE FUNCIONES BÁSICAS Oscar Gregorio Pérez Macías mummy007_02@hotmail.com CALCULADORA DE FUNCIONES BÁSICAS Oscar Gregorio Pérez Macías [email protected] RESUMEN La función de la calculadora de funciones básicas, es realizar las operaciones tales como: suma, resta y multiplicación

Más detalles

Transmisión de datos por Radio Frecuencia

Transmisión de datos por Radio Frecuencia Transmisión de datos por Radio Frecuencia Diseño de Sistemas Basados en Microcontrolador Universidad de Las Palmas de Gran Canaria 2003-04 José Carlos Ruiz Luque Francisco García Rodríguez 1 CONTENIDOS

Más detalles

Tema: Comunicación serie entre PIC y PC.

Tema: Comunicación serie entre PIC y PC. 1 Facultad: Ingeniería Escuela: Electrónica Asignatura: Microcontroladores Lugar de ejecución: Laboratorio de microprocesadores, Edif. 3 Electrónica. Tema: Comunicación serie entre PIC y PC. Objetivo general

Más detalles

Práctica 1. Introducción al laboratorio y al ensamblador del PIC. 1. Objetivos. 2. Introducción. 2.1 Ensamblar y simular

Práctica 1. Introducción al laboratorio y al ensamblador del PIC. 1. Objetivos. 2. Introducción. 2.1 Ensamblar y simular Práctica Introducción al laboratorio y al ensamblador del PIC Práctica Introducción al laboratorio y al ensamblador del PIC. Objetivos El objetivo de esta primera sesión es que el alumno aprenda el manejo

Más detalles

Sistema de seguridad con emisión de mensaje SMS

Sistema de seguridad con emisión de mensaje SMS Sistema de seguridad con emisión de mensaje SMS INDICE 1.- INTRODUCCIÓN Pág. 1 2.- ELEMENTOS HARDWARE EMPLEADOS. Pág. 1 3.- COMUNICACIÓN SERIE (Comandos at)... Pág. 4 4.- EXPLICACIÓN DEL PROGRAMA... Pág.

Más detalles

Microcontrolador PIC 16F84

Microcontrolador PIC 16F84 INTRODUCCIÓN A LA PROGRAMACIÓN Microcontrolador PIC 16F84 mail : enric.serra 0 - INTRODUCCIÓN. Este documento es una introducción a la programación del PIC 16f84. Este documento se puede copiar y utilizar

Más detalles

Manejo LCD Gráfico DSM

Manejo LCD Gráfico DSM Manejo LCD Gráfico DSM Christopher Orihuela Sosa 10/09/07 Índice Introducción...1 Hardware...2 LCD...3 patillaje...4 tabla de instrucciones...5 Timings...6 Organización de la pantalla...8 Circuito completo...9

Más detalles

Tema 6: Microcontroladores

Tema 6: Microcontroladores Tema 6: Microcontroladores Carlos Garre del Olmo 1 Microcontroladores Contenidos Introducción a los microcontroladores. Principales familias y sus características. La familia PIC16. Programación de microcontroladores.

Más detalles

Proyecto Final Robot. Docentes: Collovati Susana Lasarte Matias Correa Diego Integrante: Jesús Olguera

Proyecto Final Robot. Docentes: Collovati Susana Lasarte Matias Correa Diego Integrante: Jesús Olguera Proyecto Final Robot Docentes: Collovati Susana Lasarte Matias Correa Diego Integrante: Jesús Olguera 1 Introducción: En el siguiente informe se expone la construcción de un robot capaz de seguir líneas.

Más detalles

Rutinas de programación

Rutinas de programación Capítulo VI Rutinas de programación La suma La resta La rotación La multiplicación La división Conversión binario a BCD Suma BCD Conexión de displays al PIC Curso Básico de Microcontroladores PIC 79 80

Más detalles

RECURSOS FUNDAMENTALES

RECURSOS FUNDAMENTALES RECURSOS FUNDAMENTALES Los recursos que se considerarán son : Temporizadores Puertos de E/S La Palabra de Configuración EEPROM de datos 1 TEMPORIZADORES Una labor habitual en los programas de control suele

Más detalles

Indice General: :: Microcontroladores PIC - Parte IV - Trabajando con Display's y Tablas. Microcontroladores - Parte IV - Manejo de Tablas y Display's

Indice General: :: Microcontroladores PIC - Parte IV - Trabajando con Display's y Tablas. Microcontroladores - Parte IV - Manejo de Tablas y Display's Microcontroladores - Parte IV - Manejo de Tablas y Display's Tutorial bajado de... http://perso.wanadoo.es/luis_ju :: Microcontroladores PIC - Parte IV - Trabajando con Display's y Tablas. Indice General:

Más detalles

PRÁCTICA 4 LOS BITS DE CONFIGURACIÓN DEL PIC16F628

PRÁCTICA 4 LOS BITS DE CONFIGURACIÓN DEL PIC16F628 Los Bits de Configuración del PIC16F628 44 PRÁCTICA 4 LOS BITS DE CONFIGURACIÓN DEL PIC16F628 OBJETIVOS Identificar cada uno de los bits de configuración que rigen el funcionamiento del PIC16F628. Verificar

Más detalles

x u 05h - - RA5 RA4 RA3 RA2 RA1 RA0 Bit 7 6 5 4 3 2 1 0 Registro PORTA (05h)

x u 05h - - RA5 RA4 RA3 RA2 RA1 RA0 Bit 7 6 5 4 3 2 1 0 Registro PORTA (05h) 3..- Descriipciión Dettallllada dell PIIC16F877 Descripción Detallada del PIC16F87 3.1.- Los Puertos Paralelos de Entrada / Salida Los integrados PIC16F874 y PIC16F877 poseen 5 puertos de entrada / salida

Más detalles

17 Con el chorro de agua pequeño, la cubeta se llena en 10 minutos

17 Con el chorro de agua pequeño, la cubeta se llena en 10 minutos 17 Con el chorro de agua pequeño, la cubeta se llena en 10 minutos Cuál será el valor de precarga necesario para que este sistema nos indique que ha transcurrido un tiempo de 6 minutos? Seria depositar

Más detalles

Pines de entrada/salida (I/O) de propósito general. Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos.

Pines de entrada/salida (I/O) de propósito general. Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos. 1 Pines de entrada/salida (I/O) de propósito general Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos. Para añadir flexibilidad al micro, muchos de sus pines de entrada/salida

Más detalles

Energía fotovoltaica y su aplicación rural

Energía fotovoltaica y su aplicación rural Energía fotovoltaica y su aplicación rural Antonio Blanco Solsona, Francisco García Trobat [email protected] [email protected] INTRODUCCIÓN En las fincas rurales aisladas es cada vez más necesario

Más detalles

Control de pantallas de cristal líquido mediante PIC

Control de pantallas de cristal líquido mediante PIC INGENIERÍA Control de pantallas de cristal líquido mediante PIC Ejemplo práctico de interconexión y control de una pantalla de cristal líquido (LCD) por un microcontrolador PIC CELESTINO BENÍTEZ VÁZQUEZ

Más detalles

Tema: Uso de pantalla matricial LCD y teclado matricial con eliminación de rebote.

Tema: Uso de pantalla matricial LCD y teclado matricial con eliminación de rebote. 1 Facultad: Ingeniería Escuela: Electrónica Asignatura: Microcontroladores Lugar de ejecución: Laboratorio de microprocesadores, Edif. 3 Electrónica. Tema: Uso de pantalla matricial LCD y teclado matricial

Más detalles

Tema 11. Introducción a los Microprocesadores y Microcontroladores

Tema 11. Introducción a los Microprocesadores y Microcontroladores Unidad 11 Introducción a los microprocesadores y microcontroladores [email protected] [email protected] Septiembre 2002 1 CONTENIDO Unidad 11. Introducción a los microprocesadores y microcontroladores.

Más detalles

UNIVERSIDAD DON BOSCO

UNIVERSIDAD DON BOSCO CICLO 02 2013 UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACIÓN DE ELECTRÓNICA GUÍA DE LABORATORIO Nº 03 ASIGNATURA: Control Digital NOMBRE DE LA PRACTICA: Configuración de los Puertos

Más detalles

ocontro- lador PIC16F84

ocontro- lador PIC16F84 8 In Electronics Generación de señales PWM con el microcontr ocontro- lador PIC16F84 por Pietro Loglisci Se considera la forma de utilizar el microcontrolador Microchip PIC16F84 (uno de las más corrientes

Más detalles

;*****************************************PROGRAMA*******************************************

;*****************************************PROGRAMA******************************************* 176 ;*****************************************PROGRAMA******************************************* LIST p=16f628a ; Procesador utilizado INCLUDE "P16F628A.INC" ; Definición de los registros del Pic CONFIG

Más detalles

:: Microcontroladores PIC - Tabla de Referencias. Conceptos Básicos

:: Microcontroladores PIC - Tabla de Referencias. Conceptos Básicos Tutorial de Microcontroladores PIC Http://perso.wanadoo.es/luis_ju San Salvador de Jujuy República Argentina :: Microcontroladores PIC - Tabla de Referencias Conceptos Básicos Qué son los microcontroladores...?

Más detalles

PRÁCTICA 1: Entorno de desarrollo MPLAB-IDE. Primeros ejemplos de programación.

PRÁCTICA 1: Entorno de desarrollo MPLAB-IDE. Primeros ejemplos de programación. SISTEMAS ELECTRÓNICOS Y AUTOMÁTICOS PRACTICAS DE MICROCONTROLADORES PIC PRÁCTICA 1: Entorno de desarrollo MPLAB-IDE. Primeros ejemplos de programación. Introducción a la programación en ensamblador Entorno

Más detalles

Dentro del PIC16F877 se distinguen tres bloques de memoria.

Dentro del PIC16F877 se distinguen tres bloques de memoria. 1 ORGANIZACIÓN de la MEMORIA Dentro del PIC16F877 se distinguen tres bloques de memoria. Memoria de programa En sus 8192 posiciones (8Kx14bits) contiene el programa con las instrucciones que gobiernan

Más detalles

Experiencia con Motores paso a paso

Experiencia con Motores paso a paso Diseño de Sistemas Basados en Microprocesadores Experiencia con Motores paso a paso Rubén Tauroni Gil ITIS 2008-2009 Universidad de Las Palmas de Gran Canaria Índice Objetivos...3 Parte Teórica...4 Desarrollo

Más detalles

Alarma con Interfaz DTMF de Línea Telefónica basado en PIC16F84

Alarma con Interfaz DTMF de Línea Telefónica basado en PIC16F84 Alarma con Interfaz DTMF de Línea Telefónica basado en PIC16F84 Propósito En toda aplicación donde normalmente se requiera el establecimiento de una conexión telefónica se hace necesario el diseño de una

Más detalles

Control del LCD. Fernando Remiro

Control del LCD. Fernando Remiro Control del LCD Fernando Remiro Control del LCD CARACTERÍSTICAS Consumo muy reducido, del orden de los 7,5 mw. Pantalla de caracteres ASCII, además de los caracteres japoneses Kanji, caracteres griegos

Más detalles

CONEXIÓN DE UNA PANTALLA LCD A UN MICROCONTROLADOR

CONEXIÓN DE UNA PANTALLA LCD A UN MICROCONTROLADOR CONEXIÓN DE UNA PANTALLA LCD A UN MICROCONTROLADOR ALUMNOS: José Hipólito Pascual José Luis Fernández Enrique Silvestre Mario Pozo José Ignacio Seguí 1 INDICE 1-Introducción 2- Qué es un LCD? 2.1-Los caracteres

Más detalles

El módulo LCD Ejemplos de funcionamiento

El módulo LCD Ejemplos de funcionamiento SISTEMAS ELECTRÓNICOS Y AUTOMÁTICOS PRACTICAS DE MICROCONTROLADORES PIC PRÁCTICA 7: El módulo LCD El módulo LCD Ejemplos de funcionamiento - 1 - 1. Objetivos: - Conocer el funcionamiento y programación

Más detalles

LOS PIC16F88X: EEPROM de Usuario

LOS PIC16F88X: EEPROM de Usuario LOS PIC16F88X: EEPROM de Usuario IES Juan de la Cierva Aprendizaje de la Electrónica a través de la Robótica Domínguez Diagrama de bloques PIC16F884-PIC16F887 Interrupciones en de los PIC16F88X PIR2 INTCON

Más detalles

TEMA 5 LA MEMORIA DE DATOS MEMORIA RAM D.P.E. DESARROLLO DE PROYECTOS 1

TEMA 5 LA MEMORIA DE DATOS MEMORIA RAM D.P.E. DESARROLLO DE PROYECTOS 1 TEMA 5 LA MEMORIA DE DATOS MEMORIA RAM D.P.E. DESARROLLO DE PROYECTOS 1 Estructura De La Memoria Ram (1) La memoria de datos RAM está dividida en dos partes diferenciadas: 1.- Zona SFR o zona de Registros

Más detalles

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA UNIDAD ENSENADA MATERIA: CONTROL DIGITAL MAESTRO: ZAMARRIPA TOPETE JOSE DE JESUS PRACTICA 1 DAC

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA UNIDAD ENSENADA MATERIA: CONTROL DIGITAL MAESTRO: ZAMARRIPA TOPETE JOSE DE JESUS PRACTICA 1 DAC UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA UNIDAD ENSENADA MATERIA: CONTROL DIGITAL MAESTRO: ZAMARRIPA TOPETE JOSE DE JESUS PRACTICA 1 DAC ALUMNO: LIERA GRIJALVA CÉSAR ALBERTO. GRUPO: 3 83 22 DE FEBRERO DE

Más detalles

INDICE Programa Entrada Unidad de control Unidad aritmética y lógica (ALU)

INDICE Programa Entrada Unidad de control Unidad aritmética y lógica (ALU) INDICE Capitulo 1. Qué es un computador? 1.1. Introducción 1 1.2. El computador como dispositivo electrónico 2 1.3. Cómo se procesa la información? 3 1.4.Diagrama de bloques de un computador 1.4.1. Información

Más detalles

TEMA 6 MICROCONTROLADORES. PIC 16F84. 1. Introducción. 1.1. Referencia histórica.

TEMA 6 MICROCONTROLADORES. PIC 16F84. 1. Introducción. 1.1. Referencia histórica. T-6 Microcontroladores. PIC16F84. 1 TEMA 6 MICROCONTROLADORES. PIC 16F84. 1. Introducción. En las aplicaciones sencillas resultan preferibles las soluciones no programables que no requieren desarrollo

Más detalles

PIC 18F45XX CARACTERÍSTICAS GENERALES

PIC 18F45XX CARACTERÍSTICAS GENERALES PIC 18F45XX CARACTERÍSTICAS GENERALES 1. Características generales CPU con arquitectura Harvard (77 instrucciones) Todas las instrucciones constan de 1 sola palabra de 16 bits (2 bytes) excepto las de

Más detalles

SISTEMAS ELECTRÓNICOS DIGITALES

SISTEMAS ELECTRÓNICOS DIGITALES SISTEMAS ELECTRÓNICOS DIGITALES PRÁCTICA 6 SISTEMA DE ENCRIPTACIÓN 1. Objetivos - Estudio del funcionamiento de memorias RAM y CAM. - Estudio de métodos de encriptación y compresión de datos. 2. Enunciado

Más detalles

MANUAL DE MICROCONTROLADORES PIC

MANUAL DE MICROCONTROLADORES PIC MANUAL DE MICROCONTROLADORES PIC Contenido: CAPITULO 1 Introducción a los microcontroladores ( Microcontroladores PIC de Microchip) CAPITULO 2 Programación en lenguaje ensamblador CAPITULO 3 Técnicas en

Más detalles

CONTENIDO PRÓLOGO... XXI CAPITULOS

CONTENIDO PRÓLOGO... XXI CAPITULOS CONTENIDO PRÓLOGO... XXI CAPITULOS 1. MICROCONTROLADOR PIC16F84...1 2. PERIFÉRICOS BÁSICOS...9 3. GRABACIÓN DE MICROCONTROLADORES PIC...21 4. ORGANIZACIÓN DE LA MEMORIA...37 5. ARQUITECTURA INTERNA...47

Más detalles

Electrónica Digital. Actividad Dirigida. Implementación de un Cronómetro Digital

Electrónica Digital. Actividad Dirigida. Implementación de un Cronómetro Digital Electrónica Digital Actividad Dirigida Implementación de un Cronómetro Digital Trabajo a realizar La actividad consiste en la implementación de un cronómetro digital con capacidad de cuenta de minutos

Más detalles

Características Técnicas del PIC 16F84

Características Técnicas del PIC 16F84 Características Técnicas del PIC 16F84 Repertorio de 35 Instrucciones. Todas las instrucciones se ejecutan en un solo ciclo excepto las de salto que necesitan dos. Versiones de 4 MHz (PIC16F84-04) y 10

Más detalles

CURSO BÁSICO DE PIC16F877

CURSO BÁSICO DE PIC16F877 CURSO BÁSICO DE PIC16F877 Raúl Peralta Meza Carlos Quiñones Quispe Generalidades Historia e importancia de los microcontroladores Metodología de estudio Microcontroladores Microchip 16F87X Arquitectura

Más detalles

Introducción a la programación en Lenguaje Assembler.

Introducción a la programación en Lenguaje Assembler. Introducción a la programación en Lenguaje Assembler. Que son las instrucciones El set de instrucciones de un microprocesador es el set de entradas binarias que producen acciones definidas durante un ciclo

Más detalles

PRIMERA PRÁCTICA: PRIMERA TOMA DE CONTACTO CON MPLAB IDE MICROBOT RASTREADOR CONSTRUCCIÓN DE UN GRABADOR

PRIMERA PRÁCTICA: PRIMERA TOMA DE CONTACTO CON MPLAB IDE MICROBOT RASTREADOR CONSTRUCCIÓN DE UN GRABADOR SISTEMAS ELECTRÓNICOS DIGITALES PRIMERA PRÁCTICA: PRIMERA TOMA DE CONTACTO CON MPLAB IDE MICROBOT RASTREADOR CONSTRUCCIÓN DE UN GRABADOR Curso 2008-2009 Profesor: Jaime Gómez Gil E.T.S. Ing. Telecomunicación

Más detalles

INGENIERIA EN MICROCONTROLADORES. Maquinas de Estado. Introducción

INGENIERIA EN MICROCONTROLADORES. Maquinas de Estado. Introducción INGENIERIA EN MICROCONTROLADORES Maquinas de Estado Introducción MAQUINA DE ESTADOS www.i-micro.com Ingeniería en Microcontroladores Teléfono 044 55 11 29 55 05 E-mail: [email protected] [email protected]

Más detalles

Características PIC16F84

Características PIC16F84 Departamento de Electrónica Fundación San Valero del Toda la información que grabamos (memoria de programa y de datos) se puede modificar con el microcontrolador conectado a la aplicación. (ICSP = In-Circuit

Más detalles

MANEJO DE DISPLAY LCD (Versión 1.1)

MANEJO DE DISPLAY LCD (Versión 1.1) MANEJO DE DISPLAY LCD (Versión 1.1) Prof: Bolaños D. Si bien mucas aplicaciones donde debemos mostrar información podemos resolverlas con display de 7 segmentos, estos presentas algunas limitaciones importantes,

Más detalles

Comprobador de Encendido Electrónico de un Motor de Explosión

Comprobador de Encendido Electrónico de un Motor de Explosión Comprobador de Encendido Electrónico de un Motor de Explosión Titulación: Ingeniería Técnica en Electrónica Industrial Alumno: Ignacio Doñate Domenech. Tutor: Dr. Roberto Giral. Fecha: Abril del 2011.

Más detalles

INTRODUCCIÓN AL USO DEL MPLAB v 8.00

INTRODUCCIÓN AL USO DEL MPLAB v 8.00 INTRODUCCIÓN AL USO DEL MPLAB v 8.00 MPLAB es un ambiente de desarrollo integrado (IDE, por sus siglas en inglés) creado por Microchip Technology para dar soporte a la realización de proyectos basados

Más detalles

Temporizadores y contadores en tiempo real: El módulo Timer0 del PIC.

Temporizadores y contadores en tiempo real: El módulo Timer0 del PIC. Temporizadores y contadores en tiempo real: El módulo Timer0 del PIC. 1. Introducción... 1 2. Funcionamiento del Timer0... 1 2.1. Estructura general del Timer0...2 2.2. Entrada de reloj del modulo Timer0...2

Más detalles

Relación de Problemas I

Relación de Problemas I Relación de Problemas I 352) $1'5e6 52/'È1 $5$1'$ 1. Realizar el cálculo del tiempo que transcurre durante la ejecución del bloque de instrucciones sombreado, en función del contenido de los registros

Más detalles

El Microcontrolador PIC16F877. Resumen de hoja de datos

El Microcontrolador PIC16F877. Resumen de hoja de datos El Microcontrolador PIC16F877 Resumen de hoja de datos 2 El PIC16F877 es un microcontrolador con memoria de programa tipo FLASH, lo que representa gran facilidad en el desarrollo de prototipos y en su

Más detalles

PIC16C5X (GAMA BAJA) Solo en dispositivos de 28 pins. Encapsulado y patillaje:

PIC16C5X (GAMA BAJA) Solo en dispositivos de 28 pins. Encapsulado y patillaje: PIC6C5X (GAMA BAJA) Oscilador RESET SLEEP WatchDog Timer (WDT) Protección de código e IDs Periféricos: Timer/Contador de 8bits (T) con prescaler compartido para WDT o TMR Hasta 3 puertos I/O (RA,RB,RC)

Más detalles

Programación y diseño de dispositivos mediante Microcontroladores PIC.

Programación y diseño de dispositivos mediante Microcontroladores PIC. Microcontroladores - Robots - Automatismos - Programación Programación y diseño de dispositivos mediante Microcontroladores PIC. Dr. Eugenio Martín Cuenca Ing. Jose María Moreno Balboa Facultad de Ciencias.

Más detalles

DISPLAY LCD MICROPROCESADORES

DISPLAY LCD MICROPROCESADORES Módulo LCD HD4478 de de Hitachi Módulo LCD HD4478 de de Hitachi E R / W D-D7 D-D7 VDD Vo Vss Controlador Controlador del del LCD LCD HD4478 HD4478 Manejador Manejador Del Del LCD LCD Manejador Manejador

Más detalles

Control de avance al encendido

Control de avance al encendido Control de avance al encendido Diseño de microcontroladores Proyecto final Profesor: Alumno: Ing. José Juarez Kikot Pablo 1 INDICE _ Introducción 3 Funcionamiento básico de un motor 4 Encendido tradicional

Más detalles

SISTEMA DE NUMERACIÓN DECIMAL

SISTEMA DE NUMERACIÓN DECIMAL SISTEMA DE NUMERACIÓN DECIMAL La matemática es una gran ciencia! Todo es tan lógico y simple... El universo de los números se puede describir con sólo diez dígitos. No obstante, realmente tiene que ser

Más detalles

EDUPIC Módulo 16F628 Manual del Usuario

EDUPIC Módulo 16F628 Manual del Usuario 1 EDUPIC Módulo 16F628 Manual del Usuario Indice : 1. Introducción 2 2. Descripción general 2 3. Definición de los pines en el 16F628 4 4. Programador de la memoria FLASH 5 5. Oscilador 5 6. Arquitectura

Más detalles

2.2-1 Visión Interna PIC16F873/876. SBM

2.2-1 Visión Interna PIC16F873/876. SBM 2.2-1 Visión Interna PIC16F873/876. 1 2.2-2 Visión Interna PIC16F874/877. 2 2.2-3 Sistema de memoria. Tienen arquitectura Harvard, separa la memoria de datos y la memoria de programa, y se accede a ellas

Más detalles

DEPARTAMENTO ELECTRÓNICA PIC - TEMA 2 INTRODUCCIÓN A LOS MICROCONTROLADORES PIC

DEPARTAMENTO ELECTRÓNICA PIC - TEMA 2 INTRODUCCIÓN A LOS MICROCONTROLADORES PIC DEPARTAMENTO ELECTRÓNICA PIC - TEMA 2 INTRODUCCIÓN A LOS MICROCONTROLADORES PIC 1 Los 'PIC' son una familia de microcontroladores tipo RISC fabricados por Microchip Technology Inc. y derivados del PIC1650,

Más detalles

COMO PROGRAMAR UN PIC En cuatro pasos

COMO PROGRAMAR UN PIC En cuatro pasos COMO PROGRAMAR UN PIC En cuatro pasos Un PICmicro es un circuito integrado programable. Microchip, su fabricante dice: Programable Integrated Circuit. Programable quiere decir que se puede planificar la

Más detalles

Programación de Microcontroladores PIC-Microchip

Programación de Microcontroladores PIC-Microchip 69 Instituto Politécnico Nacional Escuela Superior de Cómputo Departamento de Programación y Desarrollo de Sistemas Academia de Algoritmia y Programación Programación de Microcontroladores PIC-Microchip

Más detalles

Sistemas con Microprocesadores II

Sistemas con Microprocesadores II Sistemas con Microprocesadores II 1 El PIC16F628 PIC16F628 Memoria de datos EEPROM Memoria de programa FLASH Rebotes en los pulsadores Teclado matricial Display de 7 segmentos Teclado Matricial con display

Más detalles

MICROPROCESADORES II LENGUAJE C EN LOS MICROCONTROLADORES PIC

MICROPROCESADORES II LENGUAJE C EN LOS MICROCONTROLADORES PIC MICROPROCESADORES II LENGUAJE C EN LOS MICROCONTROLADORES PIC Tipos de datos en CCS TIPO TAMAÑO RANGO DESCRIPCION int1 short 1 bit 0 a 1 Binario int int8 8 bits 0 a 255 Entero int16 long 16 bits 0 a 65535

Más detalles

Modulo LCD MODULO LCD

Modulo LCD MODULO LCD MODULO LCD Las pantallas de cristal líquido LCD o display LCD (Liquid Cristal Display) consta de una matriz de caracteres (normalmente de 5x7 o 5x8 puntos) distribuidos en una, dos, tres o cuatro líneas

Más detalles

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERÍA DIVISIÓN DE INGENIERÍA ELÉCTRICA DEPARTAMENTO DE INGENIERÍA EN COMPUTACIÓN

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERÍA DIVISIÓN DE INGENIERÍA ELÉCTRICA DEPARTAMENTO DE INGENIERÍA EN COMPUTACIÓN UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERÍA DIVISIÓN DE INGENIERÍA ELÉCTRICA DEPARTAMENTO DE INGENIERÍA EN COMPUTACIÓN PRACTICAS LABORATORIO DE MICROCOMPUTADORAS Basadas en el Microcontrolador

Más detalles

; Valores de constantes:

; Valores de constantes: LIST P=PIC16F84A #INCLUDE ; Pic a usar ; Lista de etiquetas de microchip ; Configuración opciones de hardware para la programación CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ; Valores

Más detalles

Tema 8. Saltos. (parte I)

Tema 8. Saltos. (parte I) Tema 8 Saltos (parte I) 1 Ya vimos el salto incondicional con goto. SALTOS CONDICIONALES El repertorio del PIC16F84 también dispone de instrucciones de salto condicional, que son aquellas que producen

Más detalles

Guia para examen de Sistemas Embebidos I Para primer parcial Febrero 2013 Revisión 2 Ing. Julio Cesar Gonzalez Cervantes

Guia para examen de Sistemas Embebidos I Para primer parcial Febrero 2013 Revisión 2 Ing. Julio Cesar Gonzalez Cervantes Qué significa ALU? Arithmetic Logic Unit Guia para examen de Sistemas Embebidos I Para primer parcial Febrero 2013 Revisión 2 Ing. Julio Cesar Gonzalez Cervantes que operaciones realiza un ALU? suma, resta,

Más detalles

MICROCONTROLADORES PIC

MICROCONTROLADORES PIC MICROCONTROLADORES PIC LOS TIMER DE LOS 16F87x TEMA EL TIMER 1 CCFF D.P.E. MÓDULO DE PROYECTOS 1 Diagrama de Bloques del TIMER1 CCFF D.P.E. MÓDULO DE PROYECTOS 2 INTRODUCCIÓN El módulo TIMER1 es un temporizador/contador

Más detalles

La circuitería interna del 555 según National Semiconductors, es la siguiente:

La circuitería interna del 555 según National Semiconductors, es la siguiente: LABORATORIO DE CIRCUITOS DIGITALES II OPERACIÓN DEL 555 COMO ASTABLE INTRODUCCION El 555 es un integrado muy útil, pudiendo ser configurado en varias modalidades. Una de estas modalidades es la del multivibrador

Más detalles

Seguidores de clase. Universidad Pontificia de Salamanca (Madrid) Microcontrolador PIC 16F877

Seguidores de clase. Universidad Pontificia de Salamanca (Madrid) Microcontrolador PIC 16F877 Seguidores de clase Universidad Pontificia de Salamanca (Madrid) Microcontrolador PIC 16F877 Microcontroladores Versión 1.5 04 oct. 07 pág. 1 INDICE Características generales del PIC 16F877...2 Diagrama

Más detalles

Manual de Usuario TMU-V1

Manual de Usuario TMU-V1 @-sa.com www.-sa.com Manual de Usuario, S.A. Pag. 1 de 10 @-sa.com www.-sa.com Manual de Usuario Indice: 1.0.- Descripción: 2.0.- Características: 2.1.- Componentes básicos 3.0.- Descripción de funcionamiento

Más detalles

El objeto de este proyecto es el de construir un robot araña controlado por un PIC16F84A.

El objeto de este proyecto es el de construir un robot araña controlado por un PIC16F84A. .. Memoria Descriptiva... Objeto El objeto de este proyecto es el de construir un robot araña controlado por un PIC6F8A.... Antecedentes El diseño original no se llegó a realizar en circuito impreso, en

Más detalles

GESTION DE UN LCD USANDO CCS COMPILER (PICC)

GESTION DE UN LCD USANDO CCS COMPILER (PICC) GESTION DE UN LCD USANDO CCS COMPILER (PICC) La mayoría de displays de cristal líquido se usan con controlador del tipo HD44780, con un número de líneas variable y una cantidad de caracteres también variable,

Más detalles

PRÁCTICAS CON ARDUINO UNO

PRÁCTICAS CON ARDUINO UNO PRÁCTICAS CON ARDUINO UNO ÍNDICE ARDUINO: PRÁCTICA 1_ HOLA MUNDO ( ENCENDER Y APAGAR UN LED DURANTE UN TIEMPO DETERMINADO)... 7 ARDUINO: PRÁCTICA 2_ SECUENCIA DE ENCENDIDO Y APAGADO DE CUATRO LEDS...

Más detalles

Preguntas, ejercicios y problemas para el libro: Microcontroladores: fundamentos y aplicaciones con PIC

Preguntas, ejercicios y problemas para el libro: Microcontroladores: fundamentos y aplicaciones con PIC Preguntas, ejercicios y problemas para el libro: Microcontroladores: fundamentos y aplicaciones con PIC Autores: Fernando E. Valdés Pérez y Ramon Pallàs Areny Barcelona: Marcombo, 2007, ISBN: 84 267 1414

Más detalles

AR 9 T. Tutorial 9: Display LCD

AR 9 T. Tutorial 9: Display LCD 9 T Tutorial 9: Display LCD En este tutorial, se va a mostrar cómo conectar una pantalla LCD 1602A a una placa Arduino UNO para mostrar texto por pantalla. Material 1 Arduino uno 1 cable AB 1 Protoboard

Más detalles