
Escuela de
Ingeniería en Electrónica y Telecomunicaciones
PROGRAMADOR
PARA EL MICROCONTROLADOR PIC 16F84 CON
MANUAL DE IMPLEMENTACIÓN Y DE USO PRACTICO
Que para
obtener el titulo de Licenciatura de Ingeniería en Electrónica y
Telecomunicaciones
Presenta:
Carlos
Alberto López González
Asesor:
M.I.E Juan Hugo García López
Acuerdo
No. 2002189
León
Guanajuato Al 19 de Agosto de 2002
1 MICROCONTROLADORES PROGRAMABLES
1.1 żQUÉ ES UN
MICROCONTROLADOR?
2 MICROCONTROLADORES DE 8 BITS (PIC)
2.1.1 Gama enana: PIC12C(F)XXX
3 EL MICROCONTROLADOR PIC16F84
3.1 Características principales
3.3 Frecuencia de funcionamiento
4.3.1. Direccionamiento de la
memoria de datos
5.1 Temporizador/Contador TMR0
5.4.2 PUERTO
B Y REGISTROS TRISB
6 INTERRUPCIONES, RESET Y RECURSOS AUXILIARES
6.1.1 El
registro de control de interrupciones INTCON
6.1.2 Interrupción
externa INT
6.1.4 Interrupción
del Puerto B
6.1.5 Interrupción
en la EEPROM de datos
7.2.1 Manejo
de registro de tamańo byte
7.2.3 Manejo
de valor inmediato
7.3 Instrucciones especiales y de control
El
microcontrolador es un circuito integrado programable que contiene periféricos
de entrada/salida, memoria. Se utiliza para controlar diferentes tipos de
procesos mediante sensores y actuadores del dispositivo a controlar.
Las
partes principales de un microcontrolador son:
1.
Procesador
2.
Memoria no volátil para contener el programa
3.
Memoria de lectura y escritura para guardar los datos
4.
Líneas de I/O para los controladores de los periféricos
a) Comunicación
paralelo
b) Comunicación
serie
5.
Recursos auxiliares
a) Circuito
de reloj
b) Temporizadores
c) Watchdog
d) Convertidores
A/D y D/A
e) Comparadores
analógicos
f) Protección
para fallos de alimentación
g) Estado de
bajo consumo
El
procesador del PIC cuenta con tres técnicas:
-
Arquitectura Harvard
-
Arquitectura RISC
-
Segmentación
En la
arquitectura Harvard son independientes la memoria de instrucciones y la
memoria de datos y cada una dispone de su propio sistema de buses para el
acceso. El RISC tiene un repertorio de instrucciones, máquina pequeńa y simple,
de forma que la mayor parte de las instrucciones se ejecutan en un ciclo de
instrucción.
Existen
diferentes tipos de memoria que utilizan los microcontroladores:
-
ROM
-
EPROM
-
OTP
EEPROM
FLASH
El PIC
16C84 y el PIC16F84 utilizan memorias de tipo EEPROM y FLASH respectivamente.
En la
figura 1.1 se muestra el diagrama del PIC16F84A

Figura
1.1
Los
recursos más comunes con los que cuenta un microcontrolador son los siguientes:
a) Circuito
de reloj
b) Temporizadores
c) Watch Dog
d) Convertidores
A/D y D/A
e) Comparadores
analógicos
f) Sistema
de protección ante fallas de alimentación
g) Sistemas de
bajo consumo de energía
Objetivo
Conocer los modos de
configuración de los puertos del microcontrolador así como las instrucciones
necesarias para mandar y datos por el puerto A y B.
Desarrollo
Generar por medio de un programa una
secuencia de datos y reflejarlos en la salida de los puertos del PIC16F84A por
medio de led´s. Ver Figura A

FIGURA
A
PROGRAMA 1
***************************************************************************
;*Programa: luces.asm
;*Descripcion: Manda datos al puerto a y b como un contador binario,
; ;*después inicia otra
secuencia de luces*
;***************************************************************************
;********************************IGUALDADES*********************************
STATUS EQU 3 ;Dirección
del registro de estado
PORTB EQU 6 ;Dirección
del puerto B
TRISB EQU 6 ;Registro
de configuración E/S
CONTADOR1 EQU 0Ch ;Dirección
del conta1 p/retardo
CONTADOR2 EQU 0Dh ;Dirección
del conta2 p/retardo
DATO EQU 0Eh ;Datos
a mandar por PORTB
CICLO1 EQU 0Fh ;Indica
el fin de luces1
CICLO2 EQU 10h ;Indica
el fin de luces2
w EQU 0 ;Destino
w
f EQU 1 ;Destino
el propio registro
;*************************PROGRAMA
PRINCIPAL********************************
ORG 00h ;Inicio
del ensamblado desde 00
GOTO INICIO ;Salto a la primera instrucción
ORG 05h ;Ensamblar
de la localidad 05h
INICIO BSF STATUS,5 ;Selecciona
la pagina 1 de datos
CLRF TRISB ;Programa
PORTB como salida
CLRF TRISA ;Programa
porta como salida
BCF STATUS,5 ;Selecciona
la pagina 0 de datos
;**************************INICIO LUCES 1
******************************************
INICIO2 MOVLW 01 ;Veces
que se repite luces1
MOVWF CICLO1 ;Carga
las veces a ciclo1
CLRF DATO ;El registro dato se pone en ceros
OTRO MOVF DATO,w ;Carga dato en w
MOVWF PORTB ;Manda
de w a PORTB
MOVWF PORTA ;Manda
de w a PORTA
MOVLW 0B0h ;Carga
w con B0 para el retardo
CALL RETARDO ;Llama a un retardo
INCFSZ DATO,f ;Incrementa
en uno a dato
GOTO OTRO ;Incrementa
al puerto en uno
DECFSZ CICLO1,f ;Termino
todo el sentido?
GOTO OTRO ;No,
continua
;**************************SI, INICIO DE LUCES 2
***********************************
MOVLW 05h ;Veces
que se repite luces2
MOVWF CICLO2 ;Carga
las veces a ciclo2
INI MOVLW 80h ;Pone
en uno el bit7 de w
MOVWF PORTB ;Manda
el dato al puerto
BCF STATUS,0 ;Borra posible carry
MOVLW 0E0h ;Carga
w con E0
;**************************INICIO DE LUCES 2 EN SENTIDO DERECHA
**********
MAS CALL RETARDO ;Llama al retardo
RRF PORTB,f ;Recorre el bit a la derecha
BTFSS STATUS,0 ;Verifica el acarreo
GOTO MAS ;Recorre de nuevo el
bit a la der
MOVLW 01h ;Pone
a uno el bit 0 de w
MOVWF PORTB ;Lo
pasa al puerto b
MOVLW 0E0h ;Carga
w con E0
;**************************INICIO DE LUCES2 EN SENTIDO
IZQUIERDA***********
BCF STATUS,0 ;Borra posible carry
MAS1 CALL RETARDO ;Llama al retardo
RLF PORTB,f ;Recorre el bit a la izquierda
BTFSS STATUS,0 ;Verifica el acarreo
GOTO MAS1 ;Recorre
de nuevo el bit a la izq
DECFSZ CICLO2,f ;Termino
recorrido?
GOTO INI ;No,
sigue el recorrido
GOTO INICIO2 ;Si,
repite todo
;*******************************RETARDO*************************************
RETARDO MOVWF CONTADOR1 ;Se cargan los contadores con el
LOOP2 MOVWF CONTADOR2 ;valor inicial de w
LOOP1 DECFSZ CONTADOR2,f ;Termino de decrementar?
GOTO LOOP1 ;No, sigue decrementando
DECFSZ CONTADOR1,f ;Termino de decrementar?
GOTO LOOP2 ;Regresa a decrementar
conta2
RETURN ;Regresa
al programa principal
;***************************************************************************
END ;Fin del programa
;***************************************************************************
CAPITULO 2
Microchip
cuenta con 4 familias de microcontroladores de 8 bits:
Su
principal característica es su reducido tamańo. Se alimenta entre 2.5VDC y
5.5VDC y consumen menos de 2mA. El formato de sus instrucciones puede ser de 12
a 14 bits y cuenta de 33 o 35 instrucciones respectivamente.
Esta
serie de PIC cuenta con un repertorio de 33 instrucciones cuyo formato consta
de 12 bits. Este tipo de microcontrolador no admite interrupciones.
El
repertorio de instrucciones es de 35, de 14 bits cada una y compatible con el
de la gama baja. Disponen de interrupciones y una pila de 8 niveles que permite
el anidamiento de subrutinas.
Maneja 58
instrucciones de 16 bits en el repertorio, contiene variados controladores de
periféricos, puertos de comunicación, serie y paralelo. La característica más
importante en esta gama es su arquitectura abierta, por su posibilidad de
ampliación del microcontrolador con elementos externos.
Objetivo
Manejar todo el conjunto de
instrucciones, diseńar el hardware y software para controlar un display de 7
segmentos desde un Dip Switch.
Desarrollo
Se conecta al las entradas menos
significativas del Puerto A el Dip Switch por donde se introducirá un numero
binario comprendido del 0000 al 1111.
A las entradas del Puerto B se
conectan los 7 segmentos de un display de cátodo común. Ver Figura B

