You are on page 1of 78

INDICE

CAPTULO 1
1 MICROCONTROLADORES PROGRAMABLES
1.1
QU ES UN MICROCONTROLADOR?
1.2
ARQUITECTURA INTERNA
1.2.1
EL PROCESADOR
1.2.2
MEMORIA DE PROGRAMA
1.2.3
ASIGNACION DE PINES
1.2.4
RECURSOS AUXILIARES
1.3
PRIMER PROGRAMA

MICROCONTROLADORES DE 8 BITS (PIC)


2.1
LA FAMILIA DE LOS PIC
2.1.1 Gama enana: PIC12C(F)XXX
2.1.2 Gama baja: PIC16C5X
2.1.3 Gama media PIC16C(F)XXX
2.1.4 Gama alta: PIC 17CXXX
2.2
SEGUNDO PROGRAMA

CAPITULO 3
3 EL MICROCONTROLADOR PIC16F84
3.1
Caractersticas principales
3.2
Descripcin de pines
3.3
Frecuencia de funcionamiento
3.3.1. Tipos de osciladores
3.4
Reset
3.5
Tercer programa

CAPTULO 4
4 PROCESADOR INTERNO
4.1
Arquitectura Interna
4.2
Memoria de programa
4.3
Memoria de Datos RAM
4.3.1. Direccionamiento de la memoria de datos
4.4
El Registro de Estado
4.5
Cuarto Programa

RECURSOS FUNDAMENTALES
5.1
Temporizador/Contador TMR0
5.1.1
El registro OPTION
5.2
Interrupcin del Timer0.
5.3
WatchDog (WDT)
5.4
Puertos de I/O
5.4.1
PORTA y Registros TRISA
5.4.2
PUERTO B Y REGISTROS TRISB
5.5
Palabra de configuracin
5.6
Memoria EEPROM de datos
5.7
Quinto programa

INTERRUPCIONES, RESET Y RECURSOS AUXILIARES

6.1
Causas de interrupcin
6.1.1
El registro de control de interrupciones INTCON
6.1.2
Interrupcin externa INT
6.1.3
Interrupcin del TMR0
6.1.4
Interrupcin del Puerto B
6.1.5
Interrupcin en la EEPROM de datos
6.2
Reset
6.3
Modo de bajo consumo
6.4
Sexto programa

SET DE INSTRUCCIONES
7.1
RISC
7.2
Tipos de formato
7.2.1
Manejo de registro de tamao byte
7.2.2
Manejo de bits
7.2.3
Manejo de valor inmediato
7.2.5
Salto condicional
7.3
Instrucciones especiales y de control
7.4
Sptimo programa
7.5
PROGRAMADOR

CAPTULO 1
1

MICROCONTROLADORES PROGRAMABLES

1.1

QU ES UN MICROCONTROLADOR?

El microcontrolador es un circuito integrado programable que


contiene perifricos de entrada/salida, memoria. Se utiliza para
controlar diferentes tipos de procesos mediante sensores y
actuadores del dispositivo a controlar.
2

1.2

ARQUITECTURA INTERNA

Las partes principales de un microcontrolador son:


1
2
3
4

1.
Procesador
2.
Memoria no voltil para contener el programa
3.
Memoria de lectura y escritura para guardar los datos
4.
Lneas de I/O para los controladores de los
perifricos
a a) Comunicacin paralelo
b b) Comunicacin serie
5.
Recursos auxiliares
a a) Circuito de reloj
b b) Temporizadores
c c) Watchdog
d d) Convertidores A/D y D/A
e e) Comparadores analgicos
f f) Proteccin para fallos de alimentacin
g g) Estado de bajo consumo

1.2.1

EL PROCESADOR

El procesador del PIC cuenta con tres tcnicas:


- - Arquitectura Harvard
- - Arquitectura RISC
- - Segmentacin
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, mquina pequea y simple, de forma que la mayor
parte de las instrucciones se ejecutan en un ciclo de instruccin.
2

1.2.2

MEMORIA DE PROGRAMA

Existen diferentes
microcontroladores:
- - ROM
- - EPROM
- EEPROM
FLASH

tipos

de

memoria

que

utilizan

los

OTP

El PIC 16C84 y el PIC16F84 utilizan memorias de tipo EEPROM


y FLASH respectivamente.

1.2.3

ASIGNACION DE PINES

En la figura 1.1 se muestra el diagrama del PIC16F84A

Figura 1.1

1.2.4

RECURSOS AUXILIARES

Los recursos ms comunes


microcontrolador son los siguientes:
a
b
c
d
e
f
g

a)
b)
c)
d)
e)
f)
g)

con

los

que

cuenta

Circuito de reloj
Temporizadores
Watch Dog
Convertidores A/D y D/A
Comparadores analgicos
Sistema de proteccin ante fallas de alimentacin
Sistemas de bajo consumo de energa

1.3

Objetivo

PRIMER PROGRAMA

un

Conocer los modos de configuracin 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
leds. Ver Figura A

FIGURA A

PROGRAMA 1
***************************************************************************
;*Programa: luces.asm
;*Descripcion: Manda datos al puerto a y b como un contador binario, ;
;*despus inicia otra secuencia de luces*
;***************************************************************************
;********************************IGUALDADES*********************************
STATUS
estado
PORTB
TRISB
CONTADOR1
CONTADOR2
DATO
CICLO1
CICLO2
w
f

EQU 3

;Direccin del registro de

EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU

;Direccin del puerto B


;Registro de configuracin E/S
;Direccin del conta1 p/retardo
;Direccin del conta2 p/retardo
;Datos a mandar por PORTB
;Indica el fin de luces1
;Indica el fin de luces2
;Destino w
;Destino el propio registro

