100% encontró este documento útil (1 voto)
34 vistas166 páginas

Notas sobre Microcontroladores PIC16F1937

Este documento presenta una introducción a los microcontroladores, su historia y aplicaciones. Describe las características y componentes clave del microcontrolador PIC16F1937, incluida su memoria, puertos y registros. También explica conceptos básicos de programación en lenguaje ensamblador como ciclos de reloj, representación de la memoria y programación de puertos de entrada y salida.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
34 vistas166 páginas

Notas sobre Microcontroladores PIC16F1937

Este documento presenta una introducción a los microcontroladores, su historia y aplicaciones. Describe las características y componentes clave del microcontrolador PIC16F1937, incluida su memoria, puertos y registros. También explica conceptos básicos de programación en lenguaje ensamblador como ciclos de reloj, representación de la memoria y programación de puertos de entrada y salida.
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

NOTAS DE MICROCONTROLADORES

LUIS CARLOS RAMÍREZ PELAEZ


Ingeniero Electrónico U. de A.

POLITECNICO COLOMBIANO JIC

AÑO 2022
MICROCONTROLADORES.
HISTORIA:
Según el Instituto Smithsoniano, el primer microcontrolador fue desarrollado
por un grupo de ingenieros de la Texas Instruments en 1971, aunque fue
comercializado en 1973.
La idea general que se tiene, es la de que Intel en 1971 fabricó el primer
microcontrolador al que denominó el 4004 y luego el 8008.
Se trata de un pequeño y económico chip programable, capaz de realizar
funciones almacenadas en su memoria. Incluye al igual que una computadora
una CPU, memoria y circuitos de entrada y salida.
El microcontrolador ha alcanzado un amplio mercado y desarrollo. La
industria automovilística, la automatización industrial y el mercado de los
electrodomésticos son testigos de esto.
Cada día son más pequeños y potentes. Hace algunos años, ATMEL fabricó un
microcontrolador de 2mm x 2mm y fue utilizado en juguetería y cepillos de
dientes.
Ha copado todos los mercados a saber: Electromedicina, Comunicaciones y
Electrónica Industrial.
Sus aplicaciones en Sistemas Embebidos, se consideran cada día más
funcionales y más económicos.
INTRODUCCIÓN:
Estas notas están dedicadas al PIC16F1937, pero también son válidas para
cualquier otro microcontrolador PIC de Gama Media..
Representación Gráfica:
Una breve indicación de las funciones de cada pin es la siguiente.
Este Microcontrolador de 8 bits (su bus de datos es de 8 bits), tiene
características tan actuales como las siguientes:
A.- Posee un oscilador interno que se activa para trabajar con una frecuencia
que puede ser seleccionada desde 31Khz hasta 32 Mhz.
También se puede trabajar con un oscilador externo a cristal.
B.- Su Watchdog Timer o Perro Guardian, puede ser programado desde
1mseg hasta 268 s.
C.- Su Memoria de Programa Flash es de 8K x 14 palabras.
D.- su memoria de datos es de 512 x 8 bytes.
E.- Su memoria de datos EEPROM es de 256 x 8 bytes.
F.- Contiene un stack o pila de 16 niveles.
G.- Posee 2 Registros Selectores de Archivos (FSRs) de 16 bits.
H.- Tiene capacidad para 100.000 ciclos de borrar/escribir en su memoria
Flash de programa.
I.- Su memoria EEPROM permite hasta 1.000.000 ciclos de borrar/escribir.
J.- La retención de datos en su M. EEPROM es mayor a 40 años.
K.- Su voltaje de polarización va desde 2.0V hasta 5.5V.

OTRAS CARACTERÍSTICAS DE ESTE MICROCONTROLADOR.


El PIC16F1937 tiene:
A.- 5 Puertos o grupos de líneas de comunicación. 4 de ellos, el A
, el B, el C y el D son de 8 líneas. El puerto E es de 4 líneas.
Las líneas de los puertos le sirven al microcontrolador para comunicarse con
el mundo exterior y pueden ser programadas cómo Entradas o Salidas de
datos.
B.- 2 pines para implementar el Reloj (oscilador) externo. Si es interno no
requiere de ningún pin.
C.- 4 pines de polarización (repetidos por parejas): +V y tierra.
En este curso, primero trabajaremos en lenguaje ASSEMBLER, luego en C.
Para el Assembler básico o tradicional se requiere conocer y manejar
solamente 49 instrucciones, que pueden ser consultadas en el anexo A de
estas notas. Los archivos de este tienen extensión .asm
Para el nuevo PIC-AS, cuyos archivos tienen extensión .S incluimos en estas
notas un pequeño tratado de este, tan pronto agotemos el tema de los
archivos .ASM.

ASSEMBLER BÁSICO.
CICLOS DE RELOJ Y DE MÁQUINA.
La señal del oscilador, es una señal cuadrada.
Si se toma la frecuencia de trabajo de 4Mhz., el período (T) de esta señal será
de 0,25 useg. Ya que período es 1/frecuencia.
A este período se le llama Ciclo de Reloj (T).
La mayoría de las instrucciones se ejecutan en 4 ciclos de reloj. A estos 4
ciclos se les llama Ciclo de Instrucción (CI).
Hay algunas instrucciones que requieren de 2 Ciclos de Instrucción.
El tiempo de 1 Ciclo de Instrucción es de 4T = 4x0,25 = 1useg. O sea que una
instrucción tarda 1useg en ejecutarse, cuando el Reloj es de 4Mhz.
Algunas instrucciones, tales como las de saltos, requieren 2 ciclos de
instrucción para ser ejecutadas.

REPRESENTACIÓN DE LA MEMORIA.
M. FLASH DE PROGRA. MEMORIA DE DATOS. MEMORIA EEPROM.
8K x 14 512 x 8 256 x 8
Veamos ahora las diferentes clases de Memorias del Microcontrolador .
A.- MEMORIA DE PROGRAMA.
Esta contiene el programa de nuestra aplicación y 16 niveles de Stack (Pila).
B.- Memoria de Datos.
La Memoria de Datos se divide en 32 bancos o bloques de datos que pueden
ser direccionados por la directiva BANKSEL.
En cada Banco, algunas posiciones de memoria son utilizadas por el
fabricante y estos son los llamados Registros Especiales.
En el Banco 0, estos registros se encuentran entre las posiciones 00h y 1Fh.
Los Registros del Usuario o de Propósito General van desde la posición 20h
hasta la 7Fh en el Banco 0.
Estos registros (los del Usuario) son utilizados para leer o escribir datos que
van a ser utilizados en las instrucciones del Programa General.

PROGRAMACIÓN DE LOS PUERTOS DE ENTRADA Y SALIDA.


Como ya se mencionó, el PIC16F1937 tiene 5 Puertos: PUERTO A, PUERTO B,
PUERTO C, PUERTO D Y PUERTO E.
Cada línea de cada Puerto puede ser programada independientemente como
Entrada o salida.
Para este propósito se requiere de la programación de 5 registros auxiliares
ubicados en el Banco 1 que son: TRISA, TRISB, TRISC, TRISD Y TRISE.
Las entradas se tomarán como Análogas o Digitales según los respectivos
registros ANSEL, ubicados en el banco #3. El Puerto C no tiene registro ANSEL
por lo cual sus entradas no corresponden a ninguna de las entradas
análogas. Por defecto serán digitales.
Cuando se pretende que una línea de un puerto sea una entrada, se debe
cargar en el respectivo bit del registro TRIS, un 1. Por ejemplo:
Si se requiere que el bit 0 del Puerto A sea una entrada, se debe cargar el bit
0 del registro TRISA, con 1.
Este sería el caso de colocar un pulsador en el bit 0 del Puerto A.
Si por el contrario se busca que el bit 7 de Puerto B sea una salida, se debe
cargar el bit 7 del registro TRISB, con 0.
Si se va a colocar un LED en el pin 7 del puerto B, se debe cargar con 0 el bit 7
del registro TRISB.

EL REGISTRO DE ESTADOS.

Este es un Registro Especial ubicado en la posición 03H del Banco 0, de la M.