FIGURA
B
PROGRAMA 2
;***************************************************************************
;*Programa: Decoder.asm
;*Descripcion: Decodificador BCD a 7 segmentos
:***************************************************************************
;*******************************ETIQUETAS***********************************
STATUS EQU 3
PORTA EQU 5
PORTB EQU 6
TRISB EQU 6
TRISA EQU 5
CONTADOR1 EQU 0Ch
CONTADOR2 EQU 0Dh
DATO EQU 0Eh
CICLO1 EQU 0Fh
CICLO2 EQU 10h
DELAY EQU 0XFF
w EQU 0
f EQU 1
;*************************PROGRAMA
PRINCIPAL********************************
ORG 00h
ORG 05h
BSF STATUS,5
CLRF TRISB
MOVLW 0X0F
MOVWF TRISA
BCF STATUS,5
GOTO INICIO
INICIO MOVF PORTA,w
MOVWF DATO
GOTO CODIF
;*************************VERIFICA
DIP SWITCH*********************************
CODIF MOVLW 0X00 ;Mueve 00 a W
SUBWF DATO,W ;Resta el valor de dato a w
BTFSC STATUS,2 ;Verifica el resultado
GOTO CERO ;Si son iguales manda a
cero
MOVLW 0X01 ;Mueve
01 a W
SUBWF DATO,W ;Resta
el valor de dato a w
BTFSC STATUS,2 ;Verifica el resultado
GOTO UNO ;Si son iguales manda a uno
MOVLW 0X02 ;Mueve
02 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO DOS
MOVLW 0X03 ;Mueve
03 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO TRES
MOVLW 0X04 ;Mueve
04 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO CUATRO
MOVLW 0X05 ;Mueve
05 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO CINCO
MOVLW 0X06 ;Mueve
06 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO SEIS
MOVLW 0X07 ;Mueve
07 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO SIETE
MOVLW 0X08 ;Mueve
08 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO OCHO
MOVLW 0X09 ;Mueve
09 a W
SUBWF DATO,W
BTFSC STATUS,2
GOTO NUEVE
GOTO
INICIO
;**************** BCD --- 7
SEGMENTOS **************************
CERO MOVLW 0X3F ;Mueve
valor 0 en 7 segment a W
MOVWF PORTB ;Mueve
el valor de w al puerto B
MOVLW DELAY ;Mueve
a w el valor del retardo
CALL
RETARDO ;Llama la subrutina de retardo
GOTO
INICIO ;Regresa a inicio
UNO MOVLW 0X06 ;Mueve
valor 1 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
DOS MOVLW 0X5B ;Mueve
valor 2 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
TRES MOVLW 0X4F ;Mueve
valor 3 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
CUATRO MOVLW 0X66 ;Mueve
valor 4 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
CINCO MOVLW 0X6D ;Mueve
valor 5 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
SEIS MOVLW 0X7D ;Mueve
valor 6 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
SIETE MOVLW 0X07 ;Mueve
valor 7 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
OCHO MOVLW 0X7F ;Mueve
valor 8 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
NUEVE MOVLW 0X67 ;Mueve
valor 9 en 7 segment a W
MOVWF PORTB
MOVLW DELAY
CALL RETARDO
GOTO
INICIO
;******************************SUBRUTINA DE RETARDO
******************************
RETARDO MOVWF CONTADOR1
LOOP2 MOVWF CONTADOR2
LOOP1 DECFSZ CONTADOR2,f
GOTO LOOP1
DECFSZ CONTADOR1,f
GOTO LOOP2
RETURN
END
Este
microcontrolador es de la familia media. Se utilizara este microcontrolador
debido a que cumple con los requisitos para aprender a diseńar proyectos. Al
aprender a manejar este sencillo PIC lograremos programar los de gamas más
altas que cuentan con mayores recursos.
Características de alto desempeńo:
·
Solo 35 instrucciones por aprender
·
Todas las instrucciones se ejecutan en un ciclo de máquina
excepto las de salto que utilizan 2 ciclos.
·
Velocidad de operación: DC – 20 MHz clock input
DC – 200
ns ciclo de instrucción
·
Memoria de programa de 1024 words
·
RAM de datos de 68 Bytes
·
EEPROM de datos de 64 Bytes
·
Stack de 8 niveles
·
4 Tipos de interrupciones
diferentes
- Pin
externo RB0/INT
- TMRO sobreflujo del temporizador
- PORTB<7:4> interrupción en cambio
- Escritura de datos completa en EEPROM
Periféricos:
·
13 pines de I/O con control de dirección individual
·
TMR0 temporizador/contador de 8 bits con 8 bits del
prescalador programable.
·
Corriente de manejo
- Máxima
absorbida por línea 25 mA
- Máxima suministrada por línea 25 mA
Características Especiales del Microcontrolador
·
10,000 ciclos de borrado/escritura en memoria de programa
FLASH
·
10,000,000 ciclos de borrado/escritura en memoria de datos
EEPROM
·
Retención EEPROM más de 40 ańos
·
ICSP In-Circuit Serial
Programming
·
(POR) Power-On-Reset, (PWRT)
Power-up-Timer, (OST) Oscillator Start-Up Timer
·
Whatchdog Timer (WDT)
·
Protección de código
·
Modo de bajo consumo SLEEP
·
Oscilador con opción de selección
Tecnología CMOS FLASH/EEPROM
·
Bajo consumo, tecnología de alta velocidad
·
Rango de operación de voltaje: 2.0V a 5.5V
·
VDD: Alimentación positiva
·
VSS: Referencia a tierra
·
OSC1/CLKIN: Oscilador externo que proporciona la frecuencia
de trabajo del
microcontrolador.
·
OSC2/CLKOUT: Auxiliar del circuito oscilador
·
MCLR:
Reset del PIC, se activa con un nivel lógico bajo y reinicia el PIC. También se
utiliza durante la grabación de la memoria de programa para introducir VPP, que
está comprendida entre 12 y 14 VDC.
·
RA0 – RA4: Puerto A, 5 líneas de I/O. La línea RA4
multiplexa otra función expresada por TOCKI. Esta función sirve para recibir
una frecuencia externa para alimentar el temporizador interno TMR0.
·
RB0-RB7: Puerto B, 8 líneas de I/O. La línea RB0 multiplexa
otra función que sirve como entrada a una petición externa de una interrupción.
La
frecuencia de trabajo del microcontrolador es un parámetro fundamental a la
hora de establecer la velocidad en la ejecución de instrucciones y el consumo
de energía.
Cuando un
PIC 16X8X funciona a 10Mhz, que es su máxima frecuencia, le corresponde un
ciclo de instrucción de 400ns, puesto que cada instrucción tarda en ejecutarse
4 periodos de reloj, o sea 4 x 100ns. Todas las instrucciones del PIC se
realizan en un ciclo de instrucción, menos las de salto, que tardan el doble.
Los pulso
de reloj de OSC1/CLKIN se dividen entre 4 internamente, dando lugar a las
seńales Q1, Q2, Q3 y Q4, Durante un ciclo de instrucción, que comprende las 4
seńales mencionadas, se desarrollan las siguientes operaciones:
Q1: Durante este pulso se incrementa el contador
del programa
Q4: Durante este pulso se busca
el código de la instrucción en la memoria del programa y se carga en el
registro de instrucciones.
Q2-Q3:
Durante la activación de estas dos seńales, se produce la decodificación de la
instrucción.
Para
conseguir ejecutar cada instrucción en un ciclo de instrucción (excepto las de
salto), se aplica la técnica de la segmentación <<pipe-line>>, que
consiste en realizar en paralelo las dos fases que comprende cada instrucción.
En
realidad cada instrucción se ejecuta en dos ciclos: En el primero se lleva a
cabo la búsqueda del código de la instrucción en la memoria del programa (fase
de búsqueda), y en el segundo se decodifica y se ejecuta (fase de ejecución).
La estructura
segmentada del procesador, permite realizar al mismo tiempo la fase de
ejecución de una instrucción y la de búsqueda de la siguiente. Cuando la
instrucción ejecutada corresponde a un salto no se conoce cuál será la
siguiente hasta que se complete, por eso en esta situación se sustituye la fase
de búsqueda de la siguiente instrucción por un ciclo <<vacío>>,
originando que las instrucciones de salto tarden en realizarse dos ciclos de
instrucción.
El PIC
admite cuatro tipos de osciladores externos para aplicarles la frecuencia de
funcionamiento. El tipo empleado debe especificarse en dos bits (FOSC1 y FOSC0)
en la palabra de configuración.
Oscilador tipo RC
Éste es
un oscilador de bajo costo, formado por una resistencia y un capacitor. Éste no
tiene una frecuencia muy estable y su valor depende de los valores de los elementos de la red
RC (Figura 3.4)

Figura 3.4 Esquema del oscilador tipo RC
Oscilador tipo HS
Es un oscilador
que alcanza una alta velocidad comprendida entre 4 y 10 MHz y está basado en un
cristal de cuarzo o un resonador cerámico.
Oscilador tipo XT
Es un
oscilador de cristal para frecuencias estándar comprendidas entre 100KHz y 4MHz
Oscilador tipo LP
Oscilador
de bajo consumo con cristal, diseńado para trabajar en un rango de frecuencias
de 35 a 200KHz. (Figura 3.5)

Figura
3.5 Para frecuencias comprendidas
entre 4MHz y 10 MHz C1
y C2 deben de ser de 15pF a 33pF.
![]()
Cuando se
aplica un nivel bajo en el pin MCLR, el microcontrolador reinicia su estado
provocando los acciones importantes:
1. El
contador del programa se carga con la dirección 0, apuntando hacia la primera dirección del programa en donde deberá
estar la primera instrucción del programa de aplicación.
2. La
mayoría de los registros de estado y control del procesador toman un estado
determinado.
Objetivo
Conocer el comportamiento del TMR0,
manejarlo y controlar 8 frecuencias diferentes. Visualizando la frecuencia por
medio de un diodo led.
Desarrollo
Realizar por medio de subrutinas
diferentes tiempos, guardando el contador del programa en la pila. Ver Figura C
La formula que indica el tiempo
es:
![]()