6
6
0Ch
0Dh
0Eh
0Fh
10h
0
1

;*************************PROGRAMA PRINCIPAL********************************
ORG 00h
;Inicio del ensamblado desde
00
GOTOINICIO
;Salto a la primera instruccin
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
GOTOINICIO2
;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
2

2.1

MICROCONTROLADORES DE 8 BITS (PIC)

LA FAMILIA DE LOS PIC

Microchip cuenta con 4 familias de microcontroladores de 8


bits:

2.1.1 Gama enana: PIC12C(F)XXX

Su principal caracterstica es su reducido tamao. 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.
2.1.2 Gama baja: PIC16C5X

Esta serie de PIC cuenta con un repertorio de 33 instrucciones


cuyo formato consta de 12 bits. Este tipo de microcontrolador no
admite interrupciones.

2.1.3 Gama media PIC16C(F)XXX

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.
2.1.4 Gama alta: PIC 17CXXX

Maneja 58 instrucciones de 16 bits en el repertorio, contiene


variados controladores de perifricos, puertos de comunicacin,
serie y paralelo. La caracterstica ms importante en esta gama es
su arquitectura abierta, por su posibilidad de ampliacin del
microcontrolador con elementos externos.

2.2

SEGUNDO PROGRAMA

Objetivo
Manejar todo el conjunto de instrucciones, disear 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 ctodo comn. 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
GOTODOS
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
W

CINCO
W

SEIS
W

SIETE
W

OCHO
W

NUEVE
W

MOVLW

0X66

;Mueve valor 4 en 7 segment a

MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X6D

;Mueve valor 5 en 7 segment a

MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X7D

;Mueve valor 6 en 7 segment a

MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X07

;Mueve valor 7 en 7 segment a

MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X7F

;Mueve valor 8 en 7 segment a

MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
MOVLW
0X67

;Mueve valor 9 en 7 segment a

MOVWF
PORTB
MOVLW
DELAY
CALL RETARDO
GOTO
INICIO
;******************************SUBRUTINA DE RETARDO
******************************
RETARDO
MOVWF
CONTADOR1
LOOP2
MOVWF
CONTADOR2
LOOP1
DECFSZ
CONTADOR2,f
GOTOLOOP1
DECFSZ
CONTADOR1,f
GOTOLOOP2
RETURN
END

CAPITULO 3

EL MICROCONTROLADOR PIC16F84

3.1

Caractersticas principales

Este microcontrolador es de la familia media. Se utilizara este


microcontrolador debido a que cumple con los requisitos para
aprender a disear proyectos. Al aprender a manejar este sencillo
PIC lograremos programar los de gamas ms altas que cuentan con
mayores recursos.

Caractersticas de alto desempeo:


Solo 35 instrucciones por aprender
Todas las instrucciones se ejecutan en un ciclo de mquina
excepto las de salto que utilizan 2 ciclos.
Velocidad de operacin: DC 20 MHz clock input
DC 200 ns ciclo de instruccin
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> interrupcin en cambio
- Escritura de datos completa en EEPROM
Perifricos:

13 pines de I/O con control de direccin individual


TMR0 temporizador/contador de 8 bits con 8 bits del
prescalador programable.
Corriente de manejo
- Mxima absorbida por lnea 25 mA
- Mxima suministrada por lnea 25 mA
Caractersticas 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
Retencin EEPROM ms de 40 aos
ICSP In-Circuit Serial Programming
(POR) Power-On-Reset, (PWRT) Power-up-Timer, (OST)
Oscillator Start-Up Timer
Whatchdog Timer (WDT)
Proteccin de cdigo
Modo de bajo consumo SLEEP
Oscilador con opcin de seleccin
Tecnologa CMOS FLASH/EEPROM
Bajo consumo, tecnologa de alta velocidad
Rango de operacin de voltaje: 2.0V a 5.5V
2

3.2

Descripcin de pines

VDD: Alimentacin 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 lgico bajo y


reinicia el PIC. Tambin se utiliza durante la grabacin de la
memoria de programa para introducir VPP, que est
comprendida entre 12 y 14 VDC.
RA0 RA4: Puerto A, 5 lneas de I/O. La lnea RA4
multiplexa otra funcin expresada por TOCKI. Esta funcin
sirve para recibir una frecuencia externa para alimentar el
temporizador interno TMR0.
RB0-RB7: Puerto B, 8 lneas de I/O. La lnea RB0
multiplexa otra funcin que sirve como entrada a una peticin
externa de una interrupcin.
3

3.3

Frecuencia de funcionamiento

La frecuencia de trabajo del microcontrolador es un parmetro


fundamental a la hora de establecer la velocidad en la ejecucin de
instrucciones y el consumo de energa.
Cuando un PIC 16X8X funciona a 10Mhz, que es su mxima
frecuencia, le corresponde un ciclo de instruccin de 400ns, puesto
que cada instruccin tarda en ejecutarse 4 periodos de reloj, o sea 4
x 100ns. Todas las instrucciones del PIC se realizan en un ciclo de
instruccin, menos las de salto, que tardan el doble.
Los pulso de reloj de OSC1/CLKIN se dividen entre 4
internamente, dando lugar a las seales Q1, Q2, Q3 y Q4, Durante
un ciclo de instruccin, que comprende las 4 seales mencionadas,
se desarrollan las siguientes operaciones:
Q1: Durante este pulso se incrementa el contador del
programa
Q4: Durante este pulso se busca el cdigo de la instruccin
en la memoria del programa y se carga en el registro de
instrucciones.
Q2-Q3: Durante la activacin de estas dos seales, se
produce la decodificacin de la instruccin.
Para conseguir ejecutar cada instruccin en un ciclo de
instruccin (excepto las de salto), se aplica la tcnica de la