de Datos. Su réplica también aparece en todos los otros Bancos.
El nombre dado por el fabricante es STATUS.
Es un registro de 8 bits que indica con cada uno de ellos, situaciones
especiales que se presentan en un programa, por ejemplo:
Cuando una cuenta almacenada en algún Registro, se está decrementando y
llega a un valor = 0 , el bit Z (bit #2) de este Registro se activa, o sea que se
pone en alto (1).

Función de sus pines:


Bits 7, 6, 5.
No están implementados.
Bit4……………. ´¿:
Bit indicador de Fuera de Tiempo.
1 = luego de power-up o de las instrucciones CLRWDT o SLEEP.
0 = Cuando se cumple el tiempo WDT.
´ :
Bit3……………… PD
Bit indicador de power-down.
1 = Después power-up o por la instrucción CLRWDT.
0 = Después de la instrucción SLEEP.
Bit2………………Z:
Bit indicador de 0.
1 = Cuando el resultado de una operación es 0.
0 = Cuando el resultado de una operación no es 0.
Bit1………………DC:
Indicador de Decimal Carry.
1 = Cuando se presenta un carry del bit3 al bit4.
0 = No se presenta dicho acarreo.
Bit0…………….…C:
Indicador de carry.
1 = Cuando se presenta un carry en el MSB de un registro.
0 = No se presenta dicho acarreo.

NOTA IMPORTANTE:
Este es un registro muy utilizado en los programas que se verán a
continuación, particularmente los bits Z y C
Otros conceptos serán ilustrados en el momento de presentarse la necesidad
u oportunidad.
A continuación se ilustra el nuevo Assembler presentado por la Microchip.

PIC-AS.
INTRODUCCIÓN:
El MPLAB X IDE v5.50 es un nuevo programa de la microchip que se utiliza
para desarrollar programas de microcontroladores pic tanto en assemler
como en c. en assembler incluye algunas característica novedosas y prácticas.
IDE significa que se trata de un ambiente de desarrollo embebido.
Se puede decir que un Sistema Embebido es tipicamente un diseño que
utiliza la potencia de un microcontrolador, tal como un PIC o un
microcontrolador AVR. estos PICs se combinan con algunos circuitos
periféricos para formar un pequeño módulo de control.
La diferencia fundamental entre un controlador embebido y un computador
personal es que el controlador embebido es dedicado a una solución
específica o a un grupo de soluciones.
Un computador personal está diseñado para correr diferentes tipos de
programas y para conectar muchos tipos de dispositivos.
Un ejemplo de sistema embebido puede ser un detector de humo. su función
es la de evaluar la señal de un sensor y generar una señal de alarma,
indicando la presencia de humo.
CONCEPTO:
El pic-as es la nueva versión en assembler que presenta la microchip. fue
presentado por a mediados del año 2020 y corregido en el 2021.

Los archivos que genera este software tienen la extensión .s y las diferencias
fundamentales con los archivos .asm son las siguientes:

1.- Para generar un proyecto nuevo se hace lo siguiente:

a: En la página principal del programa MPLAB X IDE v5.50 se encuentra la


forma de crear un proyecto nuevo.

A.- Se da click en CREATE NEW y aparece:


B.- Se da click en NEXT y aparece:

C.- En este numeral se procede de la siguiente manera:


1.- la fila de family se puede dejar como está, o en su defecto se puede
escoger la opción de Mid-Range que se encuentra en su interior.
2.- En la fila de Device se escribe simplemente el número del pic
seleccionado. en nuestro caso es 1937 y se da ENTER.
3.- Se coloca la viñeta en Show All y se ingresa en No Tool.
Aquí se selecciona PICkit3
D.- Se da clik en la opción NEXT y aparece lo siguiente:
E.- Se da click en la opción NEXT y aparece lo siguiente:
F.- Para trabajar en assembler, se selecciona la opción pic-as y se da click en
el renglón que aparece, quedando resaltado así:
G.- Se da click en la opción Next y aparece:
NOTA: El nombre tomado como ejemplo fue PRUEBA. Este es asignado por el
programador.
H.- A continuación se da click en la opción FINISH.
En la parte izquierda de la pagina rincipal, debajo de Proj…x, se lee el nombre
del proyecto. se da doble click sobre el nomre del proyecto y aparecen varias
opciones.
A continuación se da CLICK DERECHO sobre la opción source files y ubicando
el cursor sobre la opción NEW, aparece lo siguiente:
I.- Se selecciona la opción pic_8.asm como se muestra a continuación:
J.- Se da click y aparece lo siguiente:
A continuación se procede de la siguiente manera:
1.- En la parte superior de la página anterior se escribe el enunciado del
programa.
Cada renglón debe empezar con // o con ;
2.- Se pueden borrar los comentarios de la página anterior.
3.- Se hace la programación de bits tales como el Oscilador, WDT, entre
otros. El procedimiento es el siguiente:
A.- El estudiante entra a la opción Window.

B.- Escoge la opción: Target Memory Views. Aparece entonces un cuadro


C.- Se selecciona el renglón que dice: Configuration Bits y se da click.
D.- Se toman los valores adecuados para los bits
En el siguiente cuadro se observan los valores recomendados para las
primeras aplicaciones.
E.- Se da click donde dice Generate Source Code to Output y aparece:
F.- Se sombrea, se da Control C, se ubica el cursor en el archivo y se da
Control V, quedando así:

4.- A continuación se escribe el programa principal. Para esto se tiene en


cuenta lo siguiente:
Se hace una división imaginaria de la pantalla, con ayuda del tabulador, de
tres columnas.
En la primera columna se colocarán los LABELs, nombres de saltos o
marquillas. Siembre terminando con :
En la segunda columna se colocan las instrucciones propias del programa y
además, en su momento, las directivas ORG, BANKSEL, END, entre otras.
La tercera columna, que debe estar precedida de ; o de // se utiliza para
escribir comentarios. Estos son voluntarios y a gusto del programador.
5.- A continuación, en la segunda columna se escribe el Encabezado del
programa. Por ahora debe ser así:
ORG 0X00
NOP
GOTO INICIO
NOP
Se está indicando así, que el programa empieza en la posición 00 de la
Memoria de Programa.
Luego hay un salto a la posición INICIO que será donde empiezan las
instrucciones del programa.
Las instrucciones NOP no hacen nada, solamente una micropausa que se
convierte en estabilidad del programa.
NOTA.- Hasta este punto se debe ver la pantalla así:

5.- Posterior al encabezado, se colocan las Rutinas, tales como RETARDO o


TABLA, entre otras. Esto, si es que hay rutinas.
Este orden representa una práctica sana de programación.
6.- Finalmente va el programa principal.
En la primera columna se escribe la marquilla INICIO: o la que el programador
haya dispuesto. Debe ser por supuesto idéntica a la que se copió en el
encabezado.
Al terminar el programa se debe colocar la directiva END. Esta es la única
directiva obligatoria de un programa en assembler.
Para determinar si no hay errores en la escritura de las instrucciones, se va a
la opción gráfica del Martillo y Escoba y se da click.
El MPLAB X IDE compila el programa rápidamente y si no hay errores de
escritura, escribe el mensaje BUILD SUCCESSFUL.
Posterior a esto se puede quemar o simular el programa.
NOTA: Siempre se debe crear un Proyecto y dentro del proyecto estará el
programa.

PROGRAMAS O PROYECTOS.
A continuación se presentan algunos programas o proyectos sobre los temas
básicos del microcontrolador. En cada uno de ellos se incluye el Circuito
simulado en PROTEUS, Diagrama de Flujo en los primeros, y el respectivo
programa.
PROYECTO #1.- Se trata de un LED colocado en RB7, que prende y apaga
mientras un pulsador colocado en RA0, permanece activado.
Al soltar el pulsador el LED se apaga.
Con este pequeño programa se repasa la programación de Puertos y la
utilización de Rutinas.
Algunos Registros utilizados son:
ANSEL: Determina cuales entradas del PIC son digitales o análogas.
OSCTUNE: Calibración de la frecuencia de trabajo.
Con base en su contenido, se puede aumentar o disminuir hasta en un 0.1%,
la frecuencia de trabajo.
OSCCON: Programación de la frecuencia de trabajo.
La programación de este registro, se puede observar claramente en el DATA
SHEET de este microcontrolador.
Para los programas que se ven a continuación, se trabaja con el oscilador
interno y con una frecuencia de 4Mhz. Por este motivo el número que se
lleva a este registro es el 0x6A.
OPTION: Con el bit #7 de este registro puesto en 0, se habilita el PULL UP
para el Puerto B.
Esto se puede observar en este y otros programas que se escriben a
continuación.
1.1.- CIRCUITO:
1.2.- DIAGRAMA:
1.3.- PROGRAMA:
// SE TRATA DE UN LED QUE PRENDE Y APAGA CUANDO UN PULSADOR
ESTÁ // PRESIONADO. CUANDO EL LED SE SUELTA, EL LED SE APAGA.
#include <[Link]>
psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16
global _bar ; extern of bar function goes in the C source file
_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS.

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// ORIGEN DEL PROGRAMA:


ORG 0X00 ; POSICIÓN INICIAL.
NOP
GOTO INICIO
NOP

// LUGAR DE LAS RUTINAS:


RETAR: MOVLW 0XFF
MOVWF 0X20
BUCLE: NOP
MOVLW 0XFF
MOVWF 0X21
ROTA: NOP
DECFSZ 21,F
GOTO ROTA
NOP
DECFSZ 0X20,F
GOTO BUCLE
NOP
RETURN

// LÓGICA DEL PROGRAMA:


INICIO: NOP
BANKSEL ANSELA
CLRF ANSELA,1
CLRF ANSELB,1
BANKSEL TRISA
CLRF OSCTUNE
MOVLW 0X6A ; FREQ = 4 Mhz.
MOVWF OSCCON
BSF TRISA,0
NOP
BCF TRISB,0
NOP
BCF OPTION_REG,7 ; PULL UP.
NOP
BANKSEL PORTA
CADENA: NOP
BCF PORTB,0
CALL RETAR
NOP
BTFSC PORTA,0
GOTO CADENA
BSF PORTB,0
CALL RETAR
NOP
GOTO CADENA
NOP
END
PROYECTO #2.- El circuito consta de 8 LEDs conectados en el PUERTO B y
solamente uno de ellos está encendido.
Si el pulsador está presionado, la luz va circulando en un sentido. Si no está
presionado, la iluminación rota en sentido contrario.
2.1.- CIRCUITO:
2.2.- DIAGRAMA:
2.3.- PROGRAMA:
; INICIALMENTE SE OBSERVAN LOS 8 LEDs CONECTADOS AL PUERTO B
; PRENDER Y APAGAR UNO TRAS OTRO, DESDE RB0 HASTA RB7. AL
PRESIONAR ; Y MANTENER PRESIONADO EL PULSADOR, EL SENTIDO DE
PRENDER Y ; APAGAR SE INVIERTE.
; CONFIGURACIÓN DE BITS.
#include <[Link]>
psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16
; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS.
; PIC16F1937 Configuration Bit Settings

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// EQUIVALENCIAS:
// ENCABEZAMIENTO DEL PROGRAMA.
ORG 0X00 ; LUGAR DE ORIGEN.
NOP
GOTO INICIO
NOP

// LUGAR DE LAS RUTINAS.


RETAR: MOVLW 0XFF
MOVWF 0X20
BUCLE: NOP
MOVLW 0XFF
MOVWF 0X21
LAZO: NOP
DECFSZ 0X21,F
GOTO LAZO
NOP
DECFSZ 0X20,F
GOTO BUCLE
NOP
RETURN

// AQUI EMPIEZA EL PROGRAMA.


INICIO: NOP
BANKSEL (ANSELA)
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE
MOVLW 0X6A ; OSC. DE 4 Mhz.
MOVWF OSCCON
MOVLW 0X01 ; PARA EL PULSADOR
MOVWF TRISA
NOP
CLRF TRISB ; PARA LOS LEDs.
BCF OPTION_REG,7 ; PULL UP PARA EL PUERTO B.
NOP
BANKSEL (PORTA)
CLRF 0X25 ;CONTA
BSF STATUS,0 ; CARRY = 1.
CADENA: NOP
BTFSS PORTA,0 ; ¿PULSADOR = OFF?
GOTO PUL_ON ; NO!!!
RRF 0X25,F ; ROTA A LA DERECHA.
MOVF 0X25,W
MOVWF PORTB ; MUESTRA.
CALL RETAR
NOP
GOTO CADENA
PUL_ON: NOP
RLF 0X25,F ; ROTA A LA IZQUIERDA.
MOVF 0X25,W
MOVWF PORTB
CALL RETAR
NOP
GOTO CADENA
NOP
END
PROYECTO #3.- Consiste en incrementar cíclicamente un contador, mientras
está presionado un pulsador.
Al soltar el pulsador, el display se apaga.
El circuito incluye decodificador de 7 segmentos.

3.1.- CIRCUITO:
3.2.- DIAGRAMA:
3.3.- PROGRAMA:
; ES UN PROGRAMA QUE CUENTA CICLICAMENTE LOS #s DEL 0 AL 9
; MIENTRAS UN PULSADOR ESTÁ PRESIONADO.
; CUANDO EL PULSADOR SE SUELTA, EL DISPLAY SE APAGA.
#include <[Link]>
psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16
global _bar ; extern of bar function goes in the C source file
_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// CONFIGURACIÓN DE BITS.
; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data
memory code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover
(Internal/External Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe
Clock Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All
VCAP pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable
(Stack Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection
(Brown-out Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-
voltage on MCLR/VPP must be used for programming)

; ORIGEN DEL PROGRAMA.


ORG 0X00
NOP
GOTO INICIO
NOP
; ESTE ES EL ESPACIO PARA LAS SUBRUTINAS.
RETARDO: MOVLW 0XFF
MOVWF 0X20 ; REG #20 = 255 DECIMAL.
BUCLE: NOP
MOVLW 0XFF
MOVWF 0X21 ; REG #21 = 255 DECIMAL.
ROTE: NOP
DECFSZ 0X21,1
GOTO ROTE
DECFSZ 0X20,1
GOTO BUCLE
NOP
RETURN

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA) ; BANCO #1.
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE
MOVLW 0X6A ; Fr = 4Mhz.
MOVWF OSCCON
MOVLW 0X01 ; PTOA = INs.
MOVWF TRISA
CLRF TRISB ; PTOB = OUTs.
BCF OPTION_REG,7 ; HABILITA PULL UP.
NOP
BANKSEL (PORTA) ; BANCO #0.
APAGA: NOP
MOVLW 0X00
MOVWF 0X25 ; PARA MOSTRAR 0.

; UN DISPLAY CON DECODIFICADOR DE KÁTODO COMÚN SE APAGA CUANDO


; AL DECO SE LE ENTREGA EL # 1111 O SEA 0X0F.
NOP
MOVLW 0X0F
MOVWF PORTB ; APAGA.

; SE PREGUNTA SI EL PULSADOR ESTÁ PRESIONADO O NO.


PUL_PRE: NOP
BTFSC PORTA,0 ; PULS. = PRESIONADO?
GOTO APAGA ; NO!!!
NOP
MOVF 0X25,W ; W = CUENTA.
MOVWF PORTB ; MUESTRA.
CALL RETARDO
NOP
INCF 0X25,F ; INCREMENTO CUENTA.
MOVLW 0X0A ; LA CUENTA SE
DESBORDÓ?
XORWF 0X25,W
BTFSS STATUS,2
GOTO PUL_PRE ; NO!!!
NOP
CLRF 0X25 ; PARAVOLVER A EMPEZAR.
GOTO PUL_PRE
NOP
NOP
END
PROYECTO #4.- Se trata del PIC16F1937, un pulsador y un Display de 7
segmentos. Estando presionado el pulsador, la cuenta se incrementa desde 0
hasta 9, cíclicamente.
Utiliza la nueva instrucción BRW
No utiliza decodificador, por lo tanto, el programa debe contener una rutina
que haga las veces de dicho decodificador.

4.1.- CIRCUITO:
4.2.- DIAGRAMA:
4.3.- PROGRAMA:
; PROGRAMA CON PULSADOR, DISPLAY DE 7 SEG. DE KATODO COMÚN QUE:
; A.- SI EL PULSADOR ESTÁ OFF, EL DISPLAY ESTÁ OFF.
; B.- SI EL PULSADOR ESTÁ ON, EL DISPLAY VA MOSTRANDO LOS #s DEL
; 0 AL 9 Y SE REINICIA.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS:

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection (Program
memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.
ORG 0X00
NOP
GOTO INICIO
NOP

; ESTE ES EL LUGAR PARA LAS RUTINAS.


; A CONTINUACIÓN SE GENERA UN RETARDO.
RETARDO: MOVLW 0XFF
MOVWF 0X20
BUCLE: NOP
MOVLW 0XFF
MOVWF 0X21
ROTE: NOP
DECFSZ 0X21
GOTO ROTE
NOP
DECFSZ 0X20
GOTO BUCLE
NOP
RETURN

; TABLA ES UNA RUTINA QUE HACE LAS VECES DE UN DECODIFICADOR PARA


; DISPLAY. ENTREGA LOS CÓDIGOS DE DISPLAY DE LA TECLA PRESIONADA.
; EN MICROCOS ANTERIORES DE USA LA INST RUCCIÓN ADDWF PCL
PERO EN ESTE, NO ES POSIBLE.
UNA INSTRUCCIÓN QUE ES PARA EL PIC16F1938/9 FUNCIONA EN EL
PIC16F1937 Y SE TRATA DE BRW , VEAMOS
TABLA: NOP
MOVF 0X25,W ; W = CUENTA.
BRW ; (PC) = (PC) + 1 + W.
RETLW 0XBF ; CÓDIGO DEL 0.
RETLW 0X86
RETLW 0XDB
RETLW 0XCF
RETLW 0XE6
RETLW 0XED ; CÓDIGO DEL 5.
RETLW 0XFC
RETLW 0X87
RETLW 0XFF
RETLW 0XE7 ; CÓDIGO DEL 9.

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA)
CLRF ANSELA ; INs/OUTs DIGITALES.
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE ; AJUSTE DE FÁBRICA
MOVLW 0X6A ; FREC. = 4 MHZ.
MOVWF OSCCON
MOVLW 0X01 ; A0 = IN. (PARA EL PULSADOR).
MOVWF TRISA
CLRF TRISB ; Pto B = OUTs (PARA EL TEC.).
NOP
BCF OPTION_REG,7
NOP
BANKSEL (PORTA) ; BANCO 0.
CLRF 0X25 ; CONTADOR DE CÓDIGOS.
APAGA: NOP
CLRF 0X24 ; PARA APAGAR DISPLAY
MOVF 0X24,W
MOVWF PORTB ; APAGA DISPLAY
PREGU: NOP
BTFSC PORTA,0 ; ¿PUSADOR = ON?
GOTO APAGA ; NO!!!
NOP
CALL TABLA
MOVWF PORTB ; MUESTRA
CALL RETARDO
INCF 0X25
MOVLW 0X0A ; PARA SABER SI SE PASÓ DE 9.
XORWF 25,W ; W = W xor REG#25.
BTFSS STATUS,2 ; ¿Z = 1?
GOTO PREGU ; NO!!!...CONTINUA.
NOP ; SI SE PASÓ DE 9.
CLRF 0X25 ; PARA QUE VUELVA A EMPEZAR.
GOTO PREGU ; SI ES QUE SIGUE PRESIONADO.
NOP
NOP
END

PROYECTO #5.-
SE TRATA DE UN CONTADOR CÍCLICO ASCENDENTE Y DESCENDENTE ENTRE 0
Y 9, DEPENDIENDO DEL ESTADO DE UN PULSADOR .
NO HAY DECODIFICADOR
5.2.- DIAGRAMA:
5.3.- PROGRAMA:
; DEPENDIENDO DEL ESTADO DE UN PULSADOR, LA CUENTA QUE SE
; OBSERVA EN UN DISPLAY DE 7 SEGMENTOS, SERÁ ASCENDENTE O
; DESCENDENTE. AL DISPLAY NO SE CONECTA DECODIFICADOR.
#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// CONFIGURACIÓN DE BITS:

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection (Program
memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL:
ORG 0X00
NOP
GOTO INICIO
NOP

; ESTE ES EL LUGAR DE LAS RUTINAS.


RETAR: MOVLW 0XFF
MOVWF 0X20
CICLO: NOP
MOVLW 0XFF
MOVWF 0X21
ROTA: NOP
DECFSZ 0X21,F
GOTO ROTA
NOP
DECFSZ 0X20,F
GOTO CICLO
NOP
RETURN

; CODIGO ES LA RUTINA QUE HACE LAS VECES DEL DECODIFICADOR.


; CONTIENE LOS CODIGOS DE DISPLAY DE LOS #s DEL 0 AL 9.
CODIG: MOVF 0X25,0
BRW ; EN LUGAR DE ADDWF PCL,1
RETLW 0XBF
RETLW 0X86
RETLW 0XDB
RETLW 0XCF
RETLW 0XE6
RETLW 0XED
RETLW 0XFC
RETLW 0X87
RETLW 0XFF
RETLW 0XE7

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA)
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE
MOVLW 0X6A ; FREC. = 4 Mhz.
MOVWF OSCCON
MOVLW 0X01
MOVWF TRISA
CLRF TRISB
BCF OPTION_REG,7 ; PUL UP PARA EL PUERTO B.
NOP
BANKSEL PORTA
VUELVE: NOP
CLRF 0X25
PREGU: NOP
BTFSS PORTA,0 ; ¿ESTÁ EL PULSADOR ON?
GOTO DESCE ; SI!!!
NOP ; NO.
CALL CODIG
MOVWF PORTB
CALL RETAR
NOP
INCF 0X25,F
MOVLW 0X0A ; POR SI YA LLEGÓ A 10
XORWF 0X25,W
BTFSS STATUS,2
GOTO PREGU ; NO HA LLEGADO A 10.
NOP
GOTO VUELVE ; YA LLEGÓ A 10.

; COMO EL PUSADOR ESTÁ ON, LA CUENTA ES DESCENDENTE.


DESCE: NOP
CALL CODIG
MOVWF PORTB
CALL RETAR
NOP
DECF 0X25,F
MOVLW 0XFF ; POR SI PASÓ DE 00 A FF.
XORWF 0X25,W
BTFSS STATUS,2
GOTO PREGU ; NO HA LLEGADO A FF.
NOP
MOVLW 0X09 ; CUENTA MAYOR
MOVWF 0X25
GOTO PREGU ;
NOP
END

PROYECTO #6.- Utilizando un Teclado Matricial, un Display de 7 segmentos


sin Decodificador, El display muestra el código de la tecla presionada y al
soltarla, se apaga. Al presionar * se ve la letra A y al presionar #, se ve C.

6.1.- CIRCUITO:
6.2.- DIAGRAMA:
6.3.- PROGRAMA:
; ESTE PROGRAMA MUESTRA POR DISPLAY DE 7 SEGMENTOS LA TECLA
; PRESIONADA EN UN TECLADO MATRICIAL DE 3X4.
; CUANDO LA TECLA SE SUELTA, EL DISPLAY SE APAGA.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// CONFIGURACIÓN DE BITS.

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.
ORG 00
NOP
GOTO INICIO
NOP

; ESTE ES EL LUGAR DE LAS RUTINAS.


; TABLA TIENE LOS CODIGOS QUE SE GENERAN EN EL PUERTO B CUANDO SE
; PRESIONA UNA TECLA, ESTANDO HABILITADO EL PASEO DEL CERO.
TABLA: NOP
MOVF 0X25,W
BRW ; INSTRUCCIÓN CLAVE.
RETLW 0XBD ; CÓDIGO DEL 0.
RETLW 0XF3 ; CÓDIGO DEL 1.
RETLW 0XF5
RETLW 0XF6
RETLW 0XEB
RETLW 0XED
RETLW 0XEE
RETLW 0XDB
RETLW 0XDD
RETLW 0XDE ; CODIGO DEL 9.
RETLW 0XBB ; CÓDIGO DEL *.
RETLW 0XBE ; CÓDIGO DEL #.

; MUEST CONTIENE LOS CODIGOS DE DISPLAY DE LA TECLAS TECLAS.


CAMPO: NOP
MOVF 0X25,W
BRW
RETLW 0XBF ; CÓDIGO DE DISPLAY DEL 0.
RETLW 0X86
RETLW 0XDB
RETLW 0XCF
RETLW 0XE6
RETLW 0XED
RETLW 0XFC
RETLW 0X87
RETLW 0XFF
RETLW 0XE7 ; CÓDIGO DE DISPLAY DEL 9.
RETLW 0XF7
RETLW 0XB9

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA)
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE
MOVLW 0X6A
MOVWF OSCCON
MOVLW 0X00 ; 4 SALIDAS PARA EL DECO.
MOVWF TRISA ; LAS MENOS SIGNIFICATIVAS.
MOVLW 0XF8 ; 3 COL., 4 FILAS, 1 PIN SUELTO.
MOVWF TRISB
BCF OPTION_REG,7
NOP
BANKSEL PORTA ; BANCO 0.
VUELVE: NOP
MOVLW 0XFE ; PASEO DEL 0.
MOVWF 0X24
CLRF 0X25 ; CONTADOR DE TECLAS.
NOP
CLRF PORTA ; PARA APAGAR DISPLAY.

; AHORA SE DETECTA SI HAY TECLA PRESIONADA.


CONTI: NOP
MOVF 0X24,0
MOVWF PORTB
NOP
MOVF PORTB,0
ANDLW 0XF8 ; COLOCA LAS COLUMNAS EN 0.
XORLW 0XF8
BTFSS STATUS,2 ; ¿HAY TECLA PRESIONADA?
GOTO SI_PRE ; SI!!!
NOP

; COMO NO HAY TECLA PRESIONADA, NO SE MUESTRA NADA Y SE HACE EL


PASEO DEL 0.
CLRF PORTA ; APAGA DISPLAY
NOP
RLF 0X24,1 ; DESPLAZA EL 0.
BSF 0X24,0 ; SE COLOCA EN 1 EL BIT 24,0.
NOP
BTFSS 0X24,3 ; ¿EL 0 SE DESBORDÓ?
GOTO VUELVE ; SI!VUELVE A EMP. EL P. DEL 0.
GOTO CONTI

; COMO SI HAY TECLA PRESIONADA, SE DETECTA CUAL ES.


SI_PRE: NOP
CALL TABLA
XORWF PORTB,0 ; VE SI LOS CÓDIGOS SON =s.
BTFSC STATUS,2 ; ¿SON IGUALES?
GOTO MUST ; SI!!! MUESTRA EL CÓDIGO
NOP
INCF 0X25 ; OJO!!!
GOTO CONTI ; PARA BUSCAR OTRA TECLA.
MUST: NOP
CALL CAMPO ; PARA MOSTRAR POR DISPLAY,
MOVWF PORTA
GOTO CONTI ; PARA VER SI SUELTA LA TECLA.
NOP
END

EL TIMER 0 (TMR0).
Este es uno de los registros especiales ubicado en la posición 0x015 del Banco
0 de la Memoria de Datos.
Este recurso se puede utilizar como contador de pulsos externos, a través del
pin RA4 (TOCKI) o como temporizador, utilizando la frecuencia del oscilador
principal.
El conteo puede estar afectado por un divisor de frecuencia llamado el
PRESCALER. Este recurso puede ser asignado por software al TMR0 o al WDT,
veamos:
A.- Registro OPTION.
Su posición en la Memoria RAM es la 0X095.
El nombre a utilizar dentro de un programa es OPTION_REG.
Sus pines son:
R/W R/W R/W R/W R/W R/W R/W R/W
´
WPUEN INTEDG TOCS TOSE PSA PS2 PS1 PS0
BIT7 BIT0
BIT 7. ´
WPUEN : Pin de habilitación de un débil Pull Up.
1: El débil Pull Up está deshabilitado.
0: El débil Pull Up está habilitado.
BIT 6. INTEDG: Selección de flanco, para una interrupción (Si han
sido habilitadas).
1: La interrupción se genera con flanco de subida.
0: la interrupción se genera con flanco de caída.
BIT 5. TMR0CS: Selección del reloj.
1: Conteo a través del pin TOCKI. (TMR0 = Contador).
0: Conteo cada 1/4Fosc. (TMR0 = Temporizador).
BIT 4. TMR0SE: Flanco escogido para el conteo.
1: Cuenta con el flanco de caída de la señal aplicada a TOCKI.
0: Con el flanco de subida.
BIT 3. PSA: Asignación del PRESCALER.
1: El PRESCALER no se asigna al TMR0.
0: Se asigna al TMR0.
BITS 2,1,0. Valor del PRESCALER:

Configuración de bits. Relación para el TMR0


000 1:2
001 1:4
010 1:8
011 1 : 16
100 1 : 32
101 1 : 64
110 1 : 128
111 1 : 256

El TMR0 es un registro de 8 bits que al incrementarse y llegar su valor a 0XFF


y desbordarse (pasar a la posición 00), activa una bandera o bit del registro
INTCON, llamada TOIF. Esta debe ser borrada por software.
Veamos el caso de un temporizador:
EJEMPLO # 1 .- Se desea conocer el tiempo que tarda en desbordarse el
TMR0, sabiendo que su carga inicial es 0XF1.
La frecuencia de trabajo es de 4 Mhz. Por lo tanto la duración de un Ciclo de
Máquina = 4 Ciclos de Reloj es: 1 useg.
Cuando es utilizado el TMR0 como temporizador, su cuenta se incrementa
con base en Fosc/4, o sea cada 4/4Mhz = 1useg = 1C. de Instrucción.
El Prescaler a utilizar es de 1 : 2.
Entonces: Retardo = ([Link] I. = 1us)x(Prescaler = 2)x(# de Pulsos)
El número de pulsos se calcula como el complemento a 2 del valor asignado
al TMR0 como carga inicial. Por lo tanto:
Carga inicial = 0XF1 = 11110001
Su complemento a 2 es: 00001110 + 1 = 00001111 = 0F.
El # de pulsos es = 0X0F = 15.
De donde Retardo = 1useg X 2 X 15 Pulsos = 30useg.
EJEMPLO # 2.- Diseñar con el TMRO una señal rectangular de frecuencia =
1Khz.
Solución:
Si f = 1Khz, entonces el período T = (1/1000) seg = 1000 useg.
Por lo tanto, el tiempo que permanece alta la señal es T/2 = 500useg.
Es el mismo tiempo que la señal permanece en 0, en un período T.
Considerando un Prescaler = 2 y un Reloj de 4 Mhz, tenemos:
Semiperíodo = 500useg.
500useg = (1useg)x(2)x( # de pulsos)
Por lo tanto el # de pulsos = 500/2 = 250Pulsos.
Debemos ahora determinar la carga inicial para que el TMR0 se desborde
después de 250 pulsos. Veamos:
250 = 0XFA = 11111010
Y su complemento a 2 es: 00000110 = 0X06
Entonces la carga inicial del TMR0 es 0X06.
Un programa que entregue a un parlante dicha señal, es el siguiente:

PROYECTO #7.-
UTILIZANDO EL PIN RBO LLEVAR A UN PARLANTE UNA SEÑAL DE 1Khz,
CUANDO UN PULSDOR UBICADO EN EL PIN RA0 ES PRESIONADO.

7.1.- PROGRAMA:
; ESTA APLICACIÓN GENERA UNA SEÑAL RECTANGULAR DE 1 Khz, AL ACTIVAR
; UN PULSADOR.
#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16


; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS.
; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection (Program
memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)
; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.
ORG 0X00
NOP
GOTO INICIO
NOP

; LÓGICA DEL PROGRAMA.


INICIO: NOP
BANKSEL (ANSELA)
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
BSF TRISA,0 ; PULSADOR.
BCF TRISB,0 ; PARLANTE.
CLRF OPTION_REG ; PRESC, RELOJ, PULL UP.
BANKSEL (PORTA)
CLRF 0X20 ; RESPALDO.
SI_SUENA: NOP
MOVF 0X20,W
MOVWF PORTB
NO_SUENA: NOP
BTFSC PORTA,0 ; PULSADOR = ON?
GOTO NO_SUENA
BANKSEL (TMR0)
MOVLW 0X06 ; CARGA DEL TMR0.
MOVWF TMR0
CONTIN: MOVLW 0X00
XORWF TMR0,W ; ¿ YA SE DESBORDÓ?
BTFSS STATUS,2
GOTO CONTIN ; NO!!
BANKSEL (PORTB)
INCF 0X20,F
GOTO SI_SUENA
NOP
END

7.2.- CIRCUITO:
SEÑAL QUE ENTREGA EL MICROCONTROLADOR:

MEMORIA EEPROM.
El PIC16F1937, al igual que todos los microcontroladores PIC actuales,
incluyen un bloque de memoria EEPROM interna, no direccionable
directamente.
Para este Microcontrolador, su tamaño es de 256 bytes o posiciones de
memoria. Se enumeran desde la posición 0x00 hasta la 0xFF.
Para un perfecto funcionamiento de esta memoria, este PIC utiliza un grupo
de Registros de Función Espcial (SFRs) que está compuesto por 6 registros,
que son:
NOMBRE: POSICIÓN: BANCO:
EECON1 0X215 3
EECON2 0X216 3
EEDATL 0X213 3
EEDATH 0X214 3
EEADRL 0X211 3
EEADRH 0X212 3

Representación de la Memoria EEPROM:


I---- 8 bits ---I
Posición 0X000.
.
.
.
.
.
Posición 0X0FF.
Son 256 posiciones de Memoria EEPROM.
Registros:
1.- EEDATL. En este se escribe el dato que se quiere llevar a la Memoria
EEPROM en un ciclo de escritura. En un ciclo de lectura, queda en este
registro depositado el byte que se lee en la memoria EEPROM.
2.- EEADRL. En este registro se carga la dirección de la memoria EEPROM
(entre 0x000 hasta 0x0FF) donde se quiere llevar el dato que se encuentra
depositado en el registro EEDATL.
3.- EECON1. Contiene la programación de cómo se va a utilizar la M:
EEPROM, veamos:
R/W R/W R/W R/W R/S R/S
EEPGD CFGS LWLO FREE WRERR WREN WR RD

R = READ.
W = WRITE.
S = SET.
Bit 7…….. EEPGD: Bit de selección de la M. de Programa/Datos.
Si bit 7 = 1: El acceso es a la M. de Programa.
Si bit 7 = 0: El acceso es a la M. EEPROM.
Bit 6……..CFGS: Bit de acceso a Configuración o a Memorias.
Si bit 6 = 1 : El acceso es a la configuración.
Si bit 6 = 0 : El acceso es a la M. EEPROM.
Bit 5……….LWLO: Si EEPGD y CFGS son iguales a cero, este bit es ignorado.
Bit 4……….FREE: Bit de borrado forzado.
Si bit 4 = 1: Borra una posición de la M. de Programa.
Si bit 4 = 0: Permite la escritura solamente.
Bit 3………..WRERR: Bit (o bandera) de indicación de error.
Si bit 3 = 1: Sucedió un error en el proceso de escritura.
Si bit 3 = 0: La escritura se completó satisfactoriamente.
Bit 2…………WREN: Habilitación de la escritura en la M. EEPROM.
Si bit 2 = 1: La escritura queda habilitada.
Si bit 2 = 0: La escritura no está habilitada.
Bit 1………….WR: Bit de escritura.
Si bit 1 = 1: Empieza la escritura. Automaticamente este bit se
Hace = 0, cuando termina la escritura.
Si bit 1 = 0: El ciclo de escritura terminó o no ha comenzado.
Bit 0………….RD: Bit de lectura.
Si bit 0 = 1: Empieza la lectura. Automaticamente este bit se hace
= 0 cuando termina la lectura.
Si bit 0 = 0: La lectura no ha empezado o ya terminó.

4.- EECON2. Este registro no está implementado físicamente, pero es


indispensable en el proceso de escritura en la M. EEPROM.
5.- Aunque la pareja de registros EEADRH y EEADRL pueden formar una
dirección de 16 bits, solamente se utiliza el contenido de EEADRL para
direccionar la Memoria EEPROM. Para esto, el bit el bit EEPGD del registro
EECON1 debe ser igual a 0.

Pasos a seguir en un ciclo de lectura.


1.- Escribir en el registro EEADRL la dirección requerida de la M. EEPROM.
2.- Hacer EEPGD = 0.
3.- Hacer CFGS = 0.
3.- Colocar RD = 1 para empezar.
4.- Leer el resultado en el registro EEDATL en el c: de I. siguiente.
Ejemplo: Llevar al registro # 30hex. De la M. de DATOS, el contenido de la
posición de memoria # 0x08 de la M. EEPROM.
LECTURA NOP
BANKSEL (EEADRL) ; BANCO 3.
MOVLW 0X08 ; DATO A LEER.
MOVWF EEADRL
BANKSEL EECON1 ; BANCO 3.
BCF EECON1,7 ; EEPGD = 0.
NOP
BCF EECON1,6 ; CFGS = 0.
BSF EECON1,0 ; (RD = 1).SE LEE.
BANKSEL (EEDATA) ; BANCO 3.
MOVF EEDATA,0 ; DATO PASA A W.
BANKSEL PORTA ; BANCO 0.
MOVWF 0X30 ; O.K.

Pasos a seguir en un ciclo de escritura.


1.- Escribir la dirección de la M. EEPROM (en la cual se va a escribir), en el
Registro EEADRL.
2.- Escribir el dato a llevar en EEDATL.
3.- Hacer CFGS = 0.
3.- Hacer EEPGD = 0.
4.- Hacer WREN = 1.
5.- Deshabilitar interrupciones (si es que fueron habilitadas), con GIE = 0 del
Registro INTCON.
6.- Escribir en EECON2 la secuencia especial y necesaria:
MOVLW 0X55
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
7.- Colocar WR = 1 y esperar a que se haga = 0.
8.- Habilitar nuevamente las Interrupciones, si es que fueron deshabilitadas.
9.- Hacer WREN = 0.
Ejemplo.- Escribir el # 14en la posición # 35 de la M. EEPROM.
ESCRI NOP
BANKSEL (EEADRL) ; BANCO 3.
MOVLW 0X14 ; DATO A ESCRIBIR.
MOVWF EEDATL
MOVLW 0X35 ; DIREC. DE LA EEPROM.
MOVWF EEADRL
BANKSEL EECON1
BCF EECON1,6 ; CFGS = 0.
BCF EECON1,7 ; EEPGD = 0.
BSF EECON1,2 ; WREN = 1.
MOVLW 0X55 ; SECUENCIA ESPECIAL.
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
NOP
BSF EECON1,1 ; ESCRIBE.
AUN_NO NOP
BTFSC EECON1,1 ; ¿WR = 0?
GOTO AUN_NO ; AUN NO!!!
BCF EECON1,2 ; WREN = 0.

PROYECT0 #8.- Control de acceso.


Este proyecto además de ilustrar los conceptos fundamentales de la memoria
EEPROM, sirve como guía en la construcción de un control de acceso a una
residencia, clave para abrir un sistema de seguridad.
8.1.- PROGRAMA:
; ESTE PROGRAMA ALMACENA EN LA M. EEPROM UNA CLAVE DE UN DÍGITO.
; INICIALMENTE AL PRSIONAR UNA TECLA, SE VE SU # EN EL DISPLAY. EL
; ÚLTIMO QUE SE PRESIONA ANTES DE PRESIONAR * REPRESENTA LA CLAVE.
; AL PRESIONAR UN #, APARECE EN EL DISPLAY EL # DE LA CLAVE Y PRENDE
UN ; LED ROJO SI EL NÚMERO QUE SE TECLEO NO ES LA CLAVE.
; AL PRESIONAR EL # DE LA CLAVE, PRENDE UN LED VERDE Y SE VE EN EL
; DISPLAY DICHO #.
#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16


; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS.

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.

ORG 0X00
NOP
GOTO INICIO
NOP

; ESTE ES EL LUGAR DE LAS RUTINAS.


; TABLA TIENE LOS CODIGOS QUE SE GENERAN EN EL
; PUERTO B CUANDO SE PRESIONA UNA TECLA.
TABLA: NOP
MOVF 0X25,0
BRW ; OJO.
RETLW 0XBD ; CÓDIGO DEL 0.
RETLW 0XF3 ; CÓDIGO DEL 1.
RETLW 0XF5
RETLW 0XF6
RETLW 0XEB
RETLW 0XED
RETLW 0XEE
RETLW 0XDB
RETLW 0XDD
RETLW 0XDE ; CODIGO DEL 9.

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA)
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE
MOVLW 0X6A
MOVWF OSCCON
MOVLW 0X10 ; PINES AL DECO Y
MOVWF TRISA ; LEDs VERDE Y ROJO.
MOVLW 0XF8 ; 3 COL. Y 4 FILAS.
MOVWF TRISB
BCF OPTION_REG,7
NOP
BANKSEL (PORTA) ; BANCO 0.
MOVLW 0XBB ; COD. DEL *
MOVWF 0X29 ; EN EL REG. #29.
CLRF 0X21 ; POR SI PRESIONÓ *.
VUELVE: NOP
MOVLW 0XFE ; PASEO DEL 0.
MOVWF 0X24
CLRF 0X25 ; CONT. DE TECLAS.
NOP
MOVLW 0X0F ; DISPLAY = OFF.
MOVWF PORTA

; AHORA VOY A DETECTAR SI HAY TECLA PRESIONADA.


CONTI: NOP
MOVF 0X24,0 ; R#24 = 0XFE INI/TE.
MOVWF PORTB
NOP
MOVF PORTB,0
ANDLW 0XF8 ; COLUMNAS = 0.
XORLW 0XF8
BTFSS STATUS,2 ; ¿TEC. PRESIONADA?
GOTO SI_PR1 ; SI!!!
NOP

; COMO NO HAY TECLA PRESIONADA, NO SE MUESTRA NADA Y SE HACE EL


; PASEO DEL 0.
MOVLW 0X0F ; DISP = OFF.
MOVWF PORTA ; APAGA.
NOP
RLF 0X24,1 ; ROTA EL 0.
BSF 0X24,0 ; BIT 24,0 = 1.
NOP
BTFSS 0X24,3 ; ¿EL 0 DESBORD.?
GOTO VUELVE ; SI!
NOP ; SIGUE EL P. DEL 0.
GOTO CONTI

; HAY TECLA PRESIONADA, MIREMOS CUAL ES.


SI_PR1: NOP
CALL TABLA
XORWF PORTB,0 ; CÓDIGOS =s?
BTFSC STATUS,2
GOTO MUST ; SI!!!

; VA A PREG. SI TECLEÓ *.
MOVF 0X29,0 ; W = 0XBB
XORWF PORTB,0
BTFSS STATUS,2 ; ¿SON IGUALES?
GOTO MUELA ; NO! AUN NO.
NOP
BSF 0X21,0 ; SI TECLEÓ *.
GOTO VUELVE ; A ESPERAR QUE
NOP ; SUELTE. (LEER).
MUELA: NOP
INCF 0X25,1
MOVLW 0X0A
XORWF 0X25,0
BTFSC STATUS,2 ; ¿REG. #25 = 0X0A?
GOTO VUELVE ; SI.
GOTO CONTI ; NO. SIGUE MIRAN.

; VA A MOSTRAR LA TECLA PRESIONADA.


MUST: NOP
BTFSC 0X21,0 ; SEÑAL DE *.
GOTO LEER ; VA A COMPARAR.
MOVF 0X25,0 ; # DE TECLA PRES.
MOVWF PORTA ; MUESTRA.
MOVF 0X25,0 ; W = REG.#25.
NOP
; AHORA SE VA A LLEVAR A LA M. EEPROM EL # DE LA TECLA PRESIONADA.
EEP: NOP
BANKSEL (EEADRL) ; BANCO 2.
NOP ; EEDATA = W .
MOVWF EEDATL
MOVLW 0X35 ; DIREC. EEPROM.
MOVWF EEADRL
BANKSEL EECON1
BCF EECON1,7 ; EEPGD = 0.
BCF EECON1,6 ; CFGS = 0.
BSF EECON1,2 ; WREN = 1.
NOP
BCF INTCON,7 ; SIN INTERR.
MOVLW 0X55 ; SECUEN. DE FABR.
MOVWF EECON2
MOVLW 0XAA
MOVWF EECON2
NOP
BSF EECON1,1 ; ESCRIBE.
AUN_1: NOP
BTFSC EECON1,1 ; ¿WR = 0?
GOTO AUN_1 ; AUN NO!!!
NOP
BCF EECON1,2 ; WREN = 0.
BANKSEL (PORTA)
NOP
NOP
GOTO CONTI

; SE TOMA EL CODIGO DE LA POSICIÓN #35 DE LA EEPROM Y SE MUESTRA.


LEER: NOP
BANKSEL (EEADRL) ; BANCO 2.
MOVLW 0X35 ; DATO A LEER.
MOVWF EEADRL
BANKSEL (EECON1) ; BANCO 3.
BCF EECON1,7 ; EEPGD = 0.
NOP
BSF EECON1,0 ; LEE.
BANKSEL (EEDATL)
MOVF EEDATL,0 ; DATO EN EEDATA.
BANKSEL (PORTA) ; BANCO 0.
MOVWF 0X20 ; O.K.
MOVF 0X20,0
MOVWF PORTA
NOP
BTFSS 0X21,0 ; ¿YA PRESIONÓ *?.
GOTO CONTI ; NO. MIRA SI SOLTÓ.
NOP ; SI!
MOVLW 0XFF ; MIRA EL LED =ON.
MOVWF 0X28
MOVF 0X20,0 ; W = C. DE T. = ON.
XORWF 0X25,0
BTFSS STATUS,2 ; ¿CLAVE CORRECTA?
GOTO INCOR ; NO.
BSF PORTA,6 ; SI! LED VERDE = ON.
NOP
GOTO VISUAL
INCOR: NOP
BSF PORTA,7 ; PRENDE LED ROJO.
VISUAL: NOP
DECFSZ 0X28,1 ; t DE
VISUALIZACIÓN.
GOTO VISUAL
GOTO CONTI
NOP
END

8.2.- CIRCUITO:
Continuaremos este documento explicando las características del Display de
Cristal Líquido para terminar la parte de Assembler, con el tema de
Interrupciónes.

DISPLAY DE CRISTAL LÍQUIQUIDO (LCD).


Aunque existen actualmente en el mercado displays de cristal líquido de
muchas características, enfocaremos nuestro análisis a los más comunes, o
sea a los de 2 líneas y 16 caracteres por línea. Con Back Ligt (iluminación de
fondo).
Cada carácter de este display es una matriz de puntos y su tamaño se puede
escoger entre dos valores, como lo veremos luego.
Un mensaje de varios caracteres, no tiene que ser multiplexado como en los
display de 7 segmentos.
El consumo de potencia es menor en esta clase de display.
Los caracteres que pueden ser representados, son además de los caracteres
ASCII, los benjii y algunos diseñados por el programador.
En cada línea se pueden almacenar hasta 40 caracteres, de los cuales son
visibles solamente 16 caracteres.

Representación de un LCD.
En esta se muestran las posiciones de memoria que ocupan cada uno de los
caracteres visibles de cada una de las líneas:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F

Memorias del LCD.


Son 3: DDRAM, CGROM, CGRAM.
A.- MEMORIA DDRAM. Contiene las posiciones de memoria correspondientes
a la primera y a la segunda línea del LCD. Veamos:
M. DDRAM
Posición 00h.
. Primera Línea.
Posición 27h
.
.
Posición 40h
. Segunda Línea.
Posición 67h
I-----8bits-------I

B.- M. CGROM: Co0ntine todos los caracteres que pueden ser representados
en la pantalla, tales como0 los caracteres ASCII, Griegos, Benjii, entre otros.
Estos vienen de fábrica y no pueden ser modificados por el programador.
C.- M. CGRAM: En esta Memoria pueden ser almacenados temporalmente,
hasta 8 caracteres diseñados por el programador.
Pines de LCD.
Son los siguientes:
1 GND Tierra o Común.
2 +V Polarización (5V).
3 V0 Contraste.
4 RS Datos o Control.
5 R/W Lectura o Escritura.
6 E Habilitación
7 D0 LSB del Byte de datos.
8 D1
9 D2
10 D3
11 D4
12 D5
13 D6
14 D7 MSB de Byte de datos.
15 Ax Ánodo de Iluminación.
16 Kx Kátodo de iluminación.

Manejo del LCD.


¿Cómo indicar al LCD la forma de operar?
A esta función la llamaremos Modo de Configuración.
Se trata de indicarle funciones como las siguientes:
Que el mensaje sea fijo. O que rote a la izquierda o derecha.
Que el mensaje empiece en la posición 00 de la pantalla o en otra posición.
Que el cursor titile o no. O que no se vea.
Que se pueda escribir en una línea o en dos.
Otras que veremos a continuación.
Para realizar esta función, se requiere llevar información al microcontrolador
del LCD.
Cada operación de escritura de información en dicho microcontrolador tarda
1,6ms y representa el tiempo que tarda el LCD en recibir un Byte de
Configuración por sus pines de entrada (Esto cuando el LCD se trabaja a 8
bits).
Durante este período (1,6ms) el pin RS debe estar en nivel bajo (0V) mientras
que el pin E debe estar en nivel alto (5V). Veamos:
¿Cómo mostrar un dato por el LCD?
A esta función la llamaremos Modo Dato.
Consiste en llevar a la pantalla del LCD un carácter.
Esta operación tarda 40us y en ella, los pines RS y E deben permanecer en
estado alto (5V). Veamos:
Las instrucciones de funcionamiento del LCD, se pueden observar en la
siguiente tabla:

Comando Limpiar el LCD: Los pines D7 a D0 están en 00000001.


Se borra la pantalla y el cursor vuelve a la posición inicial (00h).

Comando Retornar: Los pines D7 a D0 están en 0000001X.


Devuelve el cursor a la posición inicial dejando intacto el contenido de la
pantalla.
Comando Modo de Entada. Los pines D7 a D0 están en 000001 I/D S.
Si S = 0 Los caracteres que se ven en el display, permanecen fijos al
escribir un nuevo carácter.
Si S = 1 Los caracteres que se ven en el display, se desplazan al escribir un
nuevo carácter.
Si I/D = 0 Decremento automático de la posición del cursor.
Si I/D =1 Incremento automático de la posición del cursor.

Comando Control LCD. Los pines D7 a D0 están en 00001 D C B.


Si B = 0 No parpadea el cursor.
Si B = 1 Si parpadea el cursor.
Si C = 0 No se visualiza el cursor.
Si C = 1 Si se visualiza el cursor.
Si D = 0 El display está OFF
Si D = 1 El display está ON.

Comando Cursor y LCD. Los pines D7 a D0 están en 0001 S/C R/L X X.


Controla el desplazamiento del cursor y la pantalla.
Si R/L = 0 La pantalla se desplaza a la izquierda.
Si R/L = 1 La pantalla se desplaza a la derecha.
Si S/C = 0 Solamente el cursor se desplaza.
Si S/C = 1 Contenido del display y cursor se desplazan.

Comando Control HW. Los pines D7 a D0 están en 001 DL N F X X.


Si F = 0 El tamaño de los caracteres es de 5X7.
Si F = 1 El tamaño es de 5X10.
Si N = 0 El mensaje es de 1 línea.
Si N = 1 El mensaje es de 2 líneas.
Si D/L = 0 La comunicación es a 4 bits.
Si D/L = 1 La comunicación es a 8 bits.
Comando DDRAM. Los pines D7 a D0 están en: 1 (dirección de la DDRAM).
Se utiliza cuando se desea escribir en una posición del display igual o
diferente a la posición de origen. Ya sea en la primera o en la segunda línea.
Por ejemplo:
A.- Para empezar a escribir caracteres en la posición 06h de la primera línea
debo cargar este comando con el número 10000110 = 0x86.
B.- Para empezar a escribir caracteres en la posición 46h de la segunda línea
debo cargar este comando con el número 11000110 = 0XC6.

Pasos a seguir en la construcción de un programa para un LCD.


1.- Los caracteres del mensaje a mostrar deben copiarse en una rutina Tabla
en caracteres ASCII o entre comillas dobles.
2.- Otra rutina que es fundamental es la de Control. En ella se generan los
tiempos y los estados de voltaje para los pines RS y E.
3.- El programa principal debe empezar por las instrucciones que indican al
LCD cómo de be trabajar.
4.- Se debe generar un control para el llenado del primero y segundo renglón.

PROYECTO #9.- Construir un programa con un LCD que muestre en dos líneas
un mensaje fijo.

9.1.- CIRCUITO:
9.2.- PROGRAMA:
; ESTA APLICACIÓN MUESTRA POR UN LCD EL MENSAJE :
; GRACIAS A DIOS POR LA VIDA!
; DEBE ESTAR CENTRADO Y EN LOS DOS RENGLONES.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16


; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS:

; PIC16F1937 Configuration Bit Settings


; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection (Program
memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL:
ORG 0X00
NOP
GOTO INICIO
NOP

; ESTE ES EL ESPACIO DE LAS RUTINAS.

; RETARDO DURA ALGO MÁS DE 1,6 ms. SUFICIENTE PARA


; TRATAR ADECCUADAMENTE LAS INSTRUCIOES Y LOS DATOS DEL DISPLAY.
RETARDO: NOP
MOVLW 0X80
MOVWF 0X20
CICLO: NOP
MOVLW 0X80
MOVWF 0X21
BUCLE: NOP
DECFSZ 0X21,F
GOTO BUCLE
NOP
DECFSZ 0X20,F
GOTO CICLO
NOP
RETURN

; TABLA CONTIENE EL MENSAJE QUE SE VA A MOSTRAR.


TABLA: NOP
MOVF 0X25,W
BRW ; OJO.
RETLW “” ; ESPACIO INICIAL.
RETLW “!” ; SIGNO !
RETLW "G"
RETLW "R"
RETLW "A"
RETLW "C"
RETLW "I"
RETLW "A"
RETLW "S"
RETLW ""
RETLW "A"
RETLW ""
RETLW "D"
RETLW "I"
RETLW "O"
RETLW "S"
RETLW ""
RETLW "P"
RETLW "0"
RETLW "R"
RETLW ""
RETLW "L"
RETLW "A"
RETLW ""
RETLW "V"
RETLW "I"
RETLW "D"
RETLW "A"
RETLW "!"
RETLW ""

; CONTROL GENERA UN RETARDO LIGERAMENTE MAYOR A 1,6ms PARA


; DILIGENCIAR ADECUADAMENTE LAS INSTRUCCIONES Y CARACTERES.
CONTROL: NOP
BCF PORTA,0 ; RA0 = RS
GOTO SIGAN
DATO: BSF PORTA,0
SIGAN: NOP
MOVF 0X24,W
MOVWF PORTB ; CARGA EL LCD.
NOP
BSF PORTA,1 ; E = 1. DISPLAY = ON.
CALL RETARDO
BCF PORTA,1 ;E=0
CALL RETARDO
NOP
RETURN

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA) ; BANCO 3.
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA) ; BANCO 1.
CLRF OSCTUNE
MOVLW 0X6A ; FREC. DE 4 Mhz.
MOVWF OSCCON
CLRF TRISA ; PORTA = OUTs.
CLRF TRISB ; PORTB = OUTs.
BCF OPTION_REG,7 ; HABILITO PULL UP.
BANKSEL (PORTA) ; BANCO 0.
RE_VUE: NOP
CLRF 0X24 ; RECIBE DATOS.
CLRF 0X25 ; ORDEN DE TABLA.
NOP
MOVLW 0X01 ; BORRA PANTALLA.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X02 ; CURSOR AL ORIGEN.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X06 ; PANT. ESTÁTICA.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X0C ; NO PARADEO.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X3C ; A 8 BITS, 2 LÍNEAS.
MOVWF 0X24
CALL CONTROL
SEGUIR: NOP
CALL TABLA
MOVWF 0X24
CALL DATO ; MUESTRA!!!
NOP
INCF 0X25,F ; ORD. DE LA TABLA.
MOVLW 0X10
XORWF 0X25,W ; W = W XOR
REG.#25.
BTFSS STATUS,2 ; ¿REG. #25 = 0X10?
GOTO FINAL ; NO!.
NOP ; SI!
MOVLW 0XC2 ; SEGUNDA LÍNEA.
MOVWF 0X24
CALL CONTROL
NOP
GOTO SEGUIR
FINAL: NOP
MOVLW 0X1D ; ÚLT. POSIC.
XORWF 0X25,W
BTFSS STATUS,2 ; ¿SON IGUALES?
GOTO SEGUIR ; NO!
NOP
GOTO FINAL ; NO BORRA .
NOP
NOP
END
PROYECTO # 10.- Un LCD muestra un mensaje que circula por el primer
renglón.
10.1.- CIRCUITO:

10.2.- PROGRAMA:
; ESTA APLICACIÓN MUESTRA EN EL PRIMER RENGLÓN DEL LCD UN
MENSAJE ; ROTANDO INDEFINIDAMENTE.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16


; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return
// CONFIGURACIÓN DE BITS.

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.
ORG 0X00
NOP
GOTO INICIO
NOP

; ESTE ES EL LUGAR DE LAS RUTINAS.


RETARDO: NOP
MOVLW 0X80
MOVWF 0X20
CICLO: NOP
MOVLW 0x40
MOVWF 0X21
DECRE: NOP
DECFSZ 0X21,F
GOTO DECRE
NOP
DECFSZ 0X20,F
GOTO CICLO
NOP
RETURN

; ESTA RUTINA GENERA LAS SEÑALES DE CONTROL Y ENVIA EL DATO AL


MODULO
CONTROL: BCF PORTA,0 ; RS = 0
GOTO DATO2
DATO: BSF PORTA,0 ; RS = 1
DATO2: BSF PORTA,1 ;E=1
NOP
MOVWF PORTB ;
CALL RETARDO
CALL RETARDO
BCF PORTA,1 ;E=0
CALL RETARDO
RETURN

; A CONTINUACIÓN SE ESCRIBE LA RUTINA TABLA CON EL MENSAJE A


; MOSTRAR.
TABLA2: NOP
BRW ; OJO.
RETLW ""
RETLW "F"
RETLW "E"
RETLW "L"
RETLW "I"
RETLW "Z"
RETLW ""
RETLW "N"
RETLW "A"
RETLW "V"
RETLW "I"
RETLW "D"
RETLW "A"
RETLW "D"
RETLW ""
RETLW "Y"
RETLW ""
RETLW "U"
RETLW "N"
RETLW ""
RETLW "P"
RETLW "R"
RETLW "O"
RETLW "S"
RETLW "P"
RETLW "E"
RETLW "R"
RETLW "O"
RETLW ""
RETLW "2"
RETLW "0"
RETLW "5"
RETLW "3"
RETLW ""
RETLW "!"
RETLW "!"
RETLW ""
; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.
INICIO: NOP
BANKSEL (ANSELA) ; BANCO 3
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE ;
MOVLW 0X6A
MOVWF OSCCON ; FREC = 4 Mhz.
CLRF TRISA
CLRF TRISB
CLRF OPTION_REG
BANKSEL (PORTA)
MOVLW 0xFC ; E = 0 Y RS = 0;
MOVWF PORTA
CLRF PORTB
CLRF 0X22 ; PARA TABLA2
; A CONTINUACIÓN ESCRIBO COMO SE COMPORTA EL DISPLAY.
BEGIN: NOP
MOVLW 0X02 ; CURSOR
CALL CONTROL
NOP
MOVLW 0X07
CALL CONTROL
NOP
MOVLW 0X0C ; DISPLAY = ON.
CALL CONTROL
NOP
MOVLW 0X10
CALL CONTROL
NOP
MOVLW 0X30 ; 8 BITS.
CALL CONTROL ; 5X7 PUNTOS.
NOP
MUESTRA: NOP
CLRF 0X22
VUELTA: NOP
MOVF 0X22,0
CALL TABLA2
CALL DATO
NOP
CALL RETARDO
CALL RETARDO
NOP
INCF 0X22,1
MOVLW 0X26
XORWF 0X22,0
BTFSS STATUS,2
GOTO VUELTA
GOTO MUESTRA
END

PROYECTO # 11.- Display a 4 líneas.


Se utilizan las 4 líneas de mayor peso tanto de un puerto como de las líneas
del display.
Las instrucciones o datos se llevan al display por mitades. Primero la mitad de
mayor peso y luego la de menor peso (Ver rutina CONTROL).

11.1.- CIRCUITO:

11.2 PROGRAMA:
; ESTA APLICACIÓN ES LA DE UN DISPLAY DE XTAL LÍQUIDO
; QUE SE COMUNICA A CUATRO BITS CON EL MICROCONTROLADOR.
; SE TRATA DE UN MENSAJE FIJO A DOS LINEAS.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16


; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file


_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return
// CONFIGURACIÓN DE BITS.

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection (Program
memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL:
ORG 0X00
NOP
GOTO INICIO
NOP

; ESTE ES EL ESPACIO PARA LAS RUTINAS.


; RETAR ES UN RETARDO MAYOR A 1.6ms.
RETAR: MOVLW 0X80
MOVWF 0X20
CICLO: NOP
MOVLW 0X80
MOVWF 0X21
BUCLE: NOP
DECFSZ 0X21,F
GOTO BUCLE
NOP
DECFSZ 0X20,F
GOTO CICLO
NOP
RETURN

; CONTROL ES LA RUTINA ENCARGADA DE ENTREGAR AL DISPLY


; LAS INSTRUCCIONES Y LOS CARACTERES A MOSTRAR. COMO ESTO SE HACE
A ; CUATRO BITS, PRIMERO SE PASAN LOS CUATRO BITS DE MAYOR PESO Y A
; CONTINUACIÓN, MEDIANTE LA INSTRUCCIÓN SWAPF SE LLEVAN LOS 4 BITS
; DE MENOR PESO, AL DISPLAY.
CONTROL: BCF PORTA,0 ; RS = 0.
GOTO SIGA
DATO: BSF PORTA,0 ; RS = 1.
SIGA: NOP
MOVF 0X24,0 ; LLEVA EL DATO A W.
MOVWF PORTB ; 4 BITS DE + PESO A PTOB
BSF PORTA,1 ; E = 1.
CALL RETAR
BCF PORTA,1 ; E = 0.
SWAPF 0X24,W
MOVWF PORTB ; 4 BITS RESTANTES.
BSF PORTA,1 ; E = 1.
CALL RETAR
BCF PORTA,1 ; E = 0.
NOP
RETURN

; TABLA ES LA RUTINA QUE CONTIENE EL MENSAJE A MOSTRAR EN EL LCD.


TABLA: MOVF 0X25,W
BRW ; OJO.
RETLW ""
RETLW ""
RETLW "E"
RETLW "L"
RETLW ""
RETLW "A"
RETLW "S"
RETLW "S"
RETLW "E"
RETLW "M"
RETLW "B"
RETLW "L"
RETLW "E"
RETLW "R"
RETLW "" ; AQUI SE CAMBIA DE RENGLÓN.
RETLW "E"
RETLW "S"
RETLW ""
RETLW "F"
RETLW "U"
RETLW "N"
RETLW "D"
RETLW "A"
RETLW "M"
RETLW "E"
RETLW "N"
RETLW "T"
RETLW "A"
RETLW "L"
RETLW "."

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL.


INICIO: NOP
BANKSEL (ANSELA) ; BANCO 3.
CLRF ANSELA
CLRF ANSELB
BANKSEL (TRISA)
CLRF OSCTUNE
MOVLW 0X6A ; RELOJ A 4Mhz.
MOVWF OSCCON
CLRF TRISA
CLRF TRISB
BCF OPTION_REG,7
NOP
BANKSEL (PORTA)

; LÓGICA DEL PROGRAMA PRINCIPAL.


; LLEVO AL DISPLY LAS INSTRUCCIONES DE MANEJO.
MOVLW 0X01
MOVWF 0X24
CALL CONTROL
NOP ;
MOVLW 0X02
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X06
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X0C
MOVWF 0X24 ; A 4 LINEAS.
CALL CONTROL
NOP
MOVLW 0X2C ; A 4 BITS.
MOVWF 0X24
CALL CONTROL
NOP
CLRF 0X25

; LLEVO AL DISPLAY LA LEYENDA A MOSTRAR.


MOSTRAR: NOP
CALL TABLA
MOVWF 0X24
CALL DATO
INCF 0X25,F
MOVF 0X25,W
XORLW 0X0E ; ¿FIN DEL 1° RENGLÓN?
BTFSS STATUS,2
GOTO MOSTRAR ; NO!!!
SALTAR: NOP
MOVLW 0XC1 ; VOY AL 2° RENGLÓN
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X0F ; CONTINUACIÓN DE TABLA.
MOVWF 0X25
VOLVER: NOP
CALL TABLA
MOVWF 0X24
CALL DATO
INCF 0X25,F
MOVF 0X25,W
XORLW 0X1F ; ¿FIN DEL 2° RENGLÓN?
BTFSS STATUS,2
GOTO VOLVER ; NO!!!
GOTO SALTAR ; CICLO INFINITO.
NOP
NOP
END

CONVERSIÓN ANÁLOGO – DIGITAL.


Las señales análogas son muy comunes en la naturaleza. Señales como el
sonido y la temperatura entre otras, tienen esta característica.
La conversión de las señales análogas a digitales se ha venido imponiendo
debido a las ventajas que presenta este procedimiento, en el momento de
almacenar, manipular y analizar estas señales.
Las ventajas que presenta el hecho de digitalizar una señal análoga, hace
referencia a la inmunidad al ruido, a la facilidad de trasmitirlas y controlarlas,
entre otras.
El PIC16F1937 ofrece una resolución de 10 bits para almacenar el resultado
de la conversión.
Ofrece además 14 canales de conversión A/D, enumerados desde AN0 hasta
AN13.
Veamos ahora los registros involucrados en este procedimiento:

Registro ANSEL
Posición en la Memoria de Datos: 0x9B.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
XXXXX ANS6 ANS 5 ANS 4 ANS 3 ANS 2 ANS 1 ANS0

Los bits del 0 al 6, representan los canales de conversión A/D.


El bit cargado con 0, representa una entrada digital.
El bit cargado con 1, representa una entrada análoga.

Registro ADRESH
Posición en la Memoria de Datos: 0X1E.
Guarda la parte alta del resultado de la conversión A/D.

Registro ADRESL
Posición en la Memoria de Datos: 0X9E.
Guarda la parte baja del resultado de la conversión.

Registro ADCON0
Posición en la Memoria de Datos: 0X1F.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
X CHS4 CHS3 CHS2 CHS1 CHS0 ´
GO/ DONE ADON

Bits 7 No está implementado.

Bits 6 a 2: CHS<4:0>: Bits de Selección del Canal Análogo.


00000 = AN0
00001 = AN1
00010 = AN2
00011 = AN3
00100 = AN4
00101 = AN5
00110 = AN6
00111 = AN7
01000 = AN8
01001 = AN9
01010 = AN10
01011 = AN11
01100 = AN12
01101 = AN13
01110 = Reservado.



11100 = Reservado.
11101 = Indicador de Temperatura.
11110 = Salida del DAC.
11111 =FVR (Fixed Voltage Reference) Salida del Buffer 1.

Bit 1…GO/DONE: Estado de la conversión.


Si ADON = 1:
1 = La conversión está en progreso.
0 = La conversión terminó o no ha empezado.

Bit 0…ADON: Habilitación del convertidor.

1 = El convertidor A/D está operando.


1 = El convertidor no está habilitado.

Registro ADCON1
Posición en la Memoria de Datos: 0X9F
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
ADFM ADCS2 ADCS1 ADCS X ADNREF ADPREF1 ADPREF0
0

Bit 7…ADFM: Presentación del resultado.

1 = El resultado se ajusta a la derecha. Por lo tanto los dos bits más


significativos del resultado de la conversión, quedan almacenados en los bits
1 y 0 de ADRESH.

0 = El resultado se ajusta a la izquierda. Por lo tanto los dos bits menos


significativos del resultado de la conversión, quedan almacenados en los bits
7 y 6 de ADRESL.

Bit 6 a 4…ADCS<2:0>: A/D Bits de selección de Reloj de Conversión


000 = FOSC/2
001 = FOSC/8
010 = FOSC/32
011 = FRC (Para un oscilador RC)
100 = FOSC/4
101 = FOSC/16
110 = FOSC/64
111 = FRC (Para un oscilador RC)

bit 3 No implementado: se lee como 0

bit 2 ADNREF: Voltaje de referencia Negativo.


0 = VREF- es conectado a VSS
1 = VREF- es conectado a VREF- pin(1)

bit 1-0 ADPREF<1:0>: Voltaje de Referencia Positivo.


00 = VREF+ es conectado a VDD
01 = Reservado.
10 = VREF+ es conectado al pin externo VREF+.

11 = VREF+ es conectado al módulo interno (FVR): Fixed Voltage Reference


(FVR).

NOTAS:

A.- Los pines ANSA3 y ANSA2 del Registro ANSELA deben ser configurados
como entradas, cuando se usan voltajes externos para Vref+ y Vref-.

B.- Si el Vref+ = 5Volts, la resolución del sistema es:

Resolución = 5/29 = 5/1m024 = 4,88mV.

C.- El bit 6 del Registro PIR1es una bandera que indica el final de la
conversión A/D.
Este debe ser borrado por el programador.

PROCEDIMIENTO PARA UTILIZAR EL CONVERTIDOR A/D.


1.- Configure en el respectivo registro ANSEL, las entradas análogas que va
a utilizar.
2.- Seleccione el reloj de conversión (con los bits ADCS<2:0> ).
3.- Configure el voltaje de referencia (con base en lo indicado por los bits
0,1 y 2 del registro ADCON1).
4.- Iniciar la conversión colocando el bit GO/DONE = 1.
5.- Esperar que la conversión se complete chequeando el bit GO/DONE.
6.- Leer el resultado en los registros ADRESL y ADRESH.

PROYECTO #12:
Con un voltaje análogo de o a 5Volt conectado a RA0 y 8 LEDs en los pines
del Puerto B, mostrar en este, el equivalente digital del voltaje análogo de
entrada. Variar Vi y observar.
El resultado se ajusta a la derecha, despreciando los 2 bits mas
significativos del resultado.

12.1.- CIRCUITO:
Nota:
Observar que el resultado binario es 0x5D = (64 + 16 + 13) = 93Dec.
Si multiplicamos por la resolución: 93 X 4,8828mv = 454,1mV.
El Vin = 5Vx1k/(11k) = 454,54mv.
El Vin calculado es muy similar al voltaje digital mostrado en los LEDs.

12.2.- PROGRAMA:

; ESTE PROYECTO BUSCA CONVERTIR UN VALOR DE VOLTAJE ANÁLOGO

; QUE ENTREGA UN POTENCIÓMETRO, EN SU EQUIVALENTE DIGITAL Y

; MOSTRARLO EN 8 LEDs COLOCADOS EN EL PUERTO B.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16

; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file

_bar:

movf PORTA,w ; here we use a symbol defined via [Link]

return

// CONFIGURACIÓN DE BITS:

; PIC16F1937 Configuration Bit Settings


; Assembly source line config statements

#include <[Link]>

; CONFIG1

CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O


function on CLKIN pin)

CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)

CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)

CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin


function is digital input)

CONFIG CP = OFF ; Flash Program Memory Code Protection


(Program memory code protection is disabled)

CONFIG CPD = OFF ; Data Memory Code Protection (Data memory


code protection is disabled)

CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset


disabled)

CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is


disabled. I/O or oscillator function on the CLKOUT pin)

CONFIG IESO = ON ; Internal/External Switchover (Internal/External


Switchover mode is enabled)

CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe


Clock Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)

CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All


VCAP pin functionality is disabled)

CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)

CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable


(Stack Overflow or Underflow will cause a Reset)

CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-


out Reset Voltage (Vbor), low trip point selected.)

CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-


voltage on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.

ORG 0X00

NOP

GOTO INICIO

NOP

; ESTE ES EL LUGAR DE LAS RUTINAS:

NOP

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL:

INICIO: NOP

BANKSEL ANSELA ; BANCO 3.


MOVLW 0X01 ; AN0 = IN ANÁLOGA.

MOVWF ANSELA

CLRF ANSELB

BANKSEL TRISA ; BANCO 1.

CLRF OSCTUNE

MOVLW 0X6A ; RELOJ DE 4MHz.

MOVWF OSCCON

MOVLW 0X01

MOVWF TRISA ; RA0 = IN.

CLRF TRISB