FIGURA
C
PROGRAMA 3
;********************************************************************************
;*Programa: tiempo.asm
;*Descripcion: Generador de 8 frecuencias
;********************************************************************************
;*******************************ETIQUETAS***********************************
STATUS EQU 3
TMR_OPT EQU 1
INTCON EQU 0Bh
PORTA EQU 5
PORTB EQU 6
TRISB EQU 6
TRISA EQU 5
SEG EQU 0Ch
VAR EQU 0Dh
DATO EQU 0Eh
CICLO1 EQU 0Fh
CICLO2 EQU 10h
w EQU 0
f EQU 1
;*************************PROGRAMA
PRINCIPAL***********************
ORG 00h
ORG 05h
BSF STATUS,5
MOVLW 0X1F
MOVWF TRISA
CLRF TRISB
MOVLW 0XD7
MOVWF TMR_OPT
BCF STATUS,5
CLRF PORTB
GOTO INICIO
:************************** INICIO DEL PROGRAMA
****************************
INICIO MOVF PORTA,w ;Mueve el valor del puerto A en w MOVWF DATO ;Guarda el valor de w en dato MOVLW 0X00
SUBWF DATO,W ;Compara
si el dip switch es igual a 0 BTFSC STATUS,2 ;Si no es igual salta la instrucción CALL SEG1 ;Si es igual llama a subrutina seg1 MOVLW 0X01
SUBWF DATO,W ;Compara si el dip switch es igual a 1
BTFSC STATUS,2
CALL SEG2
MOVLW 0X02
SUBWF DATO,W ;Compara si el dip switch es igual a 2
BTFSC STATUS,2
CALL SEG3
MOVLW 0X03
SUBWF DATO,W ;Compara
si el dip switch es igual a 3
BTFSC STATUS,2
CALL SEG4
MOVLW 0X04
SUBWF DATO,W
BTFSC STATUS,2 ;Compara si el dip switch es igual a 4
CALL SEG5
MOVLW 0X05
SUBWF DATO,W
BTFSC STATUS,2 ;Compara si el dip switch es igual a 5
CALL SEG6
MOVLW 0X06
SUBWF DATO,W
BTFSC STATUS,2 ;Compara si el dip switch es igual a 6
CALL SEG7
MOVLW 0X07
SUBWF DATO,W
BTFSC STATUS,2 ;Compara si el dip switch es igual a 7
CALL SEG8
;************************PARPADEO********************************************* BSF PORTB,0 ;Fija a 1 el bit 0 del puerto B
CLRF SEG ;Limpia
la variable SEG
CALL RETARDO ;Llama a subrutina de retardo
CLRF SEG
BCF PORTB,0 ;Fija a 0 el bit 0 del puerto B
CALL RETARDO
GOTO INICIO ;Manda llamar a inicio
;***********************FRECUENCIAS*******************************************
SEG1 MOVLW 0X01
MOVWF VAR ;Fija
en var el retardo para la frec 1
RETURN
SEG2 MOVLW 0X02
MOVWF VAR ;Fija
en var el retardo para la frec 2
RETURN
SEG3 MOVLW 0X04
MOVWF VAR ;Fija
en var el retardo para la frec 3
RETURN
SEG4 MOVLW 0X08
MOVWF VAR ;Fija
en var el retardo para la frec 4
RETURN
SEG5 MOVLW 0X0F
MOVWF VAR ;Fija
en var el retardo para la frec 5
RETURN
SEG6 MOVLW 0X10
MOVWF VAR ;Fija
en var el retardo para la frec 6
RETURN
SEG7 MOVLW 0X20
MOVWF VAR ;Fija
en var el retardo para la frec 7
RETURN
SEG8 MOVLW 0X40
MOVWF VAR ;Fija
en var el retardo para la frec 8
RETURN
;*****************************RUTINA DE RETARDO***********************
RETARDO CLRF TMR_OPT
INC BTFSS INTCON,2
GOTO INC
BCF INTCON,2
INCF SEG
MOVF VAR,w
SUBWF SEG,w
BTFSS STATUS,2
GOTO RETARDO
RETURN
END
Para
lograr una compactación del código óptima y una velocidad superior, el PIC
incorpora en su procesador 3 de las características
·
Procesador tipo RISC
·
Procesador segmentado
·
Arquitectura HARVARD
La
arquitectura HARVARD es con la cual se puede acceder de forma simultanea e
independiente a la memoria de datos y a la memoria de instrucciones. La
arquitectura interna del PIC 16F84 se muestra en el diagrama a bloques de la
Figura 4.1

Figura
4.1 Diagrama a bloques del PIC16F84
La arquitectura interna consta de 7 bloques fundamentales:
1. Memoria
de programa EEPROM de 1K x 14 bits.
2. Memoria
de datos formada por dos áreas. Una RAM donde se alojan 22 registros de
propósito especÍfico Especial Function Registers (SFR) y 36 de propósito
general General Purpose Registers (GPR) y otra del tipo EEPROM de 64 bytes.
3. Bus de
datos con una ALU de 8 bits y un registro de trabajo W
4. Recursos
conectados al bus de datos tales como puertos de I/O, temporizador, etc.
5. Base de
tiempos y circuitos auxiliares.
6. Direccionamiento
de la memoria de programa en base al contador de programa ligado al stack de 8
niveles.
7. Direccionamiento
directo e indirecto de la memoria RAM.
El
PIC16F84 tiene un contador de programa de 13 bits, capaz de direccionar un
espacio de memoria de 8K x 14. El primer 1K x 14 (0000h-03FFh) ya está
implementado Figura 4.2.El vector de reset se encuentra en la dirección 0000h y
el vector de interrupción en la 0004h.

Figura
4.2 Mapa de memoria de programa y
stack.
La
memoria de datos se dispone de dos áreas diferentes:
1. Área de RAM estática o SRAM, donde
reside el banco de registros específicos (SFR) y el banco de registros de
propósito general (GPR). El primer banco tiene 24 posiciones de tamańo byte,
aunque dos de ellas no son operativas, y el segundo 36.
2. Área EEPROM
de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden
al desconectar la alimentación.
La zona
de memoria RAM está dividida en dos banco (banco 0 y banco 1)de 128 bytes cada
uno. Solo se hallan implementadas las 48 primeras posiciones de cada banco, de
las cuales las 12 primeras están reservadas al SFR, que son los encargados del
procesador y sus recursos. Algunos de los registros se encuentran repetidos en
la dirección de los dos bancos, para simplificar su acceso (INDF, ESTADO, FSR,
PCLATH e INTCON). La posición apuntada por la dirección 7H y la apuntada por la
87H no son operativas. Los 36 registros restantes de cada banco se destinan a
GPR y en realidad solo son operativos los 36 del banco 0 por que los del banco
1 se mapean sobre el banco 0. Es decir que cuando se apunta a un registro
general del banco 1, se accede al mismo del banco 0. (Figura 4.3)
Para
seleccionar el banco para acceder se manipula el bite (RP0) del registro de
estado. Cuando RP0 = 1 acceso a banco
1, RP0 = 0 acceso a banco 0. Después de un Reset se accede automáticamente al banco 0. Para seleccionar un registro GPR no hay que tener en cuenta el
estado del bit RP0, porque al estar mapeado el banco 1 sobre el banco 0
cualquier registro del banco 1 corresponde al mismo del banco 0. En el
direccionamiento directo a los registros GPR se ignora el bit MSB, que
identifica el banco y sus direcciones están comprendidas entre el valor 0x0c y
Ox2f.
Los
registros SFR se clasifican en 2 grupos. En uno se incluye el núcleo del
microcontrolador (ESTADO, OPTION, INTCON, etc.) y en el otro la operación de
los recursos auxiliares y periféricos.
La figura 4.4 muestra la
estructura de estos registros y los valores que toman después de un Reset.

Figura 4.3 La memoria RAM de datos se
divide en 2 bancos de 128 bytes cada uno, solo los primeros 48 de cada banco
están implementados. Las 12 primeras posiciones de cada banco se reservan a los
registros SFR y las 36 restantes a los registros GPR.
Direccionamiento Directo
El
operando que utiliza la instrucción en curso se referencia mediante su
dirección, que viene incluida en el código de operación de la misma en los 7
bits menos significativos. El banco a acceder lo determinan los bits RP0 y RP1
del registro de estado. (Figura 4.5)
Direccionamiento Indirecto
Este modo
de direccionamiento se usa cuando en una instrucción se utiliza como operando
el registro INDF, que ocupa la dirección 0 de ambos bancos. El registro INDF no
está implementado físicamente y cuando se le hace referencia, se accede la
dirección de un banco especificada, con los 7 bits menos significativos del
registro FSR. El bit MSB de FSR junto al bit IRP del registro de estado se
encarga de seleccionar el banco a acceder, mientras que los 7 bits menos
significativos apuntan a la posición.
En este modo de direccionamiento el bit IRP = 0 siempre.

Figura 4.5
Direccionamiento directo del PIC16F84
El registro
de estado contiene el estado aritmético de la ALU (C, DC y Z). Indica el estado de RESET (TO y PD).
Selecciona el dato a acceder en la memoria de datos (IRP, RP0 y RP1).
Para
modificar el registro de estado, se deben de utilizar únicamente las
instrucciones BCF, BSF, SWAPF y MOVWF ya que estas instrucciones no afectan
ningún bit del registro de estado.
REGISTRO DE ESTADO

bit 7-6 No
implementado: Se programa como 0
bit 5 RP0: Selección de banco en direccionamiento directo
01
= Banco 1 (80h – FFh)
00
= Banco 0 (00h – 7Fh)
bit 4 TO: Bit Time-out
1 =
Después de energizarlo o al ejecutarse
las instrucciones CLRWDT y SEP
0 =
Cuando termina el tiempo del WDT (Watchdog)
bit
3 PD: Bit Power-Down
1 =
Después de energizarlo o al ejecutar la instrucción CLRWDT
0 = Al
ejecutar la instrucción SEP
bit
2 Z: Bit Cero
1 = El
resultado de la operación aritmética-lógica ha sido 0
0
= El resultado de la operación aritmética-lógica no es 0
bit 1 DC: Bit Digito
de carry/borrow (instrucciones ADDWF, ADDLW, SUBLW, SUBWF) (para borrow la
polaridad es al revés)
1 = En el
resultado de la instrucción se produjo un carry en el cuarto bit de menos peso.
0 = No se produjo
carry
![]()
![]()
bit 0 C: Bɩt carry/borrow
(instrucciones ADDWF, ADDLW, SUBLW, SUBWF) (para borrow la polaridad es al
revés)
1 = En el
resultado de la instrucción se produjo un carry en el bit de más significativo.
0 = No
se produjo carry.
Objetivo
Realizar una pantalla de matriz
de 8x16 y desplegar diferentes mensajes
Desarrollo
Realizar un programa que mediante
la ayuda de multiplexores, genere un barrido en las 16 columnas de la pantalla
y en sincronía con el puerto B mandar los datos a desplegar. El barrido se hará
a una velocidad en la que el ojo humano perciba que están iluminadas todas las
columnas. Ver figura D