segmentacin <<pipe-line>>, que consiste en realizar en paralelo


las dos fases que comprende cada instruccin.
En realidad cada instruccin se ejecuta en dos ciclos: En el
primero se lleva a cabo la bsqueda del cdigo de la instruccin en
la memoria del programa (fase de bsqueda), y en el segundo se
decodifica y se ejecuta (fase de ejecucin).
La estructura segmentada del procesador, permite realizar al
mismo tiempo la fase de ejecucin de una instruccin y la de
bsqueda de la siguiente. Cuando la instruccin ejecutada
corresponde a un salto no se conoce cul ser la siguiente hasta
que se complete, por eso en esta situacin se sustituye la fase de
bsqueda de la siguiente instruccin por un ciclo <<vaco>>,
originando que las instrucciones de salto tarden en realizarse dos
ciclos de instruccin.

3.3.1. Tipos de osciladores

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
configuracin.

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 cermico.
Oscilador tipo XT
Es un oscilador de cristal para frecuencias estndar
comprendidas entre 100KHz y 4MHz
Oscilador tipo LP
Oscilador de bajo consumo con cristal, diseado 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.
4

3.4

Reset

Cuando se aplica un nivel bajo en el pin MCLR, el


microcontrolador reinicia su estado provocando los acciones
importantes:
1 1. El contador del programa se carga con la direccin 0,
apuntando hacia la primera direccin del programa en donde
deber estar la primera instruccin del programa de
aplicacin.
2 2. La mayora de los registros de estado y control del
procesador toman un estado determinado.

3.5

Tercer programa

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:

T 4 Tosc ValorTMR 0 Variable

FIGURA CPROGRAMA 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 instruccin
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
SEG8

MOVLW
MOVWF
RETURN
MOVLW
MOVWF

0X20
VAR

;Fija en var el retardo para la frec 7

0X40
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

CAPTULO 4
4

4.1

PROCESADOR INTERNO

Arquitectura Interna

Para lograr una compactacin del cdigo ptima y una velocidad


superior, el PIC incorpora en su procesador 3 de las caractersticas
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 1. Memoria de programa EEPROM de 1K x 14 bits.


2 2. Memoria de datos formada por dos reas. Una RAM donde
se alojan 22 registros de propsito especfico Especial
Function Registers (SFR) y 36 de propsito general General
Purpose Registers (GPR) y otra del tipo EEPROM de 64
bytes.
3 3. Bus de datos con una ALU de 8 bits y un registro de trabajo
W
4 4. Recursos conectados al bus de datos tales como puertos
de I/O, temporizador, etc.
5 5. Base de tiempos y circuitos auxiliares.
6 6. Direccionamiento de la memoria de programa en base al
contador de programa ligado al stack de 8 niveles.
7 7. Direccionamiento directo e indirecto de la memoria RAM.

4.2

Memoria de programa

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 direccin 0000h y el vector de interrupcin en la
0004h.

Figura 4.2 Mapa de memoria de programa y stack.

4.3

Memoria de Datos RAM

La memoria de datos se dispone de dos reas diferentes:


1 1. rea de RAM esttica o SRAM, donde reside el banco de
registros especficos (SFR) y el banco de registros de
propsito general (GPR). El primer banco tiene 24 posiciones
de tamao byte, aunque dos de ellas no son operativas, y el
segundo 36.
2 2. rea EEPROM de 64 bytes donde, opcionalmente, se
pueden almacenar datos que no se pierden al desconectar la
alimentacin.

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 estn reservadas al SFR, que son los encargados del
procesador y sus recursos. Algunos de los registros se encuentran
repetidos en la direccin de los dos bancos, para simplificar su
acceso (INDF, ESTADO, FSR, PCLATH e INTCON). La posicin
apuntada por la direccin 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. Despus de un Reset se accede
automticamente 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 estn comprendidas entre el valor 0x0c y Ox2f.
Los registros SFR se clasifican en 2 grupos. En uno se incluye
el ncleo del microcontrolador (ESTADO, OPTION, INTCON, etc.) y
en el otro la operacin de los recursos auxiliares y perifricos. La
figura 4.4 muestra la estructura de estos registros y los valores que
toman despus 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
estn implementados. Las 12 primeras posiciones de cada
banco se reservan a los registros SFR y las 36 restantes a los
registros GPR.

4.3.1. Direccionamiento de la memoria de datos

Direccionamiento Directo
El operando que utiliza la instruccin en curso se referencia
mediante su direccin, que viene incluida en el cdigo de operacin
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
instruccin se utiliza como operando el registro INDF, que ocupa la
direccin 0 de ambos bancos. El registro INDF no est
implementado fsicamente y cuando se le hace referencia, se
accede la direccin 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
posicin. En este modo de direccionamiento el bit IRP = 0 siempre.

Figura 4.5 Direccionamiento directo del PIC16F84

4.4

El Registro de Estado

El registro de estado contiene el estado aritmtico 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 ningn bit del registro de estado.
REGISTRO DE ESTADO

bit 7-6
bit 5
bit 4

bit 3

bit 2

No implementado: Se programa como 0


RP0: Seleccin de banco en direccionamiento directo
01 = Banco 1 (80h FFh)
00 = Banco 0 (00h 7Fh)
TO: Bit Time-out
1 = Despus de energizarlo
o al ejecutarse las
instrucciones CLRWDT y SEP
0 = Cuando termina el tiempo del WDT (Watchdog)
PD: Bit Power-Down
1 = Despus de energizarlo o al ejecutar la instruccin
CLRWDT
0 = Al ejecutar la instruccin SEP
Z: Bit Cero
1 = El resultado de la operacin aritmtica-lgica ha sido

