Entrenadores de
Microcontroladores PIC
Profesor: Pedro Alonso Sanz
Instituto: I.E.S. Joan Miró
Índice
Página
1
.- Entrenador Básico 0 ... 41.1.- Ejemplo1.asm Leer el Puerto C y transferirlo al Puerto B ... 5
1.2.- Ejemplo2.asm Leer el Puerto C complementarlo y transferirlo al Puerto B ... 7
1.3.- Ejemplo3.asm Parpadeo de un Led ... 9
1.4.- Ejemplo3A.asm Parpadeo de un Led ,utilizando una librería de Tiempo RETAR_1S.INC... 12
1.5.- Ejemplo3B.asm Parpadeo de un Led utilizando una librería llamada RETARDOS.INC del libro de Desarrollo de Proyectos. .... 14
1.6.- Ejemplo4.asm Simular las luces del Coche Fantástico. ... 15
1.7.- Ejemplo5.asm Simular las luces del Coche Fantástico controlado por PCO. ... 18
1.8.- Nom_disp.asm Poner el Nombre en el Display. ... 21
1.9.- Sum_Nibl.asm Sumar los nibles del Puerto C y llevarlos al Puerto B. ... 24
1.10.- Dir_ind.asm Direccionamiento Indirecto. ... 26
1.11.- Pagina1.asm Trabajar con la Pagina 1 de memoria de programa. ... 28
1.12.- RETARDO_1S.INC Librería Casera de Retardo 1 Segundo. ... ... 30
1.13.- RETARDOS.INC Librería de Retardos del libro de Desarrollo de Proyectos. ... 31
2.- Entrenador Básico 1 ... 35
2.1.- Ejemplo6.asm Encender displays dependiendo de PC0. ... 36
2.2.- Ejemplo7.asm Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades. ... 38
2.3.- Ejemplo8.asm Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas. ... 41
3.- Entrenador Básico 2 ... 46
3.1.- Ejemplo9.asm Contar pulsos procedentes de PC0 y llevarlos al Display de Unidades y Decenas. ... 47
4 .- Entrenador Básico 2A ... 52
4.1.- PWM_1.asm. Control de un Servomotor de Posición con PWM a través del Puerto B ... 53
4.2.- PWM_CAD.asm Control de un Servomotor de Posición con PWM a través de un Potenciómetro. ... 55
5.- Entrenador Básico 3. ... 58
Índice
Página
5.2.- Ejemp_11.asm Conversión Analógico/Digital. ... 64
5.3.- Ejemp_12.asm Contar pulsos del exterior utilizando un Temporizador TIMER 0. ... 66
5.4.- 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. ... 68
5.5.- Ejemp_14.asm Detectar el numero mayor de una Tabla. ... 71
6.- Entrenador Básico 4 ... 75
6.1.- T_S_A.asm Transmisor SERIE asíncrona. ... 76
6.2.- R_S_A.asm Receptor SERIE asíncrona. ... 79
6.3.- T1_S_RF.asm Transmisor SERIE asíncrona utilizando Librería de Transmisión T_S_RF_INC. ... 82
6.4.- RE1_S_RF.asm Receptor SERIE asíncrona utilizando Librería de Recepción R_S_RF.INC. ... 84
6.5.- 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... 87
6.6.- 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. ... 906.7.- 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. ... 94
6.8.- 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. ... 98
Índice
Página
7.- Entrenador Básico 5 ... 102
7.1.- Tecla0.asm Manejo del Teclado utilizando la técnica de polling. ... 103 7.2.- Tecl_01.asm Manejo del Teclado utilizando la técnica de
interrupción del programa principal. ... 105
7.2.- 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. ... 108 7.4.- HEX_7SEG.INC Librería que transforma un código hexadecimal
en 7 segmentos. ... 110 7.5.-TECLADO.INC Librería de control del teclado. ... 111
8.- Entrenador Básico 6 ... 115
8.1.- LCD_01.asm Visualización de un mensaje en el LCD
carácter a carácter. ... 116 8.2.- 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. ... 117 8.3.- LCD_03.asm Programa ejemplo para comprender la
utilización de las subrutinas LCD_ByteCompleto,
LCD_Byte, LCD_Nibble y LCD_DosEspaciosBlancos. ... 118 8.4.- LCD_04.asm Visualización en el LCD un contador descendente. ... 120 8.5.- LCD_05.asm Visualizar en la pantalla del LCD los pulsos
generados del exterior. ... 122 8.6.- 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. ... 123 8.7.- LCD_07.asm Mientras se mantenga presionado el pulsador
conectado al pin RA4, incrementa un contador
que se visualiza en la pantalla del LCD. ... 125 8.8.- 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. ... 127 8.9.- Mens_01.asm Visualización de un mensaje fijo utilizando
la librería LCD_4BIT.INC. ... 129 8.10.- Mens_02.asm Visualización de un mensaje fijo utilizando
la librería LCD_MENS.INC. ... 131 8.11.- Mens_03.asm Visualización de varios mensajes fijo utilizando
la librería LCD_MENS.INC. ... 132 8.12.- Mens_03B.asm Visualización de varios mensajes fijo utilizando
la librería LCD_MENS.INC cuando se visualiza el
Índice
Página
8.13.- Mens_04.asm Visualización de mensajes parpadeantes
en dos líneas del LCD. ... 135 8.14.- Mens_05.asm Visualización de un mensaje fijo y parpadeantes. ... 137 8.15.- Mens_06.asm Visualización de mensajes en función de un pulsador. ... 138 8.16.- Mens_07.asm El modulo LCD visualiza un mensaje largo
(mas de 16 caracteres) que se desplaza. ... 141 8.17.- Mens_08.asm Juego de la Quiniela. ... 142 8.18.- Mens_09.asm La pantalla del LCD visualiza un mensaje
en función de un pulsador. ... 144 8.19.- 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. ... 145 8.20.- 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. ... 146 8.21.- LCD_MENS.INC Librería de subrutinas para el manejo de mensajes
a visualizar en un visualizador LCD. ... 151
9.- Entrenador Básico 7 ... 154
9.1.- Tecla_01.asm La pantalla del LCD visualiza el orden de la tecla
pulsada utilizando la técnica de polling. ... 155 9.2.- Tecla_02.asm La pantalla del LCD visualiza el valor hexadecimal
de la tecla pulsada utilizando la técnica de polling. ... 156 9.3.- Tecl_03.asm La pantalla del LCD visualiza el valor hexadecimal
de la tecla pulsada utilizando técnicas de interrupción. .. 157 9.4.- Tecla_04.asm La pantalla del LCD visualiza caracteres españoles
en función de la tecla pulsada. ... 159 9.5.- 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. ……… 161 9.6.- 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. ... 163 9.7.- Tecla_07.asm La pantalla del LCD aparece la tecla pulsada si esta
es decimal y si se pulsa otra tecla borra pantalla. ... 165 9.8.- Tecla_08.asm Suma el valor de tres teclas y aparece en el LCD
en decimal y hexadecimal. ... 166 9.8.- Tecla_09.asm Cerradura Electrónica. ... 169
Índice
Página
10.- Entrenador Básico 7-1 ... 173
10.1.- Tecla_10.asm Cerradura Electrónica activando un motor PAP. ... 174
11.- Entrenador Básico 8. ... 179
11.1.- 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. PCF8476. ... 180 11.2.- 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. ... 181 11.3.- I2C3.asm Realizar una conversión Analógica / Digital y
transmitirla a los expansores de bus PCF8476. ... 183
12.- Entrenador Básico 8-1. ... 186
12.1.- 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. PCF8476. ... 187 12.2.- 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. ... 189
13.- Entrenador Básico 9. ... 192
13.1.- I2C6.asm Leer constantemente la entrada analógica ANI0 del Esclavo 1 (PCF8591) y visualiza la tensión
en la pantalla del modulo LCD. ... 193 13.2.- 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. ... 196 13.3.- 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. ... 199 13.4.- I2C.INC Librería de Transmisión y recepción de datos con I2C. .... 203 13.5.- I2C1.INC Librería de Transmisión y recepción de datos con I2C1.
En la subrutina (Transmitir_dato_I2C) el Esclavo no
14.- Entrenador Básico 10. ... 208
14.1.- 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. ... 209 14.2.- 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. ... 210 14.3.- 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. ... 211 14.4.- 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. ... 213 14.5.- 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. ... 214 14.6.- 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. ... 216 14.7.- 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. ... 218 14.8.- 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. ... 220 14.9.- 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. ... 221 14.10.- 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. ... 224 14.11.- RTS23_11.asm SISTEMA DE GOBIERNO DESDE ORDENADOR:
Desde el teclado de un ordenador se desea
14.12.- RS232_RT.INC Librería de transmisión-recepción serie asíncrona
según normas RS-232. ... 230 14.13.- RS232MEN.INC Librería de transmisión de mensajes desde el
microcontrolador hacia el ordenador a través del puerto
serie RS232. ... 232
15.- Entrenador Básico 11. ... 234
15.1.- Int_T_01.asm Onda cuadrada de 10 kHz aproximadamente, mediante la interrupción por desbordamiento
del Timer 0. ... 235 15.2.- Int_T_02.asm Onda cuadrada de 10 kHz exactos, mediante la
interrupción por desbordamiento del Timer 0. ... 236 15.3.- Int_T_03.asm Led ON/OFF 500 ms utilizando la interrupción
por desbordamiento del Timer 0. ... 238 15.4.- Int_T_04.asm Led ON (800 ms) Led OFF (500 ms), utilizando la
interrupción por desbordamiento del Timer 0. ... 240 15.5.- Int_T_05.asm Sistema multitarea ( Mostrar mensajes en el
LCD y LED ON/OFF (500 ms). ……….. 242 15.6.- 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 0. ... 244 15.7.- 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. ... 246 15.8.- Int_C_02.asm Generar una señal cuadrada por PB2, de frecuencia
variable desde 300Hz hasta 4000Hz. ... 250 15.9.- 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. ... 252 15.10.- Int_C_04.asm Control del Ciclo de Trabajo de un señal cuadrada. ... 256 15.11.- Int_Re_01.asm Reloj digital en tiempo real sin puesta en hora
utilizando la interrupción del Timer 0. ... 260 15.12.- Int_Re_04.asm Reloj digital en tiempo real con puesta en hora. ... 264 15.13.- Int_Temp.asm Temporizador digital de precisión. ... 270
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 ; RegistrosSecció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 11111111 B ; Poner el Puerto C como entrada de datos. TRISB 00000000 B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0
; Principal PORTB PORTC
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'11111111' ; Poner el Puerto C como entrada de datos. MOVWF TRISC
CLRF TRISB ; Poner el Puerto B como salida de datos. BCF STATUS,RP0
;**************************** 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
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 ; RegistrosSecció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 11111111 B ; Poner el Puerto C como entrada de datos. TRISB 00000000 B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0
; Principal PORTB PORTC
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'11111111' ; Poner el Puerto C como entrada de datos. MOVWF TRISC
CLRF TRISB ; Poner el Puerto B como salida de datos. BCF STATUS,RP0
;**************************** 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
1.3.- Ejemplo3.asm (Entrenador Básico 0)
Diagrama de Flujo
Parpadeo de un Led Elegimos PIC List p=16f877 , f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades DATO1 EQU 0X10 DATO2 EQU 0X64 DATO3 EQU 0X64 ; Registros REG1 EQU 0X22 REG2 EQU 0X23 REG3 EQU 0X24Secció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
TRISB 00000000 B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0
PORTB 00000000 B ; Limpiar el Puerto B
; Principal PB0 1 ; Encender el Led de PB0 SEGUNDO PB0 0 ; Apagar el Led de PB0 SEGUNDO Subrutina de Tiempo REG3 # DATO3 REG2 # DATO2 REG1 # DATO1 REG1 REG1 - 1 ¿ REG1 = 0 ? REG2 REG2 - 1 ¿ REG2 = 0 ? ¿ REG3 = 0 ? RETUR SI SI SI NO NO NO REG3 REG3 - 1
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 EQU 0X10 DATO2 EQU 0X64 DATO3 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
BCF PORTB,0 CALL SEGUNDO GOTO SEGUIR
;**************************** Subrutina de perdida de tiempo de 1 Segundo ****************************** SEGUNDO MOVLW DATO3
MOVWF REG3 SEG7 MOVLW DATO2
MOVWF REG2 SEG6 MOVLW DATO1
MOVWF REG1 SEG5 DECFSZ REG1,F
GOTO SEG5 DECFSZ REG2,F GOTO SEG6 DECFSZ REG3,F GOTO SEG7 RETURN END
1.4.- Ejemplo3A.asm (Entrenador Básico 0)
Diagrama de Flujo
Parpadeo de un Led Utilizando una librería de
Tiempo 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 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1
TRISB 00000000 B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0
PORTB 00000000 B ; Limpiar el Puerto B
; Principal PB0 1 ; Encender el Led de PB0 SEGUNDO PB0 0 ; Apagar el Led de PB0 SEGUNDO Librería de Tiempo RETART_1S.INC
SEGUNDO REG3 # DATO3
REG2 # DATO2 REG1 # DATO1 REG1 REG1 - 1 ¿ REG1 = 0 ? REG2 REG2 - 1 ¿ REG2 = 0 ? ¿ REG3 = 0 ? RETUR SI SI SI NO NO NO ; Igualdades DATO1 EQU 0X10 DATO2 EQU 0X64 DATO3 EQU 0X64 ; Registros CBOCK REG1 REG2 REG3 ENDC REG3 REG3 - 1
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
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
Diagrama de Flujo
title " Simular las luces del Coche Fantástico "
Simular las luces del Coche Fantástico Elegimos PIC List p=16f877 , f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros CBLOCK 0X20 CONTADOR DATO 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 ; Inicio de Programa
COMIENZO CONTADOR 00000000 B ; Resetear CONTADOR RP0 1 ; Ir al Banco 1
TRISB 00000000 B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0
DATO 10000000 B ; Encendemos el Led PB7 y guardamos el código en un Registro.
1
1
PORTB DATO CONTADOR CONTADOR + 1 Retardo_100ms ¿ CONTADOR = 8 ? CY 0 CY 7 DATO 0 CY 7 DATO 0 CONTADOR 00000000 B CY 0 PORTB DATO Retardo_100ms CONTADOR CONTADOR + 1 ¿ CONTADOR = 7 ? CONTADOR 00000001 B SI NO SI NO;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'00000000' ; Configuro el PB salidas . MOVWF TRISB
BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria
;*************************** Principal ************************************************************************* SEGUIR MOVLW B'10000000' ; Encendemos el Led PB7
SEG1 MOVF DATO,W ;Transferimos la información del registro DATO MOVWF PORTB ; al Puerto B.
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 <> 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
Diagrama de Flujo
title " Simular el Coche Fantástico, controlado por PC0"
NO Simular las luces del
Coche Fantástico controlado por PCO
Elegimos PIC List p=16f877 , f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades ; Registros CBLOCK 0X20 CONTADOR DATO 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 ; Inicio de Programa
COMIENZO CONTADOR 00000000 B ; Resetear CONTADOR RP0 1 ; Ir al Banco 1
TRISB 00000000 B ; Poner el Puerto B como salida de datos. RP0 0 ; Ir al Banco 0
TRIRC (0) 1 ; Poner PC0 como salida de datos
DATO 10000000 B ; Encendemos el Led PB7 y guardamos el código en un Registro.
1
¿ PCO = 1 ? SI NO SI1
PORTB DATO CONTADOR CONTADOR + 1 Retardo_100ms ¿ CONTADOR = 8 ? CY 0 CY 7 DATO 0 CY 7 DATO 0 CONTADOR 00000000 B CY 0 PORTB DATO Retardo_100ms CONTADOR CONTADOR + 1 ¿ CONTADOR = 7 ? CONTADOR 00000001 B SI NO ¿ PC0 = 1 ? SI NO ¿ PC0 = 1 ? SI NO;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'00000000' ; 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'10000000' ; Encendemos el Led PB7
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
MOVF DATO,W ; Transferimos la información del registro DATO MOVWF PORTB ; al Puerto B.
PARAR2 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
Diagrama de Flujo
title " Poner el NOMBRE en el Display "
Poner el Nombre en el Display Elegimos PIC List p=16f877 , f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; Igualdades Numero_de_caracteres EQU D '5' ; Registros CBLOCK 0X20 CONTADOR 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 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1
TRISD 00000000 B ; Poner el Puerto D como salida de datos. RP0 0 ; Ir al Banco 0
1
¿ CONTADOR = Numero_de _caracteres SI NO1
CONTADOR 00000000 B W CONTADOR BINARIO_CARACTER PORTD W Retardo_500ms CONTADOR CONTADOR + 1 BINARIO_CARACTE R PCL PCL + WRETLW B'01110011' ;Retorna con W cargado con P RETLW B'01111001' ;Retorna con W cargado con E RETLW B'01011110' ;Retorna con W cargado con d RETLW B'01010000' ;Retorna con W cargado con r RETLW B'01011100' ;Retorna con W cargado con o
;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 ;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 ; 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 CLRF CONTADOR
SEG1 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
;***************************** Subrutina de BINARIO_CARACTER ******************************************* BINARIO_CARACTER ADDWF PCL,F ;Suma el Contador del Programa con el contenido
; de W y lo deja en el PC. RETLW B'01110011' ;Retorna con W cargado con P RETLW B'01111001' ;Retorna con W cargado con E RETLW B'01011110' ;Retorna con W cargado con d RETLW B'01010000' ;Retorna con W cargado con r RETLW B'01011100' ;Retorna con W cargado con o
;***************************** Librerías *************************************************************************** INCLUDE <RETARDOS.INC>
END
Diagrama de Flujo
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.
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> ; Igualdades ; Registros CBLOCK 0X20 Numero_bajo Numero_alto 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 ; Inicio de Programa COMIENZO RP0 1 ; Ir al Banco 1
TRISB 00000000 B ; Poner el Puerto B como salida de datos. TRISC 11111111 B ; Poner el Puerto C como
entrada de datos. RP0 0 ; Ir al Banco 0
1
1
W PORTC W 00001111 B AND W Numero_bajo W W PORTC W 11110000 B AND W Numero_alto W Numero_alto Numero_alto ( 7..4 ) ( 3..0 ) W Numero_alto W W + Numero_bajo PORTB W;**************************** 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 ;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 ; Selecciono la pagina 1 de la memoria
CLRF TRISB ; Configuro el Puerto B como salida MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria
;**************************** Inicio ******************************************************************************* SEG1 COMF PORTC,W
ANDLW B'00001111' MOVWF Numero_bajo COMF PORTC,W ANDLW B'11110000' MOVWF Numero_alto SWAPF Numero_alto,F MOVF Numero_alto,W ADDWF Numero_bajo,W MOVWF PORTB GOTO SEG1 END
Diagrama de Flujo
title "Direccionamiento indirecto "
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 ; Inicio de Programa COMIENZO FSR # REG1 (FSR) D’1’ FSR FSR + 1 (FSR) D’2’ FSR FSR + 1 (FSR) D’3’ FSR FSR + 1 FIN
;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
Diagrama de Flujo
title " Trabajar con la Pagina 1 de memoria de Programa "
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> ; 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
TRISB 00000000 B ; Poner el Puerto B como salida de datos. TRISC 11111111 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 Subrutina Prueba Pagina1 ORG 0800H PORTC PORTB ; Cambio a la Página0 PCLATCH3 0 RETUR N
;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'11111111' 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
;*********************** Librería Casera de Retardo 1 Segundo ********************************************** ;*********************** Igualdades ****************************************************************************** DATO1 EQU D'100' DATO2 EQU D'100' DATO3 EQU D'20' ;*********************** Registros ******************************************************************************** CBLOCK REG1 REG2 REG3 ENDC ;*********************** Subrutina SEGUNDO ***************************************************************** SEGUNDO MOVLW DATO3
MOVWF REG3 SEG7 MOVLW DATO2
MOVWF REG2 SEG6 MOVLW DATO1
MOVWF REG1 SEG5 DECFSZ REG1,F
GOTO SEG5 DECFSZ REG2,F GOTO SEG6 DECFSZ REG3,F GOTO SEG7 RETURN
;**************************** Librería "RETARDOS.INC" ***************************************************** ;
; =================================================================== ; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" ; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; =================================================================== ;
; 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.
movlw d'5' ; Aporta 1 ciclo máquina. Este es el valor de "K". ;
; El próximo bloque "RetardoMicros" tarda:
; 1 + (K-1) + 2 + (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 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz). ; - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz). ; - Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz). ; - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz). ; - Retardo_20micros : 2 + 1 + (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) + 2 + (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.
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 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249). ; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249). ; - Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249). ; - Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249). ; - Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249). ; - Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249). ; - Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249). ; - Retardo_1ms : 2 + 1 + (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) + 2 + (N-1)x2 + 2 =
; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011 ; ciclos máquina que a 4 MHz son 100011 µ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 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s. ; (N=200, M=100 y K=249).
; - Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s. ; (N=100, M=100 y K=249). ; - Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s. ; (N= 50, M=100 y K=249). ; - Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s. ; (N= 20, M=100 y K=249). ; - Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s. ; (N= 10, M=100 y K=249). ; - Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 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. www.ra-ma.es
2.- Entrenador Básico 1
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 ENDCSecció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 00000000 B ; Poner el Puerto D como salida de datos.
TRISC (0) 1 ; Poner PC0 como entrada de Datos
ADCON1 00000110 B ; Configuro las patillas de los PUERTOS A y D como señales digitales.
TRISE 00000000 B ; Poner el Puerto E como salida de datos. RP0 0 ; Ir al Banco 0 PORTD 11111111 B ¿ PCO = 1?
; Encender Display de UNIDADES PORTE 00000001 B
; Encender Display de DECENAS PORTE 00000010 B
SI
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'00000000' ; 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 MOVLW B'11111111' MOVWF PORTD SEG1 BTFSS PORTC,0 GOTO DECENAS UNIDADES MOVLW B'00000001' MOVWF PORTE GOTO SEG1 DECENAS MOVLW B'00000010' MOVWF PORTE GOTO SEG1
END
2.2.- Ejemplo7.asm (Entrenador Básico 1)
Diagrama de Flujo
Contar pulsos procedentes de PC0 y llevarlos al Display de Elegimos PIC List p=16f877 , f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f877.inc> ; IgualdadesNMAYOR EQU 0X0A
; Registros CBLOCK 0X20 CONTADOR 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
TRISD 00000000 B ; Poner el Puerto D como salida de datos.
TRISC (0) 1 ; Poner PC0 como entrada de Datos
ADCON1 00000110 B ; Configuro las patillas de los PUERTOS A y D como señales digitales.
TRISE 00000000 B ; Poner el Puerto E como salida de datos. RP0 0 ; Ir al Banco 0
;Poner el Display de Unidades a cero PORTD 00111111 B
1
¿ PCO = 0? CONTADOR 00000001 B PORTE 00000001 B SI NO1
W CONTADORTABLA PORT D W CONTADOR CONTADOR +1 ¿ CONTADOR = NMAYOR ? CONTADOR 00000000 B NO SI Subrutina TABLA PCL PCL + W
RETLW B'00111111' ;Retorna con W cargado con 00H
RETLW B'00000110' ;Retorna con W cargado con 01H
RETLW B'01011011' ;Retorna con W cargado con 02H
RETLW B'01001111' ;Retorna con W cargado con 03H
RETLW B'01100110' ;Retorna con W cargado con 04H
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 ; Configuro el puerto E como salida de datos. BSF PORTC,0 ; Configuro la patilla PC0 como entrada de datos. BCF STATUS,RP0 ; Selecciono la pagina 0 de la memoria
CLRF CONTADOR MOVLW B'00111111'
INCF CONTADOR MOVLW B'00000001' MOVWF PORTE ;*************************** Principal ***************************************************************************** SEGUIR BTFSC PORTC,0 GOTO SEGUIR MOVF CONTADOR,W CALL TABLA INCF CONTADOR,F MOVWF PORTD MOVF CONTADOR,W XORLW NMAYOR BTFSS STATUS,Z GOTO SEG1 CLRF CONTADOR SEG1 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'00111111' ;Retorna con W cargado con 00H RETLW B'00000110' ;Retorna con W cargado con 01H RETLW B'01011011' ;Retorna con W cargado con 02H RETLW B'01001111' ;Retorna con W cargado con 03H RETLW B'01100110' ;Retorna con W cargado con 04H RETLW B'01101101' ;Retorna con W cargado con 05H RETLW B'01111101' ;Retorna con W cargado con 06H RETLW B'00000111' ;Retorna con W cargado con 07H RETLW B'01111111' ;Retorna con W cargado con 08H RETLW B'01101111' ;Retorna con W cargado con 09H END
2.3.- Ejemplo8.asm (Entrenador Básico 1)
Diagrama de Flujo
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 CONTADOR DISPLAY UNIDADES DECENAS CENTENAS DIVIDENDO DIVISOR COCIENTE RESTO ENDCSección de código de Reset
ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa
1
1
Sección de Configuración ORG 0X05H COMIENZO RP0 1 ; Ir al Banco 1
ADCON1 00000110 B ; Configuro las patillas de los PUERTOS A y D como señales digitales.
TRISD 00000000 B ; Poner el Puerto D como salida de datos. TRISE 00000000 B ; Poner el Puerto E como
salida de datos.
TRISC 11111111 B ; Poner Puerto C como entrada de datos
RP0 0 ; Ir al Banco 0
PULSOS 00000000 B ; Resetear el registro PULSOS, es un registro que contiene el numero de pulsaciones. CONTADOR 00000001 B ; Iniciar el CONTADOR a 1
¿ PCO = 0? SI NO PULSOS CONTADOR CONTADOR CONTADOR +1 ¿ CONTADOR = NMAYOR ? CONTADOR 00000000 B NO SI MOSTRAR_DISPLAY MOSTRAR_DISPLAY ¿ PCO = 1? SI N0
Subrutina de DIVIDIR
COCIENTE 00000000 B
DIVIDENDO W
RESTO DIVIDENDO
DIVIDENDO DIVIDENDO - DIVISOR
¿ DIVIDENDO < 0 ? COCIENTE COCIENTE + 1 RETURN SI NO Subrutina de BIN_BCD DIVISOR D’100’ W PULSOS DIVIDIR CENTENAS COCIENTE DIVISOR D’10’ W RESTO DIVIDIR DECENAS COCIENTE UNIDADES RESTO RETUR N Subrutina BCD_7SEG PCL PCL + W
RETLW B'00111111' ;Retorna con W cargado con 00H RETLW B'00000110' ;Retorna con W cargado con 01H RETLW B'01011011' ;Retorna con W cargado con 02H RETLW B'01001111' ;Retorna con W cargado con 03H RETLW B'01100110' ;Retorna con W cargado con 04H RETLW B'01101101' ;Retorna con W cargado con 05H RETLW B'01111101' ;Retorna con W cargado con 06H RETLW B'00000111' ;Retorna con W cargado con 07H RETLW B'01111111' ;Retorna con W cargado con 08H
BIN_BCD Subrutina de MOSTRAR_DISPLAY
; Habilitar display de las DECENAS PORTE 00000010 B
; Temporizar. Perder tiempo con dos NOP
; Deshabilitar display de las UNIDADES y DECENAS PORTE 00000000 B
RETUR N
; Habilitar display de las UNIDADES PORTE 00000001 B
; Temporizar. Perder tiempo con dos NOP
; Deshabilitar display de las UNIDADES y DECENAS PORTE 00000000 B
W UNIDADES BCD_7SEG PORTD W
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 ;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 ; Selecciono la pagina 1 de la memoria