FIGURA D
PROGRAMA 4
;*****************************************************************************
;*Programa: Display 16 x 8
;:Autor: Carlos Alberto López González
;*Descripcion: Controlar por medio del puerto a y b una pantalla de 16
x 8
;*****************************************************************************
;*******************************ETIQUETAS*************************************
STATUS EQU 3
PORTA EQU 5
PORTB EQU 6
TRISB EQU 6
TRISA EQU 5
COLUMNA EQU 0Ch
TABLA EQU 0Dh
CONTADOR1 EQU 0Eh
CONTADOR2 EQU 0Fh
CICLO EQU 10h
DELAY EQU 0XFF
ENABLE EQU 0X08
PCL EQU 02h
w EQU 0
f EQU 1
;*************************PROGRAMA
PRINCIPAL********************************
ORG 00h
ORG 05h
BSF STATUS,5
CLRF TRISB
MOVLW 0X10
MOVWF TRISA
BCF STATUS,5
MOVLW 0X00
MOVWF COLUMNA
GOTO INICIO
INICIO GOTO BARRIDO
;******************************CONTROLA PANTALLA
1****************************
BARRIDO BTFSC PORTA,4 ;Verifica push
GOTO BARRIDO1 ;Va a pantalla 2
MOVF COLUMNA,w ;Mueve valor de colum a W
MOVWF PORTA ;Mueve
valor de W al Port A
INCF COLUMNA,w ;Incrementa columna
MOVWF COLUMNA
CALL DATO ;Rutina de dato a desplegar
MOVWF TABLA ;Guarda
dato en la variable
MOVLW 0X0F ;Carga
w con el retardo
CALL RETARDO ;Llama retardo
MOVF TABLA,w ;Mueve valor de tabla a W
MOVWF PORTB ;Despliega dato al puerto B
MOVLW 0X10 ;Carga
w con 10
SUBWF COLUMNA,w ;Posición de columna
BTFSC STATUS,2
CALL RESET ;Ultima regresa al origen
GOTO
BARRIDO ;Regresa a barrido
;*******************************CONTROLA PANTALLA
2****************************
BARRIDO1 BTFSC PORTA,4
GOTO BARRIDO2
MOVF COLUMNA,w
MOVWF PORTA
INCF COLUMNA,w
MOVWF COLUMNA
CALL DATO1
MOVWF TABLA
MOVLW 0X0F
CALL RETARDO
MOVF TABLA,w
MOVWF PORTB
MOVLW 0X10
SUBWF COLUMNA,w
BTFSC STATUS,2
CALL RESET
GOTO BARRIDO1
;*******************************CONTROLA PANTALLA 3
***************************** BARRIDO2 BTFSC PORTA,4
GOTO BARRIDO3
MOVF COLUMNA,w
MOVWF PORTA
INCF COLUMNA,w
MOVWF COLUMNA
CALL DATO2
MOVWF TABLA
MOVLW 0X0F
CALL RETARDO
MOVF TABLA,w
MOVWF PORTB
MOVLW 0X10
SUBWF COLUMNA,w
BTFSC STATUS,2
CALL RESET
GOTO BARRIDO2
RESET MOVLW 0X00 ;Carga
w con 00
MOVWF COLUMNA ;Descarga w en columna
RETURN
;********************************RUTINA DE RETARDO
****************************
RETARDO MOVWF CONTADOR1
LOOP2 MOVWF CONTADOR2
LOOP1 DECFSZ CONTADOR2,f
GOTO LOOP1
DECFSZ CONTADOR1,f
GOTO LOOP2
RETURN
;********************************DATO PANTALLA 1
******************************
DATO ADDWF PCL
RETLW 0X81 ;regresa
de subrutina con w=81
RETLW 0X81 ;regresa
de subrutina con w=81
RETLW 0XFF ;regresa
de subrutina con w=FF
RETLW 0X81 ;regresa
de subrutina con w=81
RETLW 0X81 ;regresa
de subrutina con w=81
RETLW 0X00 ;regresa
de subrutina con w=00
RETLW 0XFF ;regresa
de subrutina con w=81
RETLW 0X89 ;regresa
de subrutina con w=89
RETLW 0X89 ;regresa
de subrutina con w=89
RETLW 0X89 ;regresa
de subrutina con w=89
RETLW 0X00 ;regresa
de subrutina con w=81
RETLW 0X01 ;regresa
de subrutina con w=01
RETLW 0X01 ;regresa
de subrutina con w=01
RETLW 0XFF ;regresa
de subrutina con w=81
RETLW 0X01 ;regresa
de subrutina con w=01
RETLW 0x01 ;regresa
de subrutina con w=01
RETLW 0X00 ;regresa
de subrutina con w=81
;*********************************DATO PANTALLA 2
*******************************
DATO1 ADDWF PCL
RETLW 0X00
RETLW 0X82
RETLW 0X81
RETLW 0XFF
RETLW 0X80
RETLW 0X80
RETLW 0X00
RETLW 0XFF
RETLW 0X91
RETLW 0X91
RETLW 0XF1
RETLW 0X00
RETLW 0XFF
RETLW 0X11
RETLW 0X11
RETLW 0x11
RETLW 0X00
;*********************************DATO PANTALLA 3
**********************************
DATO2
ADDWF PCL
RETLW 0X00
RETLW 0X00
RETLW 0XFF
RETLW 0X91
RETLW 0X91
RETLW 0X91
RETLW 0XFF
RETLW 0X00
RETLW 0X00
RETLW 0X10
RETLW 0X18
RETLW 0X14
RETLW 0X12
RETLW 0XFF
RETLW 0X00
RETLW 0x00
RETLW 0X00
END
CAPÍTULO 5
Una de las labores más comunes en
los programas de control de dispositivos, es determinar intervalos concretos de
tiempo. El elemento encargado de realizar esta función es el temporizador TMR0.
También es frecuente contar los pulsos que se producen en el exterior del
sistema y este elemento se denomina contador.
El PIC
16F84 tiene un temporizador/contador de 8 bits llamado TMR0, que actúa de dos
maneras diferentes:
1.- Como contador de sucesos, que están
representados por los pulsos que se aplican al pin RA4/TOCKI. Al llegar al
valor FFh se desborda el contador y con el siguiente pulso pasa a 00h,
activando una bandera ido provocando una interrupción.
2.- Como temporizador, cuando se carga en el
registro que implementa al recurso un valor inicial, se incrementa con cada
ciclo de instrucción ( Fosc/4) hasta que se desborda, o sea, pasa de FFh a 00h
y avisa fijando a 1 la bandera seńalizadora ido provocando una interrupción.
Ver figura 5.1

Figura
5.1 Diagrama a bloques del TIMER0
Nota: 1: TOCS, TOSE, PSA, PS2
(Registro OPTION)
2: El prescalador se comparte con el
temporizador del Watchdog
Para que
el TMR0 funcione como contador se tiene que fijar a 1 el bit TOCS. En esta
situación el registro TMR0 se incrementa con cada flanco activo en el pin
TOCK1. El tipo de flanco activo se elige programando el bit TOSE en el registro
OPTION. Si TOSE = 1, el flanco activo es negativo y si TOSE = 0 el flanco
activo es el positivo.
Para que el TMR0 funcione como
temporizador el bit TOCS = 0.
En
realidad el PIC 16F84 dispone de 2 temporizadores, el TMR0 y el Watchdog. El
primero actúa como principal y el segundo vigila el programa que se esté
ejecutando normalmente y que no este detenido en un ciclo infinito a espera de
algún evento que no se produce, lo que se traduce en un Reset que reinicia todo
el sistema.
El TMR0 y
el Watchdog, precisan controlar largos intervalos de tiempo y necesitan
aumentar la duración de los pulsos de reloj que los incrementa. Para hacer esto
se tiene un circuito denominado prescalador que divide la frecuencia utilizada
por diversos rangos.
En la figura 5.2 podemos ver el
diagrama a bloques del prescalador del TIMER/WDT

Figura
5.2 Diagrama a bloques del Prescalador TIMER0/WDT.
Para
calcular los tiempos a controlar con TMR0 se utilizan las siguientes fórmulas
prácticas.
Temporización
= 4 * TOSC * (Valor cargado en TMT0)* (Prescaler)
Valor
a cargar en TMR0 = Temporización/4 * TOSC * Prescaler
En
cualquier momento se puede leer el valor de TMR0 sin detener su cuenta. La
instrucción adecuada es movf tmr0,w.
Este
registro controla el TMR0 y el prescalador . El bit T0CS (Timer 0 Clock Edge
Select) selecciona el multiplexor MPX1 la procedencia de los pulsos de reloj,
que pueden ser los del oscilador interno (Fosc/4) o los que se aplican desde el
exterior por el pin TOCKI. El bit T0SE
( Timer 0 Clock Source Select)
elige el tipo de flanco activo en los pulsos externos. Si T0SE = 1 el
flanco activo es el negativo, y si
T0SE = 0 el flanco activo es el positivo.
El bit
PSA del registro OPTION determina la asignación del prescalador al TMR0 (PSA =
0) o al WDT (PSA = 1).
REGISTRO OPTION

bit 7 RBPU: Bit de habilitación de Pull-up del puerto B
1 = PORTB Pull-up deshabilitado
0 = PORTB
Pull-up habilitado
bit 6 INTEDG: Bit de selección de flanco de interrupción
1
= Interrupción en flanco negativo
0
= Interrupción en flanco positivo
bit 5 TOCS: Bit de
selección de reloj fuente del TMR0
1
= Transición en el pin RA4/TOCKI
0
= Ciclo de reloj de instrucción interna (CLKOUT)
bit 4 T0SE : Bit de selección de flanco del TMR0
1
= Incrementa en transición negativa en el pin RA4/TOCKI
0
= Incrementa en transición positiva en el pin RA4/TOCKI
bit 3 PSA: Bit de asignación del prescalador
1
= Prescalador asignado a WDT
0
= Prescalador asignado al Timer0
bit 2-0 PS2:PS0: Bits de
selección de la taza del prescalador
|
BIT |
Taza TMR0 |
Taza WDT |
|
000 001 010 011 100 101 110 111 |
1 : 2 1 : 4 1 : 8 1 : 16 1 : 32 1 : 64 1 : 128 1 :256 |
1 :1 1 : 2 1 : 4 1 : 8 1 : 16 1 : 32 1 : 64 1 : 128 |
La interrupción
del TMR0 es generada cuando se desborda el registro de FFh a 00h. Este
desbordamiento fija el bit T0IF (INTCON<2>). La interrupción puede ser
enmasacarada limpiando el T0IE (INTCON<5>). El bit T0IF debe ser limpiado
en el programa por la rutina del servicio de interrupción, rehabilitando esta
interrupción.
REGISTRO INTCON

bit 7 GIE: Bit de habilitación de interrupción global
1
= Habilita todas las interrupciones no enmascaradas
0
= Deshabilita todas las interrupciones
bit 6 EEIE: Habilitación de interrupción de escritura completa
1
= Interrupción habilitada
0
= Interrupción deshabilitada
bit 5 T0IE: Habilita la interrupción de desbordamiento del TMR0
1
= Interrupción habilitada
0
= Interrupción deshabilitada
bit 4 INTE: Habilitación de interrupción externa RB0/INT
1
= Interrupción habilitada
0
= Interrupción deshabilitada
bit 3 RBIE: Habilitación de interrupción de cambio de puerto RB
1=
Interrupción habilitada
0
= Interrupción deshabilitada
bit 2 T0IF: Bit bandera de interrupción de desbordamiento
1
= El registro TMR0 se desbordó
0
= El registro TMR0 no se ha desbordado
bit1 INTF: Bit bandera de
interrupción externa RB0/INT
1
= Ocurrió una interrupción externa
0
= Ningún pin del RB7:RB4 ha cambiado de estado
El
watchdog es un contador interno de 8 bits que origina un Reset cuando se
desborda. Su control de tiempos es independiente del TMR0 y esta basado en un
simple red R-C. El WDT puede ser permanentemente deshabilitado, programando el
bit WDTE como 0 en la palabra de configuración.
El WDT
tiene un tiempo nominal de desbordamiento de 18ms (sin prescalador). Utilizando
el prescalador se puede aumentar hasta alcanzar los 2.3 segundos.
Para
evitar el desbordamiento del WDT se tiene que refrescar previamente. Esto
consiste en ponerlo a cero mediante las
instrucciones clrwdt y sep. Se deben analizar las instrucciones para poder
situar estas instrucciones antes de que ocurra el desbordamiento y se reinicie
el sistema. Ver Figura 5.3
La
instrucción clrwdt borra el WDT y reinicia su cuenta. A diferencia de la
instrucción sep, además de borrar el WDT detiene el sistema y lo mete en un
modo de bajo consumo, al completar su cuenta provocará un reset y sacará al
microcontrolador del modo de bajo consumo.