0
bit 1

0 = El resultado de la operacin aritmtica-lgica no es 0


DC: Bit Digito de carry/borrow (instrucciones ADDWF,
ADDLW, SUBLW, SUBWF) (para borrow la polaridad es
al revs)
1 = En el resultado de la instruccin se produjo un carry
en el cuarto bit de menos peso.
0 = No se produjo carry

bit 0

C: Bt carry/borrow (instrucciones ADDWF, ADDLW,


SUBLW, SUBWF) (para borrow la polaridad es al revs)
1 = En el resultado de la instruccin se produjo un carry
en el bit de ms significativo.
0 = No se produjo carry.

4.5

Cuarto Programa

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 sincrona
con el puerto B mandar los datos a desplegar. El barrido se har a
una velocidad en la que el ojo humano perciba que estn
iluminadas todas las columnas. Ver figura D

FIGURA DPROGRAMA 4
;*****************************************************************************
;*Programa: Display 16 x 8
;:Autor: Carlos Alberto Lpez Gonzlez
;*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

MOVWF

PORTB

;Despliega dato al

W
puerto B
MOVLW
0X10
;Carga w con 10
SUBWF
COLUMNA,w
;Posicin 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
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW

PCL
0X00
0X00
0XFF
0X91
0X91
0X91
0XFF
0X00
0X00
0X10
0X18
0X14
0X12
0XFF
0X00
0x00
0X00

ENDCAPTULO

5.1

RECURSOS FUNDAMENTALES

Temporizador/Contador TMR0

Una de las labores ms comunes en los programas de control de


dispositivos, es determinar intervalos concretos de tiempo. El
elemento encargado de realizar esta funcin es el temporizador
TMR0. Tambin 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 acta de dos maneras diferentes:
1.- Como contador de sucesos, que estn 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 interrupcin.
2.- Como temporizador, cuando se carga en el registro que
implementa al recurso un valor inicial, se incrementa con cada ciclo
de instruccin ( Fosc/4) hasta que se desborda, o sea, pasa de FFh
a 00h y avisa fijando a 1 la bandera sealizadora ido provocando
una interrupcin. 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 situacin 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 acta 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 algn 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 duracin 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 frmulas prcticas.
Temporizacin = 4 * TOSC * (Valor cargado en TMT0)* (Prescaler)
Valor a cargar en TMR0 = Temporizacin/4 * TOSC * Prescaler

En cualquier momento se puede leer el valor de TMR0 sin


detener su cuenta. La instruccin adecuada es movf tmr0,w.
1

5.1.1

El registro OPTION

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 asignacin del


prescalador al TMR0 (PSA = 0) o al WDT (PSA = 1).
REGISTRO OPTION

bit 7

RBPU: Bit de habilitacin de Pull-up del puerto B


1 = PORTB Pull-up deshabilitado
0 = PORTB Pull-up habilitado
bit 6
INTEDG: Bit de seleccin de flanco de interrupcin
1 = Interrupcin en flanco negativo
0 = Interrupcin en flanco positivo
bit 5
TOCS: Bit de seleccin de reloj fuente del TMR0
1 = Transicin en el pin RA4/TOCKI
0 = Ciclo de reloj de instruccin interna (CLKOUT)
bit 4
T0SE : Bit de seleccin de flanco del TMR0
1 = Incrementa en transicin negativa en el pin
RA4/TOCKI
0 = Incrementa en transicin positiva en el pin
RA4/TOCKI
bit 3
PSA: Bit de asignacin del prescalador
1 = Prescalador asignado a WDT
0 = Prescalador asignado al Timer0
bit 2-0
PS2:PS0: Bits de seleccin de la taza del prescalador
BIT
Taza TMR0
Taza WDT
000
1:2
1 :1
001
1:4
1:2
010
1:8
1:4
011
1 : 16
1:8
100
1 : 32
1 : 16
101
1 : 64
1 : 32
110
1 : 128
1 : 64
111
1 :256
1 : 128
2
5.2 Interrupcin del Timer0.
La interrupcin del TMR0 es generada cuando se desborda el
registro de FFh a 00h. Este desbordamiento fija el bit T0IF
(INTCON<2>). La interrupcin puede ser enmasacarada limpiando

el T0IE (INTCON<5>). El bit T0IF debe ser limpiado en el programa


por la rutina del servicio de interrupcin, rehabilitando esta
interrupcin.
REGISTRO INTCON

bit 7
bit 6
bit 5
TMR0

1 = Interrupcin habilitada
0 = Interrupcin deshabilitada
INTE: Habilitacin de interrupcin externa RB0/INT
1 = Interrupcin habilitada
0 = Interrupcin deshabilitada
RBIE: Habilitacin de interrupcin de cambio de puerto

bit 4
bit 3
RB

1= Interrupcin habilitada
0 = Interrupcin deshabilitada
T0IF: Bit bandera de interrupcin de desbordamiento
1 = El registro TMR0 se desbord
0 = El registro TMR0 no se ha desbordado
INTF: Bit bandera de interrupcin externa RB0/INT
1 = Ocurri una interrupcin externa
0 = Ningn pin del RB7:RB4 ha cambiado de estado

bit 2
bit1

GIE: Bit de habilitacin de interrupcin global


1 = Habilita todas las interrupciones no enmascaradas
0 = Deshabilita todas las interrupciones
EEIE: Habilitacin de interrupcin de escritura completa
1 = Interrupcin habilitada
0 = Interrupcin deshabilitada
T0IE: Habilita la interrupcin de desbordamiento del