BCF OPTION_REG,7 ; PULL UP.

MOVLW 0XF0 ; AJUSTE A LA DERECHA.

MOVWF ADCON1 ; REF/CIA Vdd y Vss (interna).

BANKSEL PORTA ; BANCO 0.

CLRF PORTB ; LEDs OFF.

NOP

VUELTA: NOP

BANKSEL ADCON0 ; BANCO 1.

MOVLW 0X03 ; CANAL 0 Y EMP. LA CONVER.

MOVWF ADCON0

ESPERA: NOP
NOP

BTFSC ADCON0,1 ; ¿TERMINÓ?

GOTO ESPERA ; NO!!!

NOP

MOVF ADRESL,W ; SI TERMINÓ!!!

NOP

BANKSEL PORTB ; CAMBIA DE BANCO

MOVWF PORTB ; MUESTRA.

NOP

GOTO VUELTA ; VUELVE A EMPEZAR!!!

NOP

END

PROYECTO # 13.- TRABAJO DE APLICACIÓN.


Consiste en tomar el voltaje que entrega un potenciómetro, convertirlo a
digital y mostrar su valor entero entre 0V y 5V, en un display de cristal
líquido.

13.1.- CIRCUITO:
13.2.- PROGRAMA:
; ESTA APLICACIÓN TOMA EL VOLTAJE ANÁLOGO DADO POR UN
; POTENCIÓMETRO Y MUESTRA EL VALOR ENTERO DE ESTE EN UN
DISPLAY ; DE CRISTAL LÍQUIDO.