Figura
5.3 Diagrama a bloques del temporizador WDT
Algunos
pines de los puertos de I/O están multiplexados con una función alterna.
PORTA es
un puerto bi-direccional de 5 bits. Su registro de dirección de datos es TRISA.
Fijando un bit de TRISA (= 1) configurara el pin correspondiente como entrada.
Limpiando un bit TRISA (= 0) configurará el pin correspondiente del puerto A
como salida.
Nota:
Cuando ocurre un Reset, estos pines son configurados como entrada.
Las
líneas RA3 – RA0 admiten niveles de entrada TTL y de salida CMOS. RA4/TOCKI
dispone de un circuito Schmitt Trigger que proporciona una buena inmunidad al
ruido. RA4 multiplexa su función de I/O con la entrada de reloj para el TMR0.
TABLA 5-1: Funciones Puerto A
|
Nombre |
Bit |
Tipo
de Buffer |
Función |
|
RA0 |
bit0 |
TTL |
Entrada/Salida |
|
RA1 |
bit1 |
TTL |
Entrada/Salida |
|
RA2 |
bit2 |
TTL |
Entrada/Salida |
|
RA3 |
bit3 |
TTL |
Entrada/Salida |
|
RA4/TOCKI |
bit4 |
ST |
Entrada/Salida o entrada de reloj
externo para TMR0 |
TABLA 5-2 Registros asociados con el Puerto
A
|
Direccion |
Nombre |
Bit 7 |
Bit
6 |
Bit
5 |
Bit
4 |
Bit
3 |
Bit2 |
Bit
1 |
Bit
0 |
|
05h |
PORTA |
--- |
--- |
--- |
RA4/TOCKI |
RA3 |
RA2 |
RA1 |
RA0 |
|
85h |
TRISA |
--- |
--- |
--- |
TRISA4 |
TRISA3 |
TRISA2 |
TRISA1 |
TRISA0 |
PORTB es
un puerto bi-direccional de 8 bits. Su registro de dirección de datos es TRISB.
Fijando un bit de TRISB (= 1) configurará el pin correspondiente como entrada.
Limpiando un bit TRISB (= 0) configurará el pin correspondiente del puerto B
como salida.
Cada pin
del puerto B tiene internamente una resistencia de Pull-up. Con un solo bit de
control se pueden activar todas las resitencias de Pull-up. Esto se hace mediante
el bit RBPU del registro OPTION. El pull-up se desactiva automáticamente cuando
el puerto es configurado como salida y al activar el Reset.
Cuatro
pines del puerto B RB7:RB4 tienen la característica de interrupción. Solo los
pines configurados como entrada pueden causar esta interrupción. La
interrupción la podemos ver con la badera BIRF que se encuentra en el registro
INTCON.
TABLA 5-3: Funciones
Puerto B
|
Nombre |
Bit |
Tipo
de Buffer |
Función |
|
RB0/INT |
bit 0 |
TTL/ST |
Pin Entrada/salida o entrada de interrupción externa |
|
RB1 |
bit 1 |
TTL |
Pin Entrada/salida |
|
RB2 |
bit 2 |
TTL |
Pin Entrada/salida |
|
RB3 |
bit 3 |
TTL |
Pin Entrada/salida |
|
RB4 |
bit 4 |
TTL |
Pin Entrada/salida con interrupción en cambio |
|
RB5 |
bit 5 |
TTL |
Pin Entrada/salida con interrupción en cambio |
|
RB6 |
bit 6 |
TTL/ST |
Pin Entrada/salida con interrupción en cambio |
|
RB7 |
bit 7 |
TTL/ST |
Pin Entrada/salida con interrupción en cambio |
|
RB8 |
bit 8 |
TTL/ST |
Pin Entrada/salida con interrupción en cambio |
TABLA 5- 4 Registros asociados con el puerto B
|
Dirección |
Nombre |
Bit 7 |
Bit
6 |
Bit
5 |
Bit
4 |
Bit
3 |
Bit
2 |
Bit
1 |
Bit
0 |
|
06h |
PORTB |
RB7 |
RB6 |
RB5 |
RB4 |
RB3 |
RB2 |
RB1 |
RB0/INT |
|
86h |
TRISB |
TRISB7 |
TRISB6 |
TRISB5 |
TRISB4 |
TRISB3 |
TRISB2 |
TRISB1 |
TRISB0 |
|
81h |
OPTION |
RBPU |
|
|
|
|
|
|
|
|
0Bh,8Bh |
INTCON |
GIE |
|
TOIE |
|
|
TOIF |
|
|
Es una
posición reservada de la memoria de
programa situada en la dirección 2007h y accesible únicamente durante el
proceso de grabación. Al escribirse el programa de la aplicación es necesario
grabar el contenido de esta posición de acuerdo con las características del
sistema. Ver Figura 5.4

Figura 5.4: Palabra de configuración
Bit 13-4 CP: Bit de
protección de código
1
= Protección de código desactivado
0 = Toda la memoria de programa
está protegida
bit 3 PWRTE: Bit de habilitación del temporizador “POWER-UP”
1
= Deshabilitado
0
= Habilitado
bit 2 WDTE: Bit de habilitacion del temporizador Watch Dog
1=
Habilitado
0
= Deshabilitado
bit 1-0 F0SC1:F0SC0: Bits de
selección del oscilador
11
= Oscilador RC
10
= Oscilador HS
01 = Oscilador XT
00 = Oscilador LP
El Pic
16F84 tiene 64 bytes de memoria EEPROM de datos, donde se pueden almacenar
datos y variables que interesa que no se pierdan cuando se desconecta la
alimentación del sistema. Soporta 1,000,000 de ciclos de escritura/borrado y es
capaz de guardar la información sin alterarla más de 40 ańos.
La
memoria EEPROM no está mapeada en la zona de la memoria de datos donde se
ubican los registros SFR y GPR. Para poder leerla y escribirla durante el
funcionamiento normal del microcontrolador se tienen que utilizar 4 registros
del SFR:
·
EEDATA
·
EEADR
·
EECON1
·
EECON2
En el
registro EEADR, se carga la dirección a acceder de la EEPROM de datos. El
PIC16F84 tiene 64 bytes de memoria EEPROM de datos con un rango de 0h hasta
3Fh. En el registro EEDATA se depositan los datos que se leen o se escriben .
El
registro EECON1, funciona para controlar las operaciones de la EEPROM y la
distribución de sus bits se presenta en
la figura 5.5

Figura 5.5
Registro EECON1
bit 7-5 No implementados
bit 4 EEIF: Bandera
de interrupción de operación de escritura
1 =
Operación de escritura completa
0 = Operación
de escritura no se ha completado
bit 3 WRERR: Bandera
de error en escritura
1= Operación de
escritura terminó antes de tiempo
0= Operación de
escritura completa
bit 2 WREN: Bit de
habilitación de escritura
1= Permite la
escritura de la EEPROM
0= Inhabilita
la escritura de la EEPROM
bit 1 WR: Bit de
control de escritura
1= Inicia el
ciclo de escritura
0= Ciclo de
escritura completo
bit 0 RD: Bit de
control de lectura
1= Inicializa
la lectura de la EEPROM
0= No
inicializa la lectura de la EEPROM
Ejemplo
para realizar la lectura de una posición de la EEPROM de datos.

BCF
STATUS,RP0 ; Banco 0
MOVLW CONFIG_ADDR
MOVWF EEADR ; Dirección a leer
BSF STATUS,
RP0 ; Banco 1
BSF EECON1, RD ; Lectura
BCF STATUS,
RP0 ; Banco 0
MOVF EEDATA, W ; W =
EEDATA
Ejemplo para
realizar la escritura de una posición de la EEPROM de datos un valor.

BCF
STATUS,RP0 ; Banco 1
BCF INTCON, GIE ;Deshabilita INTs
BSF EECON1, WREN ; Habilita escritura
MOVLW 55h
MOVWF EECON2 ; Escribe 55h
MOVLW Aah
MOVWF EECON2 ; Escribe Aah
BSF EECON1, WR ; Comienza escritura
BSF INTCON, GIE ; Habilita INTs.
Objetivo
Elaborar un contador de 4 dígitos, diseńando un circuito
que requiera la menor cantidad posible de componentes.
Desarrollo
Conectar los cuatro dígitos del
display en paralelo. Para que no se
encienda sobre los cuatro dígitos el mismo número se multiplexa el encendido
por medio de cuatro transistores. Para que el display se ilumine no solo tiene
que haber un uno lógico en el segmento a encender, sino que también se requiere
que el transistor este en conducción para lograr la activación del display.
Conmutando los transistores secuencialmente y a velocidad suficiente se logra
hacer parecer al ojo humano que los cuatro displays están iluminados
simultáneamente, cuando en realidad sólo uno se ilumina. Ver figura E