5.3

WatchDog (WDT)

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 configuracin.
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 instruccin clrwdt borra el WDT y reinicia su cuenta. A
diferencia de la instruccin sep, adems 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

5.4

Puertos de I/O

Algunos pines de los puertos de I/O estn multiplexados con


una funcin alterna.
1

5.4.1

PORTA y Registros TRISA

PORTA es un puerto bi-direccional de 5 bits. Su registro de


direccin 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 lneas 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
funcin de I/O con la entrada de reloj para el TMR0.
TABLA 5-1: Funciones Puerto A
Nombre
RA0
RA1
RA2
RA3
RA4/TOCKI

Bit
bit0
bit1
bit2
bit3
bit4

Tipo de Buffer
TTL
TTL
TTL
TTL
ST

Funcin
Entrada/Salida
Entrada/Salida
Entrada/Salida
Entrada/Salida
Entrada/Salida o entrada de reloj
externo para TMR0

TABLA 5-2 Registros asociados con el Puerto A


Direccion
05h
85h

Nombre
PORTA
TRISA

Bit 7
-----

5.4.2

Bit 6
-----

Bit 5 Bit 4
Bit 3
Bit2
--RA4/TOCKI RA3
RA2
--TRISA4
TRISA3 TRISA2

PUERTO B Y REGISTROS TRISB

Bit 1
Bit 0
RA1
RA0
TRISA1 TRISA0

PORTB es un puerto bi-direccional de 8 bits. Su registro de


direccin 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 automticamente cuando
el puerto es configurado como salida y al activar el Reset.
Cuatro pines del puerto B RB7:RB4 tienen la caracterstica de
interrupcin. Solo los pines configurados como entrada pueden
causar esta interrupcin. La interrupcin la podemos ver con la
badera BIRF que se encuentra en el registro INTCON.
TABLA 5-3:

Funciones Puerto B

Nombre
RB0/INT

Bit
bit 0

Tipo de Buffer
TTL/ST

RB1
RB2
RB3
RB4

bit 1
bit 2
bit 3
bit 4

TTL
TTL
TTL
TTL

RB5

bit 5

TTL

RB6

bit 6

TTL/ST

RB7

bit 7

TTL/ST

RB8

bit 8

TTL/ST

Funcin
Pin Entrada/salida o
interrupcin externa
Pin Entrada/salida
Pin Entrada/salida
Pin Entrada/salida
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio
Pin Entrada/salida con
en cambio

entrada de

interrupcin
interrupcin
interrupcin
interrupcin
interrupcin

TABLA 5- 4 Registros asociados con el puerto B


Direcci Nombr
n
e

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

06h

PORTB RB7

86h

TRISB

81h

OPTIO
N
INTCO
N

0Bh,8Bh

5.5

RB0/IN
T
TRISB TRISB TRISB TRISB TRISB TRISB TRISB TRISB0
7
6
5
4
3
2
1
RBPU
GIE

RB6

RB5

RB4

TOIE

RB3

RB2

RB1

TOIF

Palabra de configuracin

Es una posicin reservada de la memoria de programa


situada en la direccin 2007h y accesible nicamente durante el
proceso de grabacin. Al escribirse el programa de la aplicacin es
necesario grabar el contenido de esta posicin de acuerdo con las
caractersticas del sistema. Ver Figura 5.4

Figura 5.4: Palabra de configuracin


Bit 13-4
bit 3
UP
bit 2
bit 1-0

CP: Bit de proteccin de cdigo


1 = Proteccin de cdigo desactivado
0 = Toda la memoria de programa est protegida
PWRTE: Bit de habilitacin del temporizador POWER1 = Deshabilitado
0 = Habilitado
WDTE: Bit de habilitacion del temporizador Watch Dog
1= Habilitado
0 = Deshabilitado
F0SC1:F0SC0: Bits de seleccin del oscilador
11 = Oscilador RC
10 = Oscilador HS
01 = Oscilador XT
00 = Oscilador LP

5.6

Memoria EEPROM de datos

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 alimentacin del sistema.
Soporta 1,000,000 de ciclos de escritura/borrado y es capaz de
guardar la informacin sin alterarla ms de 40 aos.
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 direccin 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 distribucin de sus bits se presenta en la figura
5.5

Figura 5.5 Registro EECON1


bit 7-5
bit 4
bit 3
bit 2

No implementados
EEIF: Bandera de interrupcin de operacin de escritura
1 = Operacin de escritura completa
0 = Operacin de escritura no se ha completado
WRERR: Bandera de error en escritura
1= Operacin de escritura termin antes de tiempo
0= Operacin de escritura completa
WREN: Bit de habilitacin de escritura
1= Permite la escritura de la EEPROM

0= Inhabilita la escritura de la EEPROM


WR: Bit de control de escritura
1= Inicia el ciclo de escritura
0= Ciclo de escritura completo
RD: Bit de control de lectura
1= Inicializa la lectura de la EEPROM
0= No inicializa la lectura de la EEPROM

bit 1
bit 0

Ejemplo para realizar la lectura de una posicin de la


EEPROM de datos.
BCF
MOVLW
MOVWF
BSF
BSF
BCF
MOVF

STATUS,RP0
CONFIG_ADDR
EEADR
STATUS, RP0
EECON1, RD
STATUS, RP0
EEDATA, W

; Banco 0
; Direccin a leer
; Banco 1
; Lectura
; Banco 0
; W = EEDATA

Ejemplo para realizar la escritura de una posicin de la


EEPROM de datos un valor.
BCF
BCF
BSF
MOVLW
MOVWF
MOVLW
MOVWF
BSF
BSF

5.7

Objetivo