#include <[Link]>
psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16
; psect barfunc,local,class=CODE,reloc=2 ; PIC18
global _bar ; extern of bar function goes in the C source file
_bar:
movf PORTA,w ; here we use a symbol defined via [Link]
return

// PROGRAMACIÓN DE BITS:

; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1
CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O
function on CLKIN pin)
CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)
CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)
CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin
function is digital input)
CONFIG CP = OFF ; Flash Program Memory Code Protection
(Program memory code protection is disabled)
CONFIG CPD = OFF ; Data Memory Code Protection (Data memory
code protection is disabled)
CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset
disabled)
CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is
disabled. I/O or oscillator function on the CLKOUT pin)
CONFIG IESO = ON ; Internal/External Switchover (Internal/External
Switchover mode is enabled)
CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock
Monitor is enabled)

; CONFIG2
CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write
protection off)
CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP
pin functionality is disabled)
CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)
CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack
Overflow or Underflow will cause a Reset)
CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out
Reset Voltage (Vbor), low trip point selected.)
CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage
on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.
ORG 0X00
NOP
GOTO INICIO
NOP

// ESTE ES EL LUGAR DE LAS RUTINAS:


// RETARDO TIENE UNA DURACIÓN LIGERAMENTE MAYOR A 1,6 ms.
SUFICIENTE
// PARA TRATAR ADECCUADAMENTE LAS INSTRUCIOES Y LOS DATOS DEL
DISPLAY.
RETARDO: MOVLW 0X80
MOVWF 0X20
CICLO: NOP
MOVLW 0X80
MOVWF 0X21
BUCLE: NOP
DECFSZ 0X21,F
GOTO BUCLE
NOP
DECFSZ 0X20,F
GOTO CICLO
NOP
RETURN