FIGURA
E
PROGRAMA 5
;**************************************************************************
;*Programa: Contador.asm
;Descripcion: Contador de 4 digitos.
;***************************************************************************
;********************************ETIQUETAS***********************************
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
rota equ 0fh ;variable para desplazamiento de display
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
dig1 equ 10h ;acumulador miles
dig2 equ 11h ;acumulador centenas
dig3 equ 12h ;acumulador decenas
dig4 equ 13h ;acumulador unidades
loops equ 1dh ;variables usadas en retardos
loops2 equ 1eh
z equ 02h ;Bandera de cero
ram equ 05h ;bit de seleccion de pagina de memoria
c equ 00h ;bandera de acarreo
w equ 00h ;bit de destino a variable de trabajo
reset org 00
goto inicio
org 05h
;*******************************PROGRAMA
PRINCIPAL****************************
inicio bsf status,
ram ;selecciona el banco de memoria
alto
movlw 10h
;configura el puerto a
movwf trisa ;bit 4 entrada, demas bits salidas.
movlw 00h ;configura el
puerto b
movwf trisb ;como salidas
bcf status,
ram ;selecciona el banco de memoria
bajo
clrf dig1 ;inicializa
acumuladores
clrf dig2
clrf dig3
clrf dig4
movlw 00
movwf ptoa ;todos los displays a 0
empe btfss ptoa, 4 ;checa el push y salta si es 0
call subir ;llama la rutina de incremento
movlw 08h ;iniciar un 1 en el registro de rotacion
movwf rota
movlw dig1 ;con el registro selector (fsr) se apunta
movwf fsr
;al primer dato
que se va a mostrar
disp movlw 00h
;colocar en cero el
dato del display
movwf ptob ;para apagarlos
movf rota, w ;pasa rotacion del
1 a la variable work
movwf ptoa ;enciende el
transistor (display)
movf indo, w ;lee dato del registro apuntado por fsr
call tabla ;genera el
digito de 7 segmentos
movwf ptob ;envia el
digito al puerto b
movlw 03h
call retardo
btfsc rota, 0 ;Checa si termino
barrido
goto empe ;si termino,
vuelve desde el comienzo
bcf status, c ;carry en cero
rrf rota ;desplaza barrido
incf fsr ;incrementa
el puntero.
goto disp ;digito a
mostrar
;*******************************RETARDO**************************************
retardo movwf loops
top2 movlw d'110'
movwf loops2
top nop
decfsz loops2
goto top
decfsz loops
goto top2
retlw 0
;******************************RUTINA DE INCREMENTO X 1000
*******************
s1000 clrf dig2 ;pone a cero las centenas
incf dig1 ;incrementa el contador de miles
movf dig1, w ;carga en w el conteo de los miles
xorlw 0ah ;si numero a, entonces quedara en cero
btfsc status, z ;si es cero, z queda en alto
clrf dig1
;inicializa los miles
return
;*************************RUTINA DE INCREMENTO X 100
*************************
s100 clrf dig3 ;pone a cero las decenas
incf dig2 ;incrementa el contador de centenas
movf dig2, w ;carga en w el conteo de las centenas
xorlw 0ah ;si w era 10, entonces quedara en cero
btfsc status, z ;si es cero, z queda alto
call s1000 ;incrementa los miles
return
;**************************RUTINA DE INCREMENTO X
10**************************
s10 clrf
dig4 ;pone a cero las unidades
incf dig3
;incrementa el contador de decenas
movf dig3, w ;carga en w el conteo de las decenas
xorlw 0ah ;si w era 10, entonces quedara en
cero
btfsc status, z ;si es cero, el flag z queda alto
call s100 ;incrementa las centenas
return
;***************************RUTINA DE INCREMENTO X 1
*****************************
subir incf
dig4 ;incrementa el contador de
unidades
movf dig4, w ;carga en w el conteo de las unidades
xorlw 0ah ;si w era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
movlw d'250'
call retardo
return
;***************************GENERA LOS NUMEROS SOBRE EL
DISPLAY**********
tabla addwf pc ;agrega
al cont. programa el valor de w
retlw 3Fh ;genera
el 0
retlw 18h ;genera el 1
retlw 76h ;genera el 2
retlw 7Ch ;genera el 3
retlw 59h ;genera el 4
retlw 6Dh ;genera el 5
retlw 6Fh ;genera el 6
retlw 38h ;genera el 7
retlw 7Fh ;genera el 8
retlw 7Dh
;genera el 9
end
CAPÍTULO 6
El
PIC16F84 tiene 4 fuentes de interrupción:
·
Interrupción externa por el pin RB0/INT
·
Interrupción de sobreflujo del TMR0
·
Interrupciones de cambio del puerto B (Pines RB7:RB4)
·
Interrupción de fin de escritura de la EEPROM de datos
El
registro de control de interrupciones (INTCON) graba las interrupciones en bits banderas. Cada interrupción tiene su
propia bandera.
El bit de
habilitación global de interrupciones, GIE habilita o deshabilita
individualmente cada una de las interrupciones a través del registro INTCON.
(Ver figura 6.1)
|
GIE |
EEIE |
TOIE |
INTE |
RBIE |
TOIF |
INTF |
RBIF |
bit
7 bit 0
Figura 6.1 Registro INTCON
bit 7 GIE: Habilitación de interrupciones global
1=
Acepta las interrupciones habilitadas
0=
No acepta ninguna interrupción
bit 6 EEIE: Habilita interrupción de fin de escritura de la EEPROM
1=
Habilita interrupción
0=
Deshabilita interrupción
bit 5 TOIE: Habilita interrupción de sobreflujo del TMR0
1= Habilita interrupción
0=
Deshabilita interrupción
bit 4 INTE: Habilitación de interrupción externa pin RB0/INT
1=
Habilita interrupción
0=
Deshabilita interrupción
bit 3 RBIE:
Habilitación de interrupción por cambio de estado en
RB7:RB4
1=
Habilita interrupción
0=
Deshabilita interrupción
bit 2 TOIF: Bandera
de sobreflujo del TMR0
1=
Sobreflujo en el TMR0
0=
TMR0 no se ha tenido sobreflujo
bit 1 INTF: Bandera de activación del pin RB0/INT
1=
Se activó RB0/INT
0=
No se ha activado RB0/INT
bit 0 RBIF: Bandera
de cambio de estado en los pines
RB7:RB4
1=
Cuando cambia de estado alguno de los 4 pines
0=
No ha cambiado el estado
Siempre
que se produce una interrupción, GIE = 0 y el contador del programa CP se carga
con el valor 0004h que es el vector de interrupción. Para saber que tipo de
interrupción fue, se localiza la bandera que se haya activado en el registro
INTCON.
Antes de
regresar de una interrupción al programa, todas las banderas tienen que fijarse
a cero, aunque la interrupción esté deshabilitada.
Esta
interrupción puede programarse tanto de flanco de disparo positivo como
negativo en el bit INTDEG en el registro OPTION_REG. Es importante para atender acontecimientos externos en tiempo
real. Cuando ocurre alguno y se activa el pin RB0/INT, se hace una petición de
interrupción. De forma automática el bit INTF1 = 1 y, si el bit de habilitación
INTE =1, se autoriza el desarrollo de una interrupción.
Cuando
existe sobreflujo (FFh – 00h) la bandera T0IF se fija a 1. La interrupción
puede ser habilitada o deshabilitada en el bit T0IE en el registro INTCON.
Si no se
recarga el TMR0 cuando ocurre un sobreflujo, sigue contando desde 00h hasta
FFh. Este registro se puede leer y escribir en cualquier momento, cada vez que
se escribe en este registro se pierden dos ciclos de reloj para la
sincronización. Cuando se carga el TMR0 con un valor N, cuenta 256 – N y el
tiempo que tardará en llegar a esta cuenta está dado por la siguiente formula.
![]()
Un cambio
en la entrada del puerto B 7:4 fijan el bit bandera RBIF en el registro INTCON.
La interrupción puede ser habilitada o deshabilitada en el bit RBIE. Esta
interrupción esta diseńada específicamente para detectar cuando se pulsa una
tecla correspondiente a un teclado matricial que se explora mediante 4 líneas
de I/O.
El tiempo
típico que tarda en desarrollarse una operación de escritura en la EEPROM de
datos del PIC16F84 es de 10ms, que es considerable comparado con la velocidad a
la que el procesador ejecuta las instrucciones. Para asegurarse que se ha
completado la escritura y puede continuarse con el flujo de control del
programa es aconsejable manejar la interrupción que se origina al finalizar la
escritura, que fija automáticamente la bandera
EEIEF a 1 y se habilita en el bit EEIE.
Durante
la escritura de este registro debe prohibirse la aceptación de interrupciones
para asegurar la operación de escritura, para esto se fija el bit GIE = 0.
El
PIC16F84 tiene diferentes formas para la reinicialización del sistema:
·
Conexión
de la alimentación. POR (Power-On Reset)
·
MCLR durante operación normal
·
MCLR
durante el modo SEP
·
Reset WDT (Watch Dog)
durante operación normal
·
Wake-Up durante modo SLEEP
La Figura
6.2 muestra un diagrama a bloques de los diferentes tipos de RESET. En el pin
MCLR, se tiene un filtro interno para eliminar el ruido e ignorar los pulsos
pequeńos.
El PWRT activa una salida después de cierto
tiempo de haber conectado la alimentación. Este tiempo garantiza la
estabilización del voltaje de alimentación.

Figura
6.2 Diagrama a bloques de los
diferentes tipos de Reset
Este modo
de funcionamiento del PIC, está caracterizado por el reducido consumo de
energía que requiere y se recomienda en
aquellas aplicaciones en las que hay largos periodos en espera de algún suceso.
Para
entrar en el modo de reposo se tiene que ejecutar la instrucción SLEEP. En este
modo el pin TOCK1 se conecta a VDD o VSS, para eliminar la entrada de pulsos
externos al TMR0. El TMR0 también se detiene. Los pines de I/O mantienen el
estado anterior al modo de reposo y las que no estén conectadas, se aconseja
conectarlas a VDD o VSS para evitar posibles fugas de corriente.
Para
salir del modo SLEEP existen tres alternativas:
·
Provocando un reset MCLR
·
WDT sí está en modo SLEEP
·
Por medio de alguna de las interrupciones excepto la del
TMR0 que se detiene en modo SLEEP
Objetivo
Elaborar un control de velocidad y giro de un motor a
pasos. Utilizar el TMR0 para controlar la frecuencia de giro del motor.
Desarrollo
Conectar el motor a pasos en el
puerto b y utilizar las instrucciones RLF(Rotar a izquierda) y RRF(Rotar a
derecha) para controlar el giro. Conectar al Puerto A las entradas de dirección de giro e incremento y decremento de
velocidad. Mediante subrutinas de incremento variable controlaremos la
frecuencia de barrido en las bobinas del motor a pasos. Ver Figura F