STATUS,RP0
INTCON, GIE
EECON1, WREN
55h
EECON2
Aah
EECON2
EECON1, WR
INTCON, GIE

Quinto programa

; Banco 1
;Deshabilita INTs
; Habilita escritura
; Escribe 55h
; Escribe Aah
; Comienza escritura
; Habilita INTs.

Elaborar un contador de 4 dgitos, diseando un circuito que


requiera la menor cantidad posible de componentes.
Desarrollo
Conectar los cuatro dgitos del display en paralelo. Para que no se
encienda sobre los cuatro dgitos el mismo nmero se multiplexa el
encendido por medio de cuatro transistores. Para que el display se
ilumine no solo tiene que haber un uno lgico en el segmento a
encender, sino que tambin se requiere que el transistor este en
conduccin para lograr la activacin del display. Conmutando los
transistores secuencialmente y a velocidad suficiente se logra hacer
parecer al ojo humano que los cuatro displays estn iluminados
simultneamente, cuando en realidad slo 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
fsr
ptoa
ptob
rota
display
trisa
trisb
dig1
dig2
dig3
dig4
loops
loops2
z
ram
memoria
c
w
reset

equ
equ
equ
equ
equ

03h
04h
05h
06h
0fh

;registro de estado
;registro de seleccion
;puerto a
;puerto b
;variable para desplazamiento de

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

85h
86h
10h
11h
12h
13h
1dh
1eh
02h
05h

;configuracion puerto a
;configuracion puerto b
;acumulador miles
;acumulador centenas
;acumulador decenas
;acumulador unidades
;variables usadas en retardos
;Bandera de cero
;bit de seleccion de pagina de

equ
00h
;bandera de acarreo
equ
00h
;bit de destino a variable de trabajo
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

CAPTULO 6
6

6.1

INTERRUPCIONES, RESET Y RECURSOS


AUXILIARES

Causas de interrupcin

El PIC16F84 tiene 4 fuentes de interrupcin:


Interrupcin externa por el pin RB0/INT
Interrupcin de sobreflujo del TMR0
Interrupciones de cambio del puerto B (Pines RB7:RB4)
Interrupcin de fin de escritura de la EEPROM de datos
El registro de control de interrupciones (INTCON) graba las
interrupciones en bits banderas. Cada interrupcin tiene su propia
bandera.
El bit de habilitacin global de interrupciones, GIE habilita o
deshabilita individualmente cada una de las interrupciones a travs
del registro INTCON. (Ver figura 6.1)

GIE
bit 7
bit 0

6.1.1 El registro de control de interrupciones


INTCON

EEIE

TOIE

INTE

RBIE

TOIF

Figura 6.1 Registro INTCON


bit 7

GIE: Habilitacin de interrupciones global


1= Acepta las interrupciones habilitadas

INTF

RBIF

bit 6
EEPROM

0= No acepta ninguna interrupcin


EEIE: Habilita interrupcin de fin de escritura de la
1= Habilita interrupcin
0= Deshabilita interrupcin
TOIE: Habilita interrupcin de sobreflujo del TMR0
1= Habilita interrupcin
0= Deshabilita interrupcin

bit 5

bit 4

INTE: Habilitacin de interrupcin externa pin RB0/INT


1= Habilita interrupcin
0= Deshabilita interrupcin
RBIE: Habilitacin de interrupcin por cambio de estado

bit 3
en

bit 2
bit 1
bit 0

RB7:RB4
1= Habilita interrupcin
0= Deshabilita interrupcin
TOIF: Bandera de sobreflujo del TMR0
1= Sobreflujo en el TMR0
0= TMR0 no se ha tenido sobreflujo
INTF: Bandera de activacin del pin RB0/INT
1= Se activ RB0/INT
0= No se ha activado RB0/INT
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 interrupcin, GIE = 0 y el


contador del programa CP se carga con el valor 0004h que es el
vector de interrupcin. Para saber que tipo de interrupcin fue, se
localiza la bandera que se haya activado en el registro INTCON.
Antes de regresar de una interrupcin al programa, todas las
banderas tienen que fijarse a cero, aunque la interrupcin est
deshabilitada.

6.1.2

Interrupcin externa INT

Esta interrupcin 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 peticin de interrupcin. De forma automtica
el bit INTF1 = 1 y, si el bit de habilitacin INTE =1, se autoriza el
desarrollo de una interrupcin.
3

6.1.3

Interrupcin del TMR0

Cuando existe sobreflujo (FFh 00h) la bandera T0IF se fija a


1. La interrupcin 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 sincronizacin.
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.

T 4 Tosc 256 N div. frecuencia

6.1.4

Interrupcin del Puerto B

Un cambio en la entrada del puerto B 7:4 fijan el bit bandera


RBIF en el registro INTCON. La interrupcin puede ser habilitada o
deshabilitada en el bit RBIE. Esta interrupcin esta diseada
especficamente para detectar cuando se pulsa una tecla
correspondiente a un teclado matricial que se explora mediante 4
lneas de I/O.
5

6.1.5

Interrupcin en la EEPROM de datos

El tiempo tpico que tarda en desarrollarse una operacin 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 interrupcin que se origina al finalizar la
escritura, que fija automticamente la bandera EEIEF a 1 y se
habilita en el bit EEIE.
Durante la escritura de este registro debe prohibirse la
aceptacin de interrupciones para asegurar la operacin de
escritura, para esto se fija el bit GIE = 0.
2

6.2

Reset

El PIC16F84 tiene diferentes formas para la reinicializacin del


sistema:

Conexin de la alimentacin. POR (Power-On Reset)