; CONTROL GENERA UN RETARDO LIGERAMENTE MAYOR A 1,6ms PARA


; DILIGENCIAR ADECUADAMENTE LAS INSTRUCCIONES Y CARACTERES.
CONTROL: BCF PORTA,1 ; RS = RA1.
GOTO SIGAN
DATO: BSF PORTA,1
SIGAN: NOP
MOVF 0X24,W
MOVWF PORTB ; CARGA EL LCD.
NOP
BSF PORTA,2 ; E = RA2. DISPLAY = ON.
CALL RETARDO
BCF PORTA,2 ;E=0
CALL RETARDO
NOP
RETURN

; TABLA ES LA RUTINA QUE LLEVA AL DISPLAY LA LEYENDA QUE SE QUIERE


; MOSTRAR. EN ESTE CASO EL VALOR DEL VOLTAJE DIGITAL CONVERTIDO SE
; REEMPLAZA POR UN ESPACIO EN BLANCO QUE SERÁ LLENADO LUEGO.
TABLA: MOVF 0X25,W ; ORDEN DE LA TABLA.
BRW ; OJO.
RETLW "E"
RETLW "L"
RETLW ""
RETLW "V"
RETLW "A"
RETLW "L"
RETLW "O"
RETLW "R"
RETLW ""
RETLW "E"
RETLW "S"
RETLW ":"
RETLW ""
RETLW "" ; AQUI VA EL VALOR DEL
VOLTAJE.
RETLW "V"
RETLW "."