FIGURA F
PROGRAMA 6
;**************************************************************************
;*Programa: pasos.asm
;*Descripción: Control de Motor a pasos
;***************************************************************************
;*******************************ETIQUETAS***********************************
STATUS EQU 3
TMR_OPT EQU 1
INTCON EQU 0Bh
PORTA EQU 5
PORTB EQU 6
TRISB EQU 6
TRISA EQU 5
SEG EQU 0Ch
VAR EQU 0Dh ;Variable de frecuencia
REG EQU 0Eh ;Registro derecha
REG_IZQ EQU 0Fh ;Registro Izquierda
MIN EQU 10h
MAX EQU 11h
w EQU 0
f EQU 1
ORG 00h
ORG 05h
BSF STATUS,5
MOVLW 0X07
MOVWF TRISA
MOVLW 0XF0
MOVWF TRISB
MOVLW 0XD7 ;Fija
prescalador
MOVWF TMR_OPT
BCF STATUS,5
CLRF PORTB
MOVLW 0X08
MOVWF REG
MOVLW 0X10
MOVWF VAR ;Determina
velocidad
MOVLW 0X01
MOVWF MIN ;Velocidad
máxima
MOVLW 0XFF
MOVWF MAX ;Velocidad
mínima
CLRF SEG
GOTO
INICIO
;*************************PROGRAMA
PRINCIPAL********************************
INICIO BTFSC PORTA,2 ;Verifica entrada pta2
GOTO IZQ ;Gira izquierda
GOTO DER ;Gira derecha
;*************************GIRO LADO DERECHO
*********************************
DER BTFSC PORTA,2 ;Verifica entrada pta2
GOTO IZQ ;Si es 0 gira
izquierda
MOVF REG,W ;Inicia barrido a la
derecha
MOVWF PORTB
BTFSC PORTA,0 ;Verifica entrada
de + Vel
CALL INCRE ;Incrementa Velocidad
BTFSC PORTA,1 ;Verifica entrada de - Vel
CALL DECRE ;Decrementa velocidad
CALL RETARDO ;Llama subrutina de retardo CLRF SEG
RRF PORTB,W ;Incrementa barrido
MOVWF REG
BTFSS PORTB,0 ;Verifica fin de barrido
GOTO DER
CALL CAMBIO_DER
GOTO
INICIO
;************************** RESET BARRIDO A LA
DERECHA*******************
CAMBIO_DER MOVLW 0X08 ;Prepara
barrido derecha
MOVWF REG
RETURN
;****************************GIRO LADO
IZQUIERDO******************************
IZQ BTFSS PORTA,2 ;Verifica entrada pta2
GOTO DER ;Si es 1 gira a la
derecha
MOVF REG,W ;Barrido a la izquierda
MOVWF PORTB
BTFSC PORTA,0 ;Verifica entrada
de + Vel
CALL INCRE ;Incrementa velocidad
BTFSC PORTA,1 ;Verifica entrada de - Vel
CALL DECRE ;Decrementa velocidad
CALL RETARDO ;Llama subrutina de retardo CLRF SEG
BCF STATUS,0
RLF PORTB,W
BCF STATUS,0
MOVWF REG
BTFSS PORTB,3 ;Verifica fin de barrido
GOTO IZQ
CALL CAMBIO_IZQ
GOTO
INICIO
;*****************************RESET BARRIDO A LA
IZQUIERDA*******************
CAMBIO_IZQ MOVLW 0X01
MOVWF REG
RETURN
;**************************** INCREMENTA
VELOCIDAD***************************
INCRE MOVF VAR,W ;Mueve velocidad a w
MOVWF VAR
MOVF VAR,w
SUBWF MIN,w ;Compara
si es vel max
BTFSS STATUS,2
DECF VAR ;Si
no es max decrementa
RETURN
;***************************** DECREMENTA
VELOCIDAD*****************************
DECRE MOVF VAR,W ;Mueve velocidad a w
MOVWF VAR
MOVF VAR,w
SUBWF MAX,w ;Compara
si es vel min
BTFSS STATUS,2
INCF VAR ;Si no es min incrementa
RETURN
;*****************************RUTINA DE RETARDO***********************
RETARDO CLRF TMR_OPT ;Limpia el TMR0
INC BTFSS INTCON,2 ;Verifica desbordamiento
GOTO INC
BCF INTCON,2 ;Limpia bandera TOIF
INCF SEG ;Incrementa variable seg
MOVF VAR,w ;Mueve el valor de var a
w
SUBWF SEG,w ;Compara
si es la velocidad
BTFSS STATUS,2 ;Si es regresa a rutina
GOTO RETARDO
RETURN
END
CAPÍTULO 7
Los
microcontroladores PIC tienen una arquitectura de tipo RISC (Reduced
Instruction Set Computer). Ésta no implica únicamente que el número de
instrucciones máquina que es capaz de interpretar y ejecutar es pequeńo, sino
que tiene las siguientes características:
·
Instrucciones simples y rápidas
·
Instrucciones ortogonales
·
Longitud de instrucciones y datos constante
Las
instrucciones del PIC16F84, tienen 14 bits de longitud, divididos en un código
operativo (OPCODE) que especifica el tipo de instrucción y uno o más operandos
que especifican la operación de la instrucción. Ver tabla 7-1
a) Campo del
código OP
Los bits
de este campo sirven para definir la operación que realiza la instrucción.
b) Operandos
fuente (f) y destino (d)
Estos
definen los registros que actúan como operandos en la instrucción. Estos dan
una referencia de la dirección que ocupan en la memoria de datos.
c) Campo de
operando inmediato o literal (k)
Contiene
el valor de un operando inmediato.
d) Campo de
referencia a un bit (b)
Es un
campo de 3 bits que indica la posición de un bit dentro de un registro de 8
bits.
e) Campo de
dirección de salto
En las
instrucciones de salto CALL y GOTO hay un campo de bits que contiene la
dirección de la siguiente instrucción que hay que ejecutar. Dicho campo de bits
se carga en el PC en las instrucciones de salto condicional.
Estos
formatos se clasifican en 5 grandes grupos según el tipo de operación que
desarrollan
1) Operaciones
que manejan registros de tamańo byte
2) Operaciones
que manejan bits
3) Operaciones
que manejan valores inmediatos
4) Operaciones
incondicionales de control de flujo de programa
5) Operaciones
de salto condicional
El
formato de las instrucciones orientado a manejar registros de tamańo byte, se divide en tres campos. Ver figura
7.1
1. Campo del
código OP de 6 bits
2. Campo de
la dirección del operando fuente (f) de 7 bits
3. Campo que
define él operando destino (d) de 1 bit
Figura 7.1
Manejo de registro de tamańo byte

Todas las
instrucciones que tienen este tipo de formato las podemos encontrar en la tabla
7-1.
TABLA 7-1
|
Mnemónicos, Operandos |
Descripción |
Ciclos |
14-Bit Opcode |
Seńalizadores |
|
|
MSb
LSb |
|||||
|
ADDWF f,d ANDWF f,d CLRF f CLRW - COMF f,d DECF f,d DECFSZ f,d INCF f,d INCFSZ f,d IORWF f,d MOVF f,d MOVWF f,d NOP RLF f,d RRF f,d SUBWF f,d SWAPF f,d XORWF f,d |
Suma W y f Multiplica W con F Borra f Borra W Complementa f (inv) Decrementa f Decrementa f salta si 0 Incrementa f Incrementa f salta si 0 OR entre W y F Mueve f Mueve w a f No opera Rota f a la izquierda Rota f a la derecha Resta W a f Intercambia nibbles XOR de W con f |
1 1 1 1 1 1 1(2) 1 1(2) 1 1 1 1 1 1 1 1 |
00
0111 dfff ffff 00 0101 dfff
ffff 00
0001 1fff ffff 00
0001 0xxx xxxx 00
1001 dfff ffff 00
0011 dfff ffff 00
1011 dfff ffff 00
1010 dfff ffff 00
1111 dfff ffff 00
0100 dfff ffff 00
1000 dfff ffff 00
0000 dfff ffff 00
0000 0xx0 ffff 00
1101 dfff ffff 00
1100 dfff ffff 00
0010 dfff ffff 00
1111 dfff ffff 00 0110 dfff
ffff |
C,DC,Z Z Z Z Z Z Z Z Z C C C,DC,Z Z |
|
El formato
al que responden las instrucciones de este grupo tiene tres campos.
1. Campo del
código OP de 4 bits
2. Campo de
la dirección del registro fuente
3. Campo de
la posición del bit en el registro de 3 bits

En la tabla 7-2 se muestran las instrucciones
orientadas a manejar bits
Tabla 7-2
|
Mnemónicos, Operandos |
Descripción |
Ciclos |
14-Bit Opcode |
|
|
MSb LSb |
||||
|
BCF b,f BSF b,f BTFSC b,f BTFSS b,f |
Limpia el bit f Fija a 1 el bit f Checa bit de f y brinca si es 0 Checa bit de f y brinca si es 1 |
1 1 1(2) 1 |
01
00bb bfff ffff 01
01bb bfff ffff 01
10bb bfff ffff 01
11bb bfff ffff |
|
El formato
correspondiente a este grupo de formato solo tiene 2 campos
1. Campo del
código operativo con 6 bits
2. Campo del
valor inmediato (k) con 8 bits

k = Valor inmediato de 8 bits
7.2.4
Operaciones
incondicionales de control de flujo de programa
Este tipo
de instrucciones afectan al contenido del Contador de Programa (PC) y sirven
para romper la secuencia ordenada de las instrucciones del programa. Las
instrucciones de este grupo tienen un formato con sólo 2 campos:
1. Campo del
código OP de 3 bits
2. Campo de
la dirección del salto que se carga en el PC de 11 bits