MCLR durante operacin normal
MCLR durante el modo SEP
Reset WDT (Watch Dog) durante operacin 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 pequeos.
El PWRT activa una salida despus de cierto tiempo de haber
conectado la alimentacin. Este tiempo garantiza la estabilizacin
del voltaje de alimentacin.

Figura 6.2 Diagrama a bloques de los diferentes tipos de Reset


3

6.3

Modo de bajo consumo

Este modo de funcionamiento del PIC, est caracterizado por


el reducido consumo de energa que requiere y se recomienda en
aquellas aplicaciones en las que hay largos periodos en espera de
algn suceso.
Para entrar en el modo de reposo se tiene que ejecutar la
instruccin SLEEP. En este modo el pin TOCK1 se conecta a VDD o
VSS, para eliminar la entrada de pulsos externos al TMR0. El TMR0
tambin se detiene. Los pines de I/O mantienen el estado anterior al
modo de reposo y las que no estn 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
4

6.4

Sexto programa

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 direccin 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 FPROGRAMA 6
;**************************************************************************
;*Programa: pasos.asm
;*Descripcin: 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
ORG
BSF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
BCF
CLRF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
MOVLW
MOVWF
CLRF
GOTO

00h
05h
STATUS,5
0X07
TRISA
0XF0
TRISB
0XD7
TMR_OPT
STATUS,5
PORTB
0X08
REG
0X10
VAR
0X01
MIN
0XFF
MAX
SEG
INICIO

;Fija prescalador

;Determina velocidad
;Velocidad mxima
;Velocidad mnima

;*************************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

7.1

CAPTULO 7
SET DE INSTRUCCIONES

RISC

Los microcontroladores PIC tienen una arquitectura de tipo RISC


(Reduced Instruction Set Computer). sta no implica nicamente
que el nmero de instrucciones mquina que es capaz de
interpretar y ejecutar es pequeo, sino que tiene las siguientes
caractersticas:
Instrucciones simples y rpidas
Instrucciones ortogonales
Longitud de instrucciones y datos constante
2

7.2

Tipos de formato

Las instrucciones del PIC16F84, tienen 14 bits de longitud,


divididos en un cdigo operativo (OPCODE) que especifica el tipo
de instruccin y uno o ms operandos que especifican la operacin
de la instruccin. Ver tabla 7-1
a a) Campo del cdigo OP
Los bits de este campo sirven para definir la operacin que
realiza la instruccin.
b b) Operandos fuente (f) y destino (d)
Estos definen los registros que actan como operandos en la
instruccin. Estos dan una referencia de la direccin que
ocupan en la memoria de datos.
c c) Campo de operando inmediato o literal (k)
Contiene el valor de un operando inmediato.

d d) Campo de referencia a un bit (b)


Es un campo de 3 bits que indica la posicin de un bit dentro
de un registro de 8 bits.
e e) Campo de direccin de salto
En las instrucciones de salto CALL y GOTO hay un campo de
bits que contiene la direccin de la siguiente instruccin 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 segn el tipo
de operacin que desarrollan
1
2
3
4

1) Operaciones que manejan registros de tamao byte


2) Operaciones que manejan bits
3) Operaciones que manejan valores inmediatos
4) Operaciones incondicionales de control de flujo de
programa
5 5) Operaciones de salto condicional
1

7.2.1

Manejo de registro de tamao byte

El formato de las instrucciones orientado a manejar registros


de tamao byte, se divide en tres campos. Ver figura 7.1
1 1. Campo del cdigo OP de 6 bits
2 2. Campo de la direccin del operando fuente (f) de 7
bits
3 3. Campo que define l operando destino (d) de 1 bit
Figura 7.1 Manejo de registro de tamao byte

Todas las instrucciones que tienen este tipo de formato las


podemos encontrar en la tabla 7-1.
TABLA 7-1

emnicos,
erandos

Descripcin

DWF f,d
DWF f,d
RF
f
RW
OMF f,d
CF
f,d
CFSZ f,d
CF
f,d
CFSZ f,d
RWF f,d
OVF f,d
OVWF f,d
OP
F
f,d
RF
f,d
BWF f,d
WAPF f,d
ORWF 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

7.2.2

Ciclos

1
1
1
1
1
1
1(2)
1
1(2)
1
1
1
1
1
1
1
1

14-Bit Opcode
Sealizadores
MSb
00 0111
00 0101
00 0001
00 0001
00 1001
00 0011
00 1011
00 1010
00 1111
00 0100
00 1000
00 0000
00 0000
00 1101
00 1100
00 0010
00 1111
00 0110

LSb
dfff ffff
dfff ffff
1fff ffff
0xxx xxxx
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
0xx0 ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff
dfff ffff

C,DC,Z
Z
Z
Z
Z
Z
Z
Z
Z
C
C
C,DC,Z
Z

Manejo de bits

El formato al que responden las instrucciones de este grupo tiene


tres campos.
1 1. Campo del cdigo OP de 4 bits
2 2. Campo de la direccin del registro fuente
3 3. Campo de la posicin del bit en el registro de 3 bits

En la tabla 7-2 se muestran las instrucciones orientadas a manejar


bits
Tabla 7-2
Ciclos

14-Bit Opcode

emnicos,
erandos

F
F
FSC
FSS

Descripcin
MSb

b,f
b,f
b,f
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

7.2.3

1
1
1(2)
1

01
01
01
01

00bb
01bb
10bb
11bb

LSb
bfff
bfff
bfff
bfff

Manejo de valor inmediato

El formato correspondiente a este grupo de formato solo tiene 2


campos
1 1. Campo del cdigo operativo con 6 bits
2 2. Campo del valor inmediato (k) con 8 bits

k = Valor inmediato de 8 bits