; AQUI EMPIEZA EL PROGRAMA PRINCIPAL:


INICIO: NOP
BANKSEL (ANSELA) ; BANCO 3.
MOVLW 0X01 ; AN0 = IN ANÁLOGA.
MOVWF ANSELA
CLRF ANSELB
BANKSEL (TRISA) ; BANCO 1.
CLRF OSCTUNE
MOVLW 0X6A ; RELOJ DE 4MHz.
MOVWF OSCCON
MOVLW 0X01
MOVWF TRISA ; RA0 = IN.
CLRF TRISB
BCF OPTION_REG,7 ; PULL UP PARA EL PUERTO B.
MOVLW 0X70 ; AJUSTE A LA IZQUIERDA (OJO).
MOVWF ADCON1 ; REFERENCIA INTERNA.
BANKSEL (PORTA) ; BANCO 0.
CLRF PORTB ; LEDs OFF.
CLRF 0X25 ; ORDEN DE TABLA.
; A CONTINUACIÓN SE DETERMINA COMO SE VA A COMPORTAR EL DISPLAY.
NOP
MOVLW 0X01 ; BORRA PANTALLA.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X02 ; POSICIÓN INICIAL.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X06 ; PANTALLA ESTÁTICA.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X0C ; DISPLAY ON Y NO PARADEO.
MOVWF 0X24
CALL CONTROL
NOP
MOVLW 0X3C ; A 8 bits, 2 LÍNEAS.
MOVWF 0X24
CALL CONTROL

; LLAMA TABLA PARA MOSTRAR "EL VALOR ES: _V".


; EL VALOR DEL REGISTRO #25 ESTA INICIALMENTE CARGADO CON 0.
SEGUIR: NOP
CALL TABLA
MOVWF 0X24
CALL DATO ; MUESTRA!!!
NOP
INCF 0X25,F ; EL ORDEN DE LA TABLA.
MOVLW 0X10 ; FIN DEL 1° RENGLÓN???
XORWF 0X25,W ; W = W XOR REG.#25.
BTFSS STATUS,2 ; ¿REG. #25 = 0X10?
GOTO SEGUIR ; NO!!!
NOP
CLRF 0X25 ; PARA QUE VUELVA A EMPEZAR.
NOP

; REALIZA LA CONVERSIÓN A/D Y CUANDO TERMINA, TOMA ESTE VOLTAJE


; DIGITAL Y LO CONVIERTE A ASCII.
VUELTA: NOP
BANKSEL (ADCON0)
MOVLW 0X03 ; EMP. LA CONVERSIÓN.
MOVWF ADCON0
ESPERA: NOP
NOP
BTFSC ADCON0,1 ; ¿TERMINÓ?
GOTO ESPERA ; NO!!!
NOP ; SI TERMINÓ!!!
; VA A DETECTAR CUAL ES EL NÚMERO QUE DEBE MOSTRAR. CARACTER
ASCII.
BANKSEL (PORTA)
NOP
MOVLW 0X35 ; ASCII DE 5.
MOVWF 0X26 ; REG. DE RESPALDO.

; EL NÚMERO MÁXIMO DE LA CONVERSIÓN EQUIVALE A 0X3FF Y


; CORRESPONDE A 5 VOLTIOS. DESDE 0X3F0 EN ADELANTE, SE CONSIDERA
; QUE EL VOLTAJE ES DE 5 VOLTIOS. COMO ESTOY HACIENDO UN AJUSTE A LA
; IZQUIERDA, TOMO LOS DOS BYTES MAS SIGNIFICATIVOS Y SI EL VALOR DE
; ADRESH ES MAYOR O IGUAL A 0X3F, LLEVO AL DISPLAY EL VALOR DE 5V.
BANKSEL (ADRESH)
MOVF ADRESH,W
SUBLW 0X3F ; W = L ? W. DETECTA EL 5.
BTFSS STATUS,0 ; C = 1?
GOTO MOSTRAR ; SON 5V YA QUE W > = 0X3F.
NOP
BANKSEL (PORTA)
DECF 0X26,F ; PASA A 4.
NOP
BANKSEL (ADRESH)
MOVF ADRESH,W
// EL CUATRO CORRESPONDE A UN VALOR DE CONVERSIÓN DE 0X333.
DESPRECIAN EL
// ÚLTIMO 3, SI EL VALOR CONVERTIDO ES MAYOR O IGUAL A 0X33, SERAN
4V.
SUBLW 0X33 ; DETECTA EL 4.
BTFSS STATUS,0 ; C = 1?
GOTO MOSTRAR
NOP
BANKSEL (PORTA)
DECF 0X26,F ; PASA A 3.
NOP
BANKSEL (ADRESH)
MOVF ADRESH,W
SUBLW 0X26 ; DETECTA EL 3.

; EL TRES CORRESPONDE A UN VALOR DE CONVERSIÓN DE 0X266.


; SE DESPRECIA EL ÚLTIMO 6.
BTFSS STATUS,0
GOTO MOSTRAR
NOP
BANKSEL (PORTA)
DECF 0X26,F ; PASA A 2.
NOP
BANKSEL (ADRESH)
MOVF ADRESH,W
; EL 2 CORRESPONDE A UN VALOR DE CONVERSIÓN DE 0X19A
DESPRECIANDO LA A:
SUBLW 0X19 ; DETECTA EL 2.
BTFSS STATUS,0
GOTO MOSTRAR
NOP
BANKSEL (PORTA)
DECF 0X26,F
NOP
BANKSEL (ADRESH)
MOVF ADRESH,W

; EL UNO CORRESPONDE A UN VALOR DE CONVERSIÓN DE 0X0CD


DESPRECIANDO LA D:
SUBLW 0X0C ; DETECTA EL 1.
BTFSS STATUS,0
GOTO MOSTRAR

; SI EL VOLTAJE CONVERTIDO ES MENOR DE 0X0C0, EL NÚMERO A MOSTRAR


ES EL CERO.
NOP
BANKSEL (PORTA)
DECF 0X26,F

; YA SE HIZO LA CONVERSIÓN A/D Y EL RESULTADO ESTÁ EN EL REG. #26


; COMO CARÁCTER [Link] SE DEBE MOSTRAR POR DISPLAY DE XTAL
LÍQUIDO
; LA LEYENDA: "EL VALOR ES: _V." CON EL NÚMERO CORRESPONDIENTE EN
LA POSICIÓN
; 0X0D DEL DISPLAY.
MOSTRAR: NOP
BANKSEL (PORTA)
MOVLW 0X8D ; POSICION 0X0D DEL DISPLAY.
MOVWF 0X24
CALL CONTROL
NOP
MOVF 0X26,W ; LLEVO EL DATO A W.
MOVWF 0X24 ; PARA LLAMAR DATO.
CALL DATO ; MUESTRA!!!
NOP
GOTO VUELTA ; VUELVE A EMPEZAR!!!
NOP
NOP
END

OTRAS CARACTERÍSTICAS:
A.- INTERRUPCIONES EN EL PIC 16F1937.
Representan una de las características más importantes de los
microcontroladores.

Estas constituyen la capacidad de sincronizar la ejecución de un programa


con acontecimientos externos.

Cuando se produce una interrupción, el micro automáticamente deja lo


que está haciendo, va a la dirección 0X04h de la Memoria de Programa y
ejecuta lo dispuesto allí, hasta encontrarse con la instrucción RETFIE.

Cuando termina este proceso, el micro abandona la interrupción y vuelve


al lugar del programa, donde se encontraba antes de producirse esta.

OPERACIÓN:

Debe ser claro que después de un RESET, las interrupciones están


deshabilitadas. Además debemos diferenciar los dos tipos de
interrupciones posibles en un PIC16F1937:

1. - Mediante un evento interno.

- El desbordamiento de la Pila (Stack). 

- Al completarse la escritura de datos en la Memoria EEPROM.

- Por desbordamiento del registro TMR0 al rebasar el valor 255 (0xFF) y


pasar a 0.

2. - Mediante un suceso externo:

· Estando en el modo de reposo (SLEEP), se presenta un cambio de


nivel en el pin RB0/INT .

· Un cambio de nivel en uno de los pines  RB4 a RB7, estando configurados


como entrada.
Cuando ocurre un evento de los descritos anteriormente, se produce una
petición de interrupción, esto guarda el valor actual del PC (contador de
programa) en la Pila.

Independientemente de cual haya sido la causa de la interrupción, el


bit7 GIE del registro INTCON se hace igual a 0, con lo cual se inhibe
cualquier otra petición de interrupción.

El registro PC se carga con el valor 0x0004 que, es la posición del vector


de interrupción. Aquí, empieza la ejecución de la Rutina de Servicio de la
interrupción.

NOTAS:

A.- Cualquier tipo de interrupción puede sacar al micro del Modo de


Reposo (SLEEP).

B.- Una interrupción puede ser inhibida sólo si existe otra interrupción en
curso. Esto es debido a que una interrupción está controlada por dos bits
que indican la fuente de la interrupción.

Uno de estos bits actúa como bandera (flag) indicando que se ha


producido una interrupción.

El otro bit (GIE), actúa como bit de inhibición o prohibición de otra


interrupción, debido a que está en curso una interrupción. Este se hace
igual a 1 automáticamente, cuando termina la interrupción.

Todo esto se realiza de forma automática por parte del microcontrolador.

Estos bits de control se encuentran en el registro INTCON.

Tanto GIE como la respectiva bandera, cambian de nivel, cuando se


produce la interrupción.

C.- Latencia de una Interrupción es definida como el tiempo entre la


solicitud de la interrupción y el comienzo del Ciclo de Servicio de la
Interrupción. Se trata de algunos Ciclos de Instrucción. (entre 3 y 5).

Este es el Registro INTCON.
R/W R/W R/W R/W R/W R/W R/W R/W

GIE PEIE TMROIE INTE IOCIE TMROI INTF IOCIF


F

Bit 7 bit 0

Veamos el significado y la utilización de estos bits:

Bit 7 GIE: Habilitación Global de las Interrupciones.

1 = Habilita Todas las Interrupciones.

0 = Inhabilita Todas las Interrupciones.

Bit 6 PEIE: Habilitación Global de la Interrupciones Periféricas.

1 = Habilita Todas las Interrupciones Periféricas.

0 = Inhabilita Todas las interrupciones Periféricas.

Bit 5 TMR0IE: Habilita Interrupción por desbordamiento del TMR0.

1 = Habilita la Interrupción del TMR0.

0 = Inhabilita la Interrupción del TMR0.