k = Valor inmediato de 11 bits
El PIC
dispone de algunas instrucciones que comparan, y cuando se cumple alguna
condición, efectúan un salto de instrucción.
El
formato de las instrucciones de salto(skip) es el mismo que el de las
operaciones que manipulan registros de un byte.
En la
tabla 7-2 se encuentran las instrucciones de salto BTFSC y BTFSS
7.1
Nomenclatura
y símbolos
|
SIMBOLO |
SIGNIFICADO |
|
0xhh |
Se usa para referenciar 2
números en hexadecimal hh |
|
F |
Representa la dirección de la
memoria RAM de datos |
|
D |
Bit que indica el registro
destino. Si d = 0 es W si d = 1 es f |
|
K |
Campo que contiene un valor
inmediato. Operando (8 bits) o dirección
para el PC (11 bits) |
|
X |
Valor indeterminado de un bit
puede ser 1 o 0 |
|
() |
Contenido |
|
<> |
Campo de un bit de un registro |
|
Î |
En el conjunto de Ejemplo: d Î [0,1]. |
|
[] |
Opciones |
En este
grupo se incluyen las instrucciones que rompen la secuencia normal del programa
porque alteran el contenido del PC y también las instrucciones especiales.
La
instrucción de salto condicional goto carga en el PC la dirección de la nueva
instrucción. La instrucción call de
llamada a subrutina, antes de cargar el PC con la dirección de la instrucción a
saltar, guarda la dirección de partida guardando en la parte más alta del SP el
valor actual de la PC. De esta manera al regresar de la subrutina, se carga la
dirección de regreso al programa principal.
Para
regresar de una subrutina existen 2 formas. La más común es return que se
limita a regresar cargando el valor del PC y la otra es retlw k, que además de
hacer la función de return, carga en W el valor inmediato k que contiene. Es
decir que devuelve un parámetro desde la subrutina.
Para el
final de las interrupciones hay otra instrucción cuyo mnemónico es retfie. Esta
instrucción sirve para poner el bit GIE = 1 ya que al atender una interrupción
automáticamente se pone en 0 para evitar que cuando se atiende una interrupción
se produzca otra.
De las
instrucciones especiales tenemos clrwdt y sleep. La primera pone a 0 el
watchdog , es decir lo reinicia. Esta instrucción se debe de poner en ciertos
puntos para evitar el sobre flujo del watchdog y con ello el reset del
microcontrolador.
La
instrucción sleep introduce al procesador en un modo de bajo consumo. Detiene
al oscilador y el procesador queda congelado, no ejecutando instrucciones y
manteniendo el mismo valor en los puertos de I/O
Ver Tabla 7-3
Tabla 7-3
Operaciones Literales y de Control
|
Mnemónicos, Operandos |
Descripción |
Ciclos |
14-Bit Opcode |
|
|
MSb LSb |
||||
|
ADDLW k ANDLW k| CALL k CLRWDT k GOTO k IORLW k MOVLW k RETFIE k RETLW k RETURN SLEEP SUBLW k XORLW k |
Suma inmediata con w AND inmediata con W Llamado a subrutina Limpia watchdog Salto incondicional OR inmediato con W Mueve a w un valor inmediato Retorno de interrupción Retorno subrutina carga w=k Retorno de subrutina Modo de bajo consumo Resta W de un inmediato XOR con W |
1 1 2 1 2 1 1 2 2 2 1 1 1 |
11 111b kkkk kkkk 11 1001 kkkk kkkk 11 0kkk kkkk kkkk 11 0000 kkkk 0100 10 1kkk kkkk kkkk 11 1000 kkkk kkkk 11 00xx kkkk kkkk 00 0000 0000 1001 11 01xx kkkk kkkk 00 0000 0000 1000 00 0000 0110 0011 11 110x kkkk kkkk 11 1010 kkkk kkkk |
|
Objetivo
Controlar un modulo LCD para
visualizar las teclas que se vayan pulsando en un teclado de matriz de 4 x 4.
Desarrollo
Conectar las 8 terminales del
teclado, cuatro para las filas y cuatro para las columnas al puerto B (Ver Figura
G). Hacer mediante software un barrido en las filas de un nivel bajo lógico. Si
existe alguna tecla pulsada en la fila a la que se le introdujo el nivel bajo,
dicho nivel saldara por la columna correspondiente a la que haga contacto. Al
momento de leer las columnas (RB0-RB3) sabremos que tecla a sido pulsada.
Inicializar la pantalla de LCD y
desplegar la tecla que se haya pulsado. (Ver LCD16x2.Pdf)

FIGURA
G
PROGRAMA
7
;***************************************************************************
;*Programa: LCD.asm
;*Descripcion: Control de Pantalla de LCD
;***************************************************************************
;************************ ETIQUETAS **********************
pcl equ 02h ;Contador del programa
resul equ 0ch
tempo1 equ 0dh
temp1 equ 11h
temp2 equ 10h
delay1 equ 12h
delay2 equ 13h
barrido equ 14h
columna equ 15h
tecla_temp equ 16h
fin_reng equ 17h
enter equ 18h
resul_1 equ 19h
offset equ 0eh
opcion equ 81h
porta equ 05h ;puerto a
portb equ 06h ;puerto b
trisa equ 85h ;configuracion
puerto a
trisb equ 86h ;configuracion
puerto b
lcd_var equ 0fh
status equ 03h ;registro de
estado
ram equ 05h ;bit de
seleccion de pagina de memoria
w equ 00h ;bit de
destino a variable W
f equ 01h ;bit de destino a variable F
z equ 2 ;zero
;*********************** PROGRAMA
PRINCIPAL *********************
org 00h
goto inicio
org 05h
inicio
call up_lcd
bsf status,ram
movlw 87h
movwf opcion
bcf status,ram
call lcd_ini
;************************* INICIALIZA LCD ***********
inicio_1 call borra_home
call display_on_cur_off
bsf porta,2 ;ENABLE
movlw 80h
call lcd_reg
clrf offset
call mens
clrf enter
clrf fin_reng
teclado call lectura
movlw 0x00
xorwf enter,w
btfsc status,z
goto borra_mensaje
call convierte
call ascii
call despliega
goto teclado
;************************ L
E C T U R A *******************************************
lectura bsf status,ram ;Entra a modo configuracion
movlw 0x0f ;PB0-PB3
Entradas
movwf trisb ;PB4-PB7
Salidas
bcf opcion,7 ;Habilita Pull-Up en puerto B
bcf status,ram ;Sale de modo configuracion
movlw 4
movwf columna ;Numero de columnas a explorar
movlw 0x7f ;01111111
movwf barrido ;Valor de barrido en renglon
lectura1 movf barrido,w
movwf portb
movf portb,w
movwf tecla_temp ;primer valor de lectura de tecla
subwf barrido,w
btfss status,z ;verifica si esta presionada una tecla
goto lectura2
bsf status,0 ;pone carry
rrf barrido,f ;Rota el barrido de la columna
decfsz columna,f ;Fin de barrido??
goto lectura1 ;No ha terminado barrido
goto teclado ;Regresa a iniciar barrido
;************************ RETARDO
PARA EVITAR REBOTES *******************
lectura2 movlw 100
movwf delay1
lectura3 clrf delay2
clrwdt
lectura4 decfsz delay2,f
goto lectura4
decfsz delay1,f
goto lectura3
return
;************************* CONVIERTE CODIGO DE
TECLADO********************
convierte clrf columna
convierte1 call tabla_tecla ;busca codigo de tecla
subwf tecla_temp,w ;compara
btfsc status,z
goto convierte2 ;si es igual
incf columna ;no es igual, incrementa tabla
goto convierte1
convierte2 movf columna,w
movwf barrido
return
tabla_tecla movf columna,w
addwf pcl,f
retlw 0xed ;0
retlw 0x7e ;1
retlw 0x7d ;2
retlw 0x7b ;3
retlw 0xbe ;4
retlw 0xbd ;5
retlw 0xbb ;6
retlw 0xde ;7
retlw 0xdd ;8
retlw 0xdb ;9
retlw 0xee ;clear
retlw 0xeb ;help
retlw 0xe7 ;enter
retlw 0xd7 ;2nd
retlw 0xb7 ;dwn
retlw 0x77 ;up
;********************* CONVIERTE
CODIGO ASCII ****************************
ascii addwf pcl,1
retlw '0'
retlw '1'
retlw '2'
retlw '3'
retlw '4'
retlw '5'
retlw '6'
retlw '7'
retlw '8'
retlw '9'
retlw 'A'
retlw 'B'
retlw 'C'
retlw 'D'
retlw 'E'
retlw 'F'
;****************** DESPLIEGA
EN PANTALLA ********************************
despliega bsf status,ram
clrf trisb
clrf trisa
bcf status,ram
incf fin_reng
call lcd_dato
movlw 0x20
subwf fin_reng,w
btfsc status,z
call clear_lcd
movlw 0x10
subwf fin_reng,w
btfsc status,z
call second_line
return
;***************** BORRA
MENSAJE PRINCIPAL ******************
borra incf enter
bsf status,ram
clrf trisb
clrf trisa
bcf status,ram
call lcd_delay
call lcd_delay
bcf porta,1
bsf porta,2
movlw 0x01
call lcd_reg
goto teclado
;****************** BORRA
TODA LA PANTALLA *****************
clear_lcd bcf porta,1
bsf porta,2
movlw 0x01
call lcd_reg
clrf fin_reng
return
;****************** MENSAJE
PRINCIPAL ******************
mens clrf resul
mens_1 movf offset,w
addwf resul,w
call datos
iorlw 0
btfsc status,2
return
call lcd_dato
incf resul,f
movlw 0x0A
movwf tempo1
movlw 0x0E
subwf resul,w
btfsc status,2
call second
goto mens_1
second bsf porta,2
movlw 0xC0
call lcd_reg
bsf porta,0
return
borra_h bsf porta,2 ;ENABLE
movlw 01h
call lcd_reg
return
display_on_cur_off bsf porta,2 ;ENABLE
movlw 0Eh
call lcd_reg
return
up_lcd bsf status,ram
clrf trisb
clrf trisa
bcf status,ram
return
lcd_ini bcf porta,0 ;OFF_COMANDO
call lcd_delay
bsf porta,2 ;ENABLE
call lcd_delay
movlw 38h
call lcd_reg
call lcd_delay
bsf porta,2 ;ENABLE
movlw 38h
call lcd_reg
call lcd_delay
bsf
porta,2 ;ENABLE
movlw 38h
call lcd_reg
call lcd_delay
return
;**************** MANDA
DATO A LCD **********************************
lcd_dato bsf porta,0 ;OFF_COMANDO
bsf porta,2
movwf portb
call lcd_delay
call lcd_e
return
;***************** MANDA
COMANDO A LCD ***********************
lcd_reg bsf status,ram
clrf trisb
clrf trisa
bcf status,ram
bcf porta,0 ;OFF_COMANDO
movwf portb
call lcd_delay
call lcd_e
return
lcd_e bcf porta,2 ;DISABLE
return
;***************** DATOS A
DESPLEGAR EN PANTALLA *************
datos
addwf pcl,1
retlw 'U'
retlw 'N'
retlw 'I'
retlw 'V'
retlw 'E'
retlw 'R'
retlw 'S'
retlw 'I'
retlw 'D'
retlw 'A'
retlw 'D'
retlw ' '
retlw 'D'
retlw 'E'
retlw 'L'
retlw 'A'
retlw ' '
retlw 'S'
retlw 'A'
retlw 'L'
retlw 'L'
retlw 'E'
retlw ' '
retlw 'B'
retlw 'A'
retlw 'J'
retlw 'I'
retlw 'O'
retlw 0x00
;******************* RETARDO
DE LCD ***************************
lcd_delay
clrwdt
movlw 0xA0
movwf temp1
clrf temp2
lcd_delay_1 decfsz temp2,f
goto lcd_delay_1
decfsz temp1,f
goto lcd_delay_1
return
end