4

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 slo 2 campos:
1 1. Campo del cdigo OP de 3 bits
2 2. Campo de la direccin del salto que se carga en el PC de
11 bits

k = Valor inmediato de 11 bits


5

7.2.5

Salto condicional

ffff
ffff
ffff
ffff

El PIC dispone de algunas instrucciones que comparan, y


cuando se cumple alguna condicin, efectan un salto de
instruccin.
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
1

7.1

SIMBOLO
0xhh
F
D
K
X
()
<>

[]

Nomenclatura y smbolos
SIGNIFICADO
Se usa para referenciar 2 nmeros en hexadecimal hh
Representa la direccin de la memoria RAM de datos
Bit que indica el registro destino. Si d = 0 es W si d = 1
es f
Campo que contiene un valor inmediato. Operando (8
bits) o direccin para el PC (11 bits)
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

7.3

Instrucciones especiales y de control

En este grupo se incluyen las instrucciones que rompen la


secuencia normal del programa porque alteran el contenido del PC
y tambin las instrucciones especiales.
La instruccin de salto condicional goto carga en el PC la
direccin de la nueva instruccin. La instruccin call de llamada a
subrutina, antes de cargar el PC con la direccin de la instruccin a
saltar, guarda la direccin de partida guardando en la parte ms alta
del SP el valor actual de la PC. De esta manera al regresar de la
subrutina, se carga la direccin de regreso al programa principal.
Para regresar de una subrutina existen 2 formas. La ms
comn es return que se limita a regresar cargando el valor del PC y
la otra es retlw k, que adems de hacer la funcin de return, carga
en W el valor inmediato k que contiene. Es decir que devuelve un
parmetro desde la subrutina.
Para el final de las interrupciones hay otra instruccin cuyo
mnemnico es retfie. Esta instruccin sirve para poner el bit GIE = 1
ya que al atender una interrupcin automticamente se pone en 0
para evitar que cuando se atiende una interrupcin se produzca
otra.
De las instrucciones especiales tenemos clrwdt y sleep. La
primera pone a 0 el watchdog , es decir lo reinicia. Esta instruccin
se debe de poner en ciertos puntos para evitar el sobre flujo del
watchdog y con ello el reset del microcontrolador.
La instruccin 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

mnicos,
randos

DLW
DLW
L
RWDT
TO
LW
VLW
TFIE
TLW
TURN
EP
BLW
RLW

k
k|
k
k
k
k
k
k
k
k
k

Descripcin

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 interrupcin
Retorno subrutina carga w=k
Retorno de subrutina
Modo de bajo consumo
Resta W de un inmediato
XOR con W

Ciclos

1
1
2
1
2
1
1
2
2
2
1
1
1

14-Bit Opcode
MSb
11 111b
11 1001
11 0kkk
11 0000
10 1kkk
11 1000
11 00xx
00 0000
11 01xx
00 0000
00 0000
11 110x
11 1010

kkkk
kkkk
kkkk
kkkk
kkkk
kkkk
kkkk
0000
kkkk
0000
0110
kkkk
kkkk

LSb
kkkk
kkkk
kkkk
0100
kkkk
kkkk
kkkk
1001
kkkk
1000
0011
kkkk
kkkk

7.4

Sptimo programa

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 lgico. 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

;*************************
inicio_1
call

INICIALIZA LCD
borra_home

***********

call
bsf
movlw
call
clrf
call
clrf
clrf
teclado
call
movlw
xorwf
btfsc
goto
call
call
call
goto
;************************
lectura
bsf
movlw
movwf
bcf
bcf
movlw
movwf
movlw
movwf
lectura1
movf
movwf
movf
movwf
subwf
btfss
goto
bsf
rrf
decfsz
goto
goto

display_on_cur_off
porta,2
;ENABLE
80h
lcd_reg
offset
mens
enter
fin_reng
lectura
0x00
enter,w
status,z
borra_mensaje
convierte
ascii
despliega
teclado
L E C T U R A *******************************************
status,ram ;Entra a modo configuracion
0x0f
;PB0-PB3 Entradas
trisb
;PB4-PB7 Salidas
opcion,7
;Habilita Pull-Up en puerto B
status,ram ;Sale de modo configuracion
4
columna
;Numero de columnas a explorar
0x7f
;01111111
barrido
;Valor de barrido en renglon
barrido,w
portb
portb,w
tecla_temp ;primer valor de lectura de tecla
barrido,w
status,z
;verifica si esta presionada una tecla
lectura2
status,0
;pone carry
barrido,f
;Rota el barrido de la columna
columna,f ;Fin de barrido??
lectura1
;No ha terminado barrido
teclado
;Regresa a iniciar barrido

;************************
*******************
lectura2
movlw
movwf
lectura3
clrf
clrwdt

RETARDO PARA EVITAR REBOTES


100
delay1
delay2

lectura4

decfsz
goto
decfsz
goto
return

delay2,f
lectura4
delay1,f
lectura3

;*************************
CONVIERTECODIGO 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
addwfpcl,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
call
bsf
call
movlw
call
call
bsf
movlw
call
call
bsf

porta,0
lcd_delay
porta,2
lcd_delay
38h
lcd_reg
lcd_delay
porta,2
38h
lcd_reg
lcd_delay
porta,2

;OFF_COMANDO
;ENABLE

;ENABLE

;ENABLE

movlw
call
call
return

38h
lcd_reg
lcd_delay

;****************
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
addwfpcl,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
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

'D'
'E'
'L'
'A'
''
'S'
'A'
'L'
'L'
'E'
''
'B'
'A'
'J'
'I'
'O'
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

7.5

PROGRAMADOR

***************************

You might also like