Bit 4 INTE: INT Habilitación de Interrupción Externa.

1 = Habilita la INT interrupción Externa.

0 = Inhabilita la INT Interrupción Externa.

Bit 3 IOCIE: Habilitación de Interrupción por Cambio de Nivel.

1 = Habilita esta Interrupción.

0 = Inhabilita esta Interrupción.

Bit 2 TMR0IF: Bandera de Indicación de Interrupción por


Desbordamiento del TMR0.
1 = El TMR0 se Desbordó.

0 = El TMT0 no se ha Desbordado.

Bit 1 INTF: INT Bandera de Indicación de Interrupción Externa.

2 = La INT Interrupción Externa ocurrió.


3 = La INT Interrupción Externa No ocurrió.

Bit 0 IOCIF: Bandera de indicación de Interrupción por Cambio de


Nivel en los Pines RB del Puerto B.

1 = Al menos uno de los Pines de Interrupción por Cambio de


Nivel, Cambió de Nivel. (Se borra cuando el Registro IOCBF es
borrado por Software).

0 = Ninguno de Estos Pines ha Cambiado de Nivel.

NOTA IMPORTANTE:

El PIC16F1937 tiene además del registro INTCON, otros seis registros para
atender las Interrupciones Periféricas, que tratan sobre las interrupciones
presentadas en el convertidor A/D, USART, SSP, CCPI, TMR1 Y TMR2.

Los registros mencionados son: El Registro PIE1, PIE2, PIE3, PIR1, PIR2, y
PIR3.

Por razones metodológicas, no trabajaremos inicialmente las


interrupciones periféricas y nos vamos a dedicar al tratamiento de las
interrupciones durante el SLEEP (POWER DOWN).

CONSIDERACIONES GENERALES:

Acciones a tener en cuenta en el momento de una interrupción:


 Cuando se produce una interrupción el bit7 GIE se pone en 0.
 El valor del PC se guarda en la Pila (Stack) y se carga con el valor
0004h. Allí se carga el salto a la Rutina de Servicio de la Interrupción.
 En el momento de una interrupción, quedan guardados
automáticamente en el STACK, los contenidos de los registros
STATUS, W, BSR, FSR Y PCLATH y son restaurados automáticamente,
cuando termina dicha interrupción.
 Se deben explorar las banderas (flags) para determinar la causa
de la interrupción.
 Se deben limpiar (poner a 0) las banderas que indican la fuente
de la interrupción.
 Se debe escribir RETFIE como última instrucción de la Rutina de
Servicio de una interrupción.
 Esta última acción, carga el PC con el valor de Pila y el bit GIE se
pone automáticamente en 1.

Se puede observar que el bit7 GIE, es quien habilita las interrupciones al


ponerse en 1. Al reconocer una interrupción se pone en 0 de forma
automática.

Esto evita que se produzca otra interrupción mientras se atiende la actual.

Para el resto de los bits (banderas o flags), es el propio programa de


atención a la interrupción, al que le corresponde ponerlos a 0 (cero). Si esto
no se hace, puede ocasionar múltiples errores.

En resumen, el micro sólo tiene un vector de interrupción en la dirección


0x04h, así que, con cualquier interrupción el PC se carga con 0004h y la
rutina de servicio de ésta, se encarga de comprobar el estado de las
banderas para determinar que dispositivo causó la interrupción y actuar
según lo previsto.

INTERRUPCIÓN DURANTE EL SLEEP:

Para que un dispositivo logre sacar del SLEEP, al microcontrolador, debe


estar habilitado para trabajar sin el Reloj. Por ejemplo un pulsador.
Una vez se presente una interrupción y sea llamada la Rutina de Servicio
(ISR), el bit GIE debe ser colocado en 0, para evitar que interfieran otras
posibles interrupciones.

Se debe tener en cuenta que la instrucción siguiente a SLEEP siempre se


ejecuta, antes del salto a la ISR.

Pin INT:

Puede ser utilizado para generar una interrupción asíncrona. Se habilita


colocando en 1 el pin INTE, del registro INTCON.

El bit INTEDG del registro OPTION_REG determina en cual flanco ocurre la


interrupción:

Si INTEDG = 1 la interrupción ocurre con el flanco de subida, en caso


contrario, la interrupción se genera con el flanco de caída.

El bit INTF se pondrá en 1, cuando se genera una interrupción válida.

Ver el siguiente ejemplo:

; UN LED COLOCADO EN RB7 ESTÁ INICICIALMENTE APAGADO Y EN RB7


UN ; PULSADOR. SE ACTIVA EL ESTADO POWER DOWN (SLEEP) Y SE
DESPIERTA ; AL ACCIONAR EL PULSADOR CONECTADO EN RB0 (INT). EL
LED TITILA 5 ; VECES Y SE QUEDA APAGADO HASTA QUE
NUEVAMENTE SE PRESIONE EL ; PULSADOR.

; En RB0 está el pulsador y en RB7 está el LED.

REGISTROS ASOCIADOS CON UNA INTERRUPCIÓN:


A continuación se presenta un ejemplo:

// UN PULSADOR EN RB0 Y UNLED EN RB7. EL PROGRAMA PRENDE, APAGA


Y PRENDE EL LED. LUEGO PASA A SLEEP. AL PRESIONAR EL PULSADOR SE
GENERA UNA INTERRUPCIÓN QUE APAGA EL LED Y VUELVE A EMPEZAR.

#include <[Link]>

psect barfunc,local,class=CODE,delta=2 ; PIC10/12/16

; psect barfunc,local,class=CODE,reloc=2 ; PIC18

global _bar ; extern of bar function goes in the C source file

_bar:

movf PORTA,w ; here we use a symbol defined via [Link]

return

// PROGRAMACIÓN DE BITS.
; PIC16F1937 Configuration Bit Settings

; Assembly source line config statements

#include <[Link]>

; CONFIG1

CONFIG FOSC = INTOSC ; Oscillator Selection (INTOSC oscillator: I/O


function on CLKIN pin)

CONFIG WDTE = OFF ; Watchdog Timer Enable (WDT disabled)

CONFIG PWRTE = ON ; Power-up Timer Enable (PWRT enabled)

CONFIG MCLRE = OFF ; MCLR Pin Function Select (MCLR/VPP pin


function is digital input)

CONFIG CP = OFF ; Flash Program Memory Code Protection


(Program memory code protection is disabled)

CONFIG CPD = OFF ; Data Memory Code Protection (Data memory


code protection is disabled)

CONFIG BOREN = OFF ; Brown-out Reset Enable (Brown-out Reset


disabled)

CONFIG CLKOUTEN = OFF ; Clock Out Enable (CLKOUT function is


disabled. I/O or oscillator function on the CLKOUT pin)

CONFIG IESO = ON ; Internal/External Switchover (Internal/External


Switchover mode is enabled)

CONFIG FCMEN = ON ; Fail-Safe Clock Monitor Enable (Fail-Safe Clock


Monitor is enabled)
; CONFIG2

CONFIG WRT = OFF ; Flash Memory Self-Write Protection (Write


protection off)

CONFIG VCAPEN = OFF ; Voltage Regulator Capacitor Enable (All VCAP


pin functionality is disabled)

CONFIG PLLEN = ON ; PLL Enable (4x PLL enabled)

CONFIG STVREN = ON ; Stack Overflow/Underflow Reset Enable (Stack


Overflow or Underflow will cause a Reset)

CONFIG BORV = LO ; Brown-out Reset Voltage Selection (Brown-out


Reset Voltage (Vbor), low trip point selected.)

CONFIG LVP = OFF ; Low-Voltage Programming Enable (High-voltage


on MCLR/VPP must be used for programming)

// PROGRAMA PRINCIPAL.

ORG 0X00

NOP

GOTO INICIO

NOP

ORG 0X04

GOTO AHORA_SI // RUTINA DE INTERRUPCIÓN.

ORG 0X05

NOP
// LUGAR DE LAS RUTINAS:

RETAR: MOVLW 0XFF

MOVWF 0X20

BUCLE: NOP

MOVLW 0XFF

MOVWF 0X21

LAZO: NOP

DECFSZ 0X21,F

GOTO LAZO

NOP

DECFSZ 0X20,F

GOTO BUCLE

NOP

RETURN

// PROGRAMA PRINCIPAL:

INICIO: NOP

BANKSEL (ANSELB) // BANCO 3.

CLRF ANSELB

NOP

BANKSEL (TRISB)
CLRF OSCTUNE

MOVLW 0X6A // 4 Mhz.

MOVWF OSCCON

MOVLW 0X01

MOVWF TRISB

CLRF OPTION_REG // PULL UP.

VUELVE: NOP

BANKSEL (PORTB)

BSF PORTB,7 // PRENDE EL LED.

CALL RETAR

NOP

BCF PORTB,7 // APAGA LED.

NOP

CALL RETAR

NOP

BSF PORTB,7 // PRENDE LED.

// PARA LAS INTERRUPCIONES:

NOP

BSF INTCON,7 // GIE = 1.

NOP
BSF INTCON,4 // INTE = 1. HAB/TA INT.

NOP

SLEEP // POWER DOWN.

NOP // SIEMPRE SE EJECUTA.

// RUTINA DE SERVICIO DE LA INTERRUPCIÓN:

// NO SE REQUIERE GUARDAR LOS REGISTROS W, STATUS,BSR, FSR Y


PCLATH // YA QUE ESTE MICRO INCORPORA ESTA FUNCIÓN .

AHORA_SI: NOP

BCF INTCON,7 // GIE = 0.

NOP

BCF PORTB,7 // APAGA LED.

NOP

RETFIE // FINALIZÓ RUT. DE SERV.

NOP

GOTO VUELVE

NOP

END

Lo que se Hizo fue lo siguiente:

 Se ejecuta la rutina de servicio de interrupciones. Y antes de salir de


la esta Rutina:
 Se escribe la instrucción RETFIE.

CIRCUITO:
B.- PERRO GUARDIÁN (WDT).
Es un temporizador que al terminar su período ocasiona un RESET al
programa que se está ejecutando.

En caso de estar activado, inicializa su período en el momento en el cual


empieza a ejecutarse el programa.

Su utilidad radica en el hecho de que cuando el programa en ejecución se


bloquea o se “cuelga”, al cumplirse el período del WDT, se genera un
RESET y el programa se reinicializa. Esto, si el WDT está habilitado.

El WDT ha venido evolucionando. Para este microcontrolador se pueden


lograr retardos entre 1mS hasta 256S.

En la Programación de Bits, la opción WDTE se puede cargar con la opción


que habilita o no al WDT, según criterio del programador.

El WDT se inicializa en 00, se incrementa con base en el oscilador interno


INTRC de 31,25Khz, cada Ciclo de Instrucción.
Al desbordarse el WDT(Cuando pasa de 0XFF a 00H), ocasiona un RESET
del programa en ejecución.

El WDT tiene las siguientes características:


A.- Funciona con base en un Reloj Independiente.

B.- Presenta 4 modos de operación:

- Siempre ON.
Se deben cargar con 11, los bits WDTE<1:0> de la Palabra de Control
Config1.

- WDT = OFF durante el SLEEP.


Se cargan con 10 dichos bits.

- WDT controlado por software.


Estos bits se cargan con 01.
Si el bit SWDTEN = 1, el WDT está = ON.
Si el bit SWDTEN = 0, el WDT está = OFF.
El bit SWDTEN pertenece al registro WDTCON.

- WDT deshabilitado.
Los bits se cargan con 00 independiente del valor del bit SWDTEN.

Veamos el Registro WDTCON:


R/W R/W R/W R/W R/W
X X WDTPS4 WDTPS WDTPS2 WDTPS1 WDTPS0 SWDTEN
3
Bit 7
bit 0
Bits 5,4,3,2,1.- Bits de selección del Período para el WDT.
VALOR. PERÏODO.
00000 = 1 mS.
00001 = 2mS.
00010 = 4mS.
00011 = 8mS.
00100 = 16mS.
00101 = 32mS.
00110 = 64mS.
00111 = 128mS.
01000 = 256mS.
01001 = 512mS.
01010 = 1 S.
01011 = 2 S.
01100 = 4 S.
01101 = 8 S.
01110 = 16 S.
01111 = 32 S.
10000 = 64 S.
10001 = 128 S.
10010 = 256 S.

Bit 0.- Bit de habilitación/deshabilitación por software del WDT.

NOTA IMPORTANTE: El CLRWDT debe ser ubicado en sitios estratégicos del


programa, para que no se presenten RESETS indeseados.

C.- BAJO CONSUMO o POWER DOWN o SLEEP.


Es un estado del microcontrolador donde la mayoría de sus funciones se
suspenden y la corriente de trabajo se hace mínima.
Para acceder a este estado, basta con la ejecución de la instrucción SLEEP. A
continuación la cuenta del WDT es borrada pero continúa su función si es
que está habilitado.

Cuando se ejecuta una instrucción SLEEP:


El bit PD´ del Registro de Estados se hace igual a 0.
El bit ´¿ del Registro de Estado se hace igual a 1.
El reloj de 31khz no se apaga.
Los estados de salida de las líneas de los puertos, se mantienen como
estaban antes del SLEEP.
WAKE-UP (Despertar) de SLEEP.
El Micro puede despertar por efecto de uno de los siguientes eventos:
´ .
1.- Por la activación del MCLR
2.- Por la activación o disparo del Watch Dog Timer (WDT) si este fue
establecido.
3.- Por causa de una interrupción en el pin INT o por una interrupción
periférica.
´ del Registro de Estados, pueden ser utilizados para determinar
Los bits ´¿ y PD
la causa de un RESET.
´ que se pone en alto cunado se presenta una interrupción durante el
El bit PD
SLEEP en este caso el bit ´¿ se hace igual a 0.

---------- o ---------

También podría gustarte