Está en la página 1de 30

http://lonely113.blogspot.

com

PIC16F84A
I. CARACTERSTICAS
CPU

Slo 35 instrucciones Assembler.


Instrucciones de 1 ciclo excepto las de salto (2 ciclos).
Entrada de Reloj de hasta 20 MHz.
Memoria de programa de 1024 palabras (14 bit).
68 bytes de RAM de datos.
64 bytes de EEPROM de datos.
15 registros de funcin especial.
8 niveles de Stack.
Direccionamiento directo, indirecto y relativo.
4 fuentes de interrupcin.
o
o
o
o

Externo por el pin RB0/INT.


Desbordamiento de timer TMR0.
Externo por cambio en los pines RB4-RB7.
Escritura de EEPROM completa.

Perifricos

13 pines I/O con control de direccin individual.


Corriente alta para control directo de LEDs.
o Mx. 25mA como fuente.
o Mx. 25mA como sumidero.

TMR0: Contador de 8 bits configurable.

Microcontrolador

10000 ciclos de Lectura/Escritura de memora Flash de programa.


10000000 ciclos de Lectura/escritura de memoria EEPROM de datos.
Retencin de datos de EEPROM > 40 aos.
In Circuit Serial Programming (ICSP).
Watchdog Timer con su propio oscilador RC.
Proteccin de cdigo.
Modo SLEEP de ahorro de energa.
Opcin de seleccin de tipo de oscilador.

http://lonely113.blogspot.com

II. DIAGRAMA DE BLOQUES

http://lonely113.blogspot.com

III. PINES

Nombre de Pin
OSC1/CLKIN
OSC2/CLKOUT

RA0
RA1
RA2
RA3
RA4/T0CKI
RB0/INT
RB1
RB2
RB3
RB4
RB5
RB6
RB7
VSS
VDD

Pin N
16
15
4
17
18
1
2
3
6
7
8
9
10
11
12
13
5
14

Descripcin
Entrada de oscilador de Cristal externo.
Salida de oscilador.
Master Clear.
Entrada de Voltaje de Programacin.
PORTA. Puerto I/O bidireccional de 5 bit.

RA4/T0CKI: Entrada de reloj para timer TMR0.


RB0/INT: Entrada de Interrupcin externa.
PORTB. Puerto I/O bidireccional de 8 bit.
Puede ser configurado con resistores Pull-up.
RB4-RB0: entradas de interrupcin externa.
RB6: Entrada de RELOJ en programacin serial.
RB7: Entrada de datos en programacin serial.
GND
Voltaje de alimentacin.

http://lonely113.blogspot.com

IV. ORGANIZACIN DE MEMORIA DE PROGRAMA

Contador de Programa de 13 bit.


Stack de 8 niveles.
Memoria de programa implementado fsicamente hasta la direccin 3FFh.
Vector RESET en direccin 0000h (Direccin de Inicio de programa).
Vector de Interrupcin en direccin 0004h (Direccin de inicio de rutina de
interrupcin).

http://lonely113.blogspot.com

V. ORGANIZACIN DE MEMORIA DE DATOS

Memoria de datos dividido en 2 bancos (Banco 0 y Banco 1).


Las primeras 12 localizaciones estn reservadas para los Registros de Funcin
Especial. Controlan el funcionamiento del PIC.
El resto de localizaciones corresponde a los Registros de Propsito General.

http://lonely113.blogspot.com

A. Registros de Propsito General

68 registros SRAM a partir de la direccin 0Ch hasta la direccin 7Fh (Banco 0).
Las direcciones 8Ch CFh (Banco 1) apuntan a los mismos registros del Banco 0.
Por ejemplo: Apuntar a la direccin 8Ch es igual que apuntar a la direccin 0Ch.
Direcciones 50h a 7Fh no implementadas fsicamente.

B. Registros de Propsito Especial


1. Registro STATUS (0x03h y 0x83h)
Contiene el estado aritmtico del ALU, el estado del RESET y el bit de seleccin
de Banco para la memoria de datos.
R/W
IRP
7

R/W
RP1
6

R/W
RP0
5

R
4

R
3

R/W
Z
2

R/W
DC
1

R/W
C
0

IRP: No implementado. Mantener en 0.


RP1: No implementado. Mantener en 0.
RP0: Bit de seleccin de Banco de registros.
0: Banco 0.
1: Banco 1.
TO (Flag): Time-out
0: Tras conectar la alimentacin, luego de instrucciones CLRWDT o SLEEP.
1: Por desbordamiento del Watchdog timer WDT.
PD (Flag): Power down (Apagado)
0: tras conectar la alimentacin o luego de ejecutar la instruccin CLRWDT.
1: Al ejecutar el comando SLEEP.
Z (Flag): Cero
0: El resultado de una operacin aritmtica o lgica no es 0.
1: El resultado de una operacin aritmtica o lgica es 0.
DC (Flag): Digit Carry.
0: No hay acarreo en el cuarto bit de menor peso.
1: Acarreo en el cuarto bit de menor peso.
Importante en operaciones BCD.
C (Flag): Acarreo
0: No hay acarreo en el bit ms significativo.
1: Acarreo en el bit ms significativo.

http://lonely113.blogspot.com

2. Registro OPTION (0x81h)


Registro de Lectura/Escritura.
R/W
RBPU
7

R/W
INTEDG
6

R/W
T0CS
5

R/W
T0SE
4

R/W
PSA
3

R/W
PS2
2

R/W
PS1
1

RBPU: Habilitacin de resistores Pull-up en el puerto B.


0: Pull-up deshabilitado.
1: Pull-up habilitado.
INTEDG: Seleccin de flanco de interrupcin para el pin RB0/INT.
0: Interrupcin en flanco de bajada.
1: Interrupcin en flanco de subida.
T0CS: Seleccin de fuente de reloj para TMR0.
0: Reloj interno de instruccin (Fosc/4).
1: Transicin en el pin RA4/T0CKI.
T0SE: Tipo de flanco del pin RA4/T0CKI para incrementar TMR0.
0: Flanco de subida.
1: Flanco de bajada.
PSA: Asignacin del divisor de frecuencia.
0: El divisor de frecuencia se asigna a WDT.
1: El divisor de frecuencia se asigna a TMR0.
PS2-PS0: Razn de divisin:
PS2-PS1-PS0
000
001
010
011
100
101
110
111

Razn TMR0
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256

Razn WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128

R/W
PS0
0

http://lonely113.blogspot.com

3. Registro INTCON (0x0Bh)


Registro de Lectura/Escritura para control de todas las fuentes de
interrupciones.
R/W
GIE
7

R/W
EEIE
6

R/W
T0IE
5

R/W
INTE
4

R/W
RBIE
3

R/W
T0IF
2

R/W
INTF
1

R/W
RBIF
0

GIE: Habilitacin global de interrupciones.


0: Todas las interrupciones deshabilitadas.
1: Todas las interrupciones habilitadas.
EEIE: Habilitacin de interrupciones de escritura completa de EEPROM.
0: Interrupciones deshabilitadas.
1: Interrupciones habilitadas.
T0IE: Habilitacin de interrupcin de desbordamiento de TMR0.
0: Interrupciones deshabilitadas
1: Interrupciones habilitadas.
INTE: Habilitacin de interrupciones por RB0/INT.
0: Interrupciones deshabilitadas
1: Interrupciones Habilitadas.
RBIE: Habilitacin de interrupciones por cambio en los pines RB4-RB7.
0: Interrupciones deshabilitadas.
1: Interrupciones habilitadas.
T0IF (Flag): Interrupcin por desbordamiento de TMR0.
0: TMR0 no se ha desbordado.
1: TMR0 se ha desbordado (Debe ser borrado por software).
INTF (Flag): Interrupcin por RB0/INT.
0: No ha ocurrido interrupcin por RB0/INT.
1: Ha ocurrido interrupcin por RB0/INT (Debe ser borrado por software).
RBIF (Flag): Interrupcin por cambio en los pines RB4-RB7.
0: Ningn pin de RB4-RB7 ha cambiado.
1: Al menos un pin de RB4-RB7 ha cambiado (Se borra por software).
4. Registros PCL (0x02h) y PCLATH (0Ah)
El contador de programa (PC) tiene una longitud de 13 bits. El byte menos
significativo es denominado registro PCL y es un registro de lectura/escritura. El
grupo de bits ms significativos del PC (bits 9-13) se denomina registro PCH.
Este registro no se puede leer ni escribir directamente.
Todos los cambios del registro PCH pasan a travs del registro PCLATH.

http://lonely113.blogspot.com

5. Registros INDF (0x00h) y FSR (0x04h)


Registros utilizados para
implementado fsicamente.

direccionamiento

indirecto.

INDF

no

est

6. Registro TMR0 (0x01h)


Registro que almacena el valor del contador TMR0 (Timer 0).
7. Registro EEDATA (0x08h)
Guarda el contenido de una direccin de la memoria EEPROM antes de su
escritura o despus de su lectura. La memoria EEPROM tarda aproximadamente
10 ms en completar un ciclo de lectura o escritura.
8. Registro EEADR (0x09h)
Guarda la direccin de la memoria EEPROM que se quiere escribir o leer. Puede
direccionar 256 bytes, pero slo los primeros 64 bytes estn disponibles en la
EEPROM.
9. Registro EECON1 (0x88h)
R/W
EEIF
4

R/W
WRERR
3

R/W
WREN
2

R
WR
1

R
RD
0

EEIF (Flag): Interrupcin de escritura de la memoria EEPROM.


0: No se ha completado la escritura.
1: Se ha completado la escritura (Se debe borrar por software).
WRERR (Flag): Error de escritura.
0: Se ha completado la operacin de escritura sin error.
1: Se ha producido un error de escritura (MCLR o WDT reset).
WREN: Habilitacin de escritura.
0: Escritura de EEPROM deshabilitada.
1: Escritura de EEPROM habilitada.
WR: Control de escritura.
0: Se ha completado la escritura un dato.
1: Inicio de escritura de dato en EEPROM (Se borra automticamente).
WD: Control de lectura.
0: No se ha iniciado la lectura de un dato.
1: Inicio de lectura de un dato de EEPROM (Se borra automticamente).

http://lonely113.blogspot.com

10. Registro EECON2 (0x89h)


No implementado fsicamente. Se utiliza como dispositivo de seguridad durante
la escritura de la memoria EEPROM.
11. Registros PORTA (0x05h) y TRISA (0x85h)
PORTA es un puerto I/O bidireccional de 5 bit. El registro correspondiente de
configuracin de direccin es TRISA.
PORTA
RA4
4

RA3
3

RA2
2

RA1
1

RA0
0

TRISA4
4

TRISA3
3

TRISA2
2

TRISA1
1

TRISA0
0

TRISA

TRISAX=0: RAX como salida.


TRISAX=1: RAX como entrada.
Cuando se utiliza el Pin RA4/T0CKI como entrada de pulsos de reloj el bit
TRISB4 de ponerse a 1 (RA4/T0CKI como entrada).
12. Registros PORTB (0x06h) y TRISB (0x86h)
PORTB es un puerto I/O bidireccional de 8 bit. Dispone de resistencias Pull-up
que se pueden habilitar o deshabilitar. El registro correspondiente de
configuracin de direccin es TRISB.
PORTB
RB7
7

RB6
6

RB5
5

RB4
4

RB3
3

RB2
2

RB1
1

RB0
0

TRISB
TRISB7
7

TRISB6
6

TRISB5
5

TRISB4
4

TRISB3
3

TRISB2
2

TRISB1
1

TRISB0
0

TRISBX=0: RBX como salida.


TRISBX=1: RBX como entrada.
Cuando se utilizan los pines de interrupcin stos deben configurarse como
entradas.

http://lonely113.blogspot.com

VI. JUEGO DE INSTRUCCIONES


1. Orientadas a Registros (18 instrucciones)
Nemnico,
operandos
ADDWF
f,d
ANDWF
f,d
CLRF
f
CLRW
COMF
f,d
DECF
f,d
DECFSZ
f,d
INCF
INCFSZ

f,d
f,d

IORWF
MOVF
MOVWF
NOP
RLF
RRF
SUBWF
SWAPF
XORWF

f,d
f,d
f
f,d
f,d
f,d
f,d
f,d

Descripcin

Flags

Ciclos

Sumar W y f.
AND entre W y f.
Borrar f.
Borrar W.
Complemento bit a bit de f.
Disminuir f en 1.
Disminuir f en 1. Saltar la siguiente instruccin si el
resultado es 0.
Incrementar f en 1.
Incrementar f en 1. Saltar la siguiente instruccin si
el resultado es 0.
OR inclusivo entre W y f.
Mover (copiar) f.
Mover (copiar) W a f.
No realizar ninguna operacin.
Rotar f a la izquierda. Incluye bit Carry.
Rotar f a la derecha. Incluye bit Carry.
Restar W de f.
Intercambio de nibles en f.
OR exclusivo entre W y f.

C, DC, Z
Z
Z
Z
Z
Z

1
1
1
1
1
1
1(2)

1
1(2)

Z
Z

1
1
1
1
1
1
1
1
1

Flags

Ciclos

C
C
C, DC, Z

2. Orientadas a Bit (4 instrucciones)


Nemnico,
operandos
BCF
f,b
BSF
f,b
BTFSC
f,b
BTFSS
f,b

Descripcin
Poner bit a 0.
Poner bit a 1.
Verificar bit. Saltar la siguiente instruccin si es 0.
Verificar bit. Saltar la siguiente instruccin si es 1.

1
1
1(2)
1(2)

http://lonely113.blogspot.com

3. Operaciones con literales y de control (13 instrucciones)


Nemnico,
operandos
ADDLW
k
ANDLW
k
CALL
k
CLRWDT
GOTO
k
IORLW
k
MOVLW
k
RETFIE
RETLW
k
RETURN
SLEEP
SUBLW
k
XORLW
k

Descripcin
Sumar W y literal. Guarda en W.
AND entre W y literal. Guarda en W.
Llamada a subrutina.
Borrar Watchdog timer.
Ir a direccin.
OR inclusivo entre W y literal. Guarda en W.
Mover literal a W.
Retorno de interrupcin.
Retorno de subrutina con carga de literal en W.
Retorno de subrutina.
Entrar en modo de espera.
Restar W de literal. Guarda en W.
OR exclusivo entre W y literal. Guarda en W.

Flags

Ciclos

C, DC, Z
Z

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

,
Z

,
C, DC, Z
Z

Donde:
f: Direccin de registro de memoria de datos.
d: Ubicacin donde se guardar en resultado de una operacin.
d=0: El resultado se guarda en el registro W.
d=1: El resultado de guarda en la direccin f de la memoria de datos.
k: Literal.
b: Bit de registro (0 - 7)

http://lonely113.blogspot.com

VII. PROGRAMACION ASSEMBLER


a) Directivas para el ensamblador
Los siguientes cdigos son directivas para el ensamblador. No tienen traduccin al
lenguaje de mquina.

Directiva EQU
La directiva EQUivalent permite definir direcciones o valores literales
igualndolos con nombres descriptivos de la funcin que realizarn.

STATUS

equ

0x03

PORTA

equ

0x05

TEMP

equ

0x0C

TIME

equ

0x0A

;
;
;
;
;
;
;

Define STATUS igualndolo con la


direccion 03h (Registro STATUS).
Define PORTA que igualandolo con la
direccion 05h (Puerto A).
Define un registro TEMP en la
direccion 0Ch.
Asigna el nombre TIME al literal 0Ah.

Directiva ORG
Indica al compilador a partir de qu posicin de memoria se situarn las
instrucciones que le siguen a esta directiva en la memoria de programa.

ORG

0x00

ORG

0x04

;
;
;
;
;

El codigo que sigue comenzara en la


direccion 00h en la memoria de programa.
El codigo que le sigue debe ser la rutina
de interrupcin, pues el vector de
interrupcion se ubica en la direccion 04h.

Directiva END
Indica al compilador el final programa. Debe situarse al final de todo el
programa.
ORG
;
;
END

0x00

; Inicio de programa

; Fin de programa

Directiva LIST
Indica al ensamblador el tipo de dispositivo con el que se est trabajando.
LIST

P=16f84a

http://lonely113.blogspot.com

Directiva INCLUDE
Sirve para incluir libreras existentes que se usarn a la hora de compilar el
programa.
INCLUDE

p16f84a.inc

Esta directiva incluye el fichero p16f84a.inc que contiene definiciones de


registros de propsito especial y sus bits as como bits de configuracin.
;------Register Definitions------W
EQU
H'0000'
F
EQU
H'0001'
;----- Register Files------------INDF
EQU
H'0000'
TMR0
EQU
H'0001'
PCL
EQU
H'0002'
STATUS
EQU
H'0003'
FSR
EQU
H'0004'
PORTA
EQU
H'0005'
PORTB
EQU
H'0006'
EEDATA
EQU
H'0008'
EEADR
EQU
H'0009'
PCLATH
EQU
H'000A'
INTCON
EQU
H'000B'
OPTION_REG
EQU
H'0081'
TRISA
EQU
H'0085'
TRISB
EQU
H'0086'
EECON1
EQU
H'0088'
EECON2
EQU
H'0089'
;----- STATUS Bits --------------IRP
EQU
H'0007'
RP1
EQU
H'0006'
RP0
EQU
H'0005'
NOT_TO
EQU
H'0004'
NOT_PD
EQU
H'0003'
Z
EQU
H'0002'
DC
EQU
H'0001'
C
EQU
H'0000'
;----- INTCON Bits -------------GIE
EQU
H'0007'
EEIE
EQU
H'0006'
T0IE
EQU
H'0005'
INTE
EQU
H'0004'
RBIE
EQU
H'0003'
T0IF
EQU
H'0002'
INTF
EQU
H'0001'
RBIF
EQU
H'0000'

;----- OPTION_REG Bits ---------NOT_RBPU


EQU
H'0007'
INTEDG
EQU
H'0006'
T0CS
EQU
H'0005'
T0SE
EQU
H'0004'
PSA
EQU
H'0003'
PS2
EQU
H'0002'
PS1
EQU
H'0001'
PS0
EQU
H'0000'
;----- EECON1 Bits -------------EEIF
EQU
H'0004'
WRERR
EQU
H'0003'
WREN
EQU
H'0002'
WR
EQU
H'0001'
RD
EQU
H'0000'
;-------RAM Definition-----------__MAXRAM H'CF'
__BADRAM H'07', H'50'-H'7F', H'87'
;---------Configuration Bits----_CP_ON
EQU
H'000F'
_CP_OFF
EQU
H'3FFF'
_PWRTE_ON
EQU
H'3FF7'
_PWRTE_OFF
EQU
H'3FFF'
_WDT_ON
EQU
H'3FFF'
_WDT_OFF
EQU
H'3FFB'
_LP_OSC
EQU
H'3FFC'
_XT_OSC
EQU
H'3FFD'
_HS_OSC
EQU
H'3FFE'
_RC_OSC
EQU
H'3FFF'

Si se desea se puede crear un fichero *.INC que contenga definiciones o


subrutinas para importarlo a programas que los requieran y as ahorrar
tiempo.

http://lonely113.blogspot.com

b) Uso de Comentarios
Escribir ; al inicio de cada lnea de comentario en el programa. Todo lo que se
escriba a la derecha del ; hasta el final de lnea ser ignorado por el
ensamblador.
movlw
movwf
call
movlw
movwf

0x05
PORTA
DELAY
0x06
PORTB

;Mover 5h a W.
;Mover W al puerto A.
;Llamada a subrutina DELAY
;Mover 6h a W
;Mover W al Puerto B.

Es conveniente insertar una cabecera al inicio de cada programa con informacin


del autor y el funcionamiento.
;-------------------------------------;Autor:
;Fecha:
;Titulo:
;Descripcion:
;--------------------------------------

c) Etiquetas (Label)
Se sitan a la izquierda de las instrucciones y sirven para identificar con facilidad
un segmento del cdigo o nombrar una subrutina. El compilador relaciona la
etiqueta con la direccin de la instruccin que est a su derecha. Se utiliza
principalmente para realizar saltos o llamar a subrutinas.
LABEL

movlw
movwf
call
movwf
goto

0x05
PORTA
MOVER
PORTB
BEGIN

movlw
return

0xFF

;Llamada a subrutina MOVER

; Salta a la instruccion
; identificada con LABEL
;--------------------------------------------------------------;Subrutinas
MOVER

end

http://lonely113.blogspot.com

d) Instrucciones
1) MOVLW, ADDLW, SUBLW
Instrucciones de operaciones aritmticas entre el registro W y literales.
org
movlw
addlw
sublw

0x00
0x0C
0x03
0x1F

;
;
;
;

Mover literal 0Ch al registro W


Sumar 03h al registro W
Sustraer W de 1Fh
El resultado final es 10h en W

end

Dependiendo del resultado de estas operaciones los flags C, Z y DC podran


activarse.
2) ANDLW, IORLW, XORLW
Instrucciones de operaciones lgicas entre el registro W y literales.
org
movlw
andlw
iorlw
xorlw

0x00
0x11
0x10
0x0F
0x10

;
;
;
;
;

Mover literal 11h al registro W


AND entre W y 10h bit a bit
OR entre W y 0Fh bit a bit
XOR entre W y 10h bit a bit
El resultado final es 0Fh en W

end

El resultado de estas operaciones puede hacer que el flag de cero Z se active.


3) MOVF, MOVWF, ADDWF, SUBWF
Instrucciones de operaciones aritmticas entre W y la memoria de datos.
REG1

equ

0x0D

org
movlw
movwf
movlw
addwf

0x00
0x0F
0x0C
0x10
0x0C,1

movf

0x0C,0

movwf REG1

;
;
;
;
;
;
;
;
;
;
;

Mover literal 0Fh al registro W


Mover W a la direccion 0Ch.
Mover 10h a W
Sumar W con el dato en la
direccion 0Ch. Guardar en
direccion 0Ch.
Mover el dato en direccion 0Ch.
a W.
Mover W a REG1 (direccion 0Dh)
El resultado final es 1Fh en
REG1 (direccion 0Dh)

end

Dependiendo del resultado de estas operaciones los flags C, Z y DC podran


activarse.

http://lonely113.blogspot.com

4) ANDWF, IORWF, XORWF, COMF, SWAPF


Instrucciones de operaciones lgicas entre W y la memoria de datos.
REG1

equ

0x0D

org
movlw
movwf
movlw
iorwf

0x00
0x08
REG1
0x07
REG1,1

comf

REG1,1

swapf REG1,0

;
;
;
;
;
;
;
;
;
;

Mover literal 08h al registro W


Mover W a la direccion 0Ch.
Mover 07h a W.
OR entre W y REG1. Guardar en
REG1
Complementa los bits de REG1
Guardar en REG1
Intercambio de nibles de REG1
Guardar en W
El resultado final es 0Fh en W

end

El resultado de estas operaciones puede hacer que el flag de cero Z se active,


menos la instruccin SWAPF.
5) CLRW, CLRF, CLRWDT
CLRW: Borra el registro W
CLRF: Borra una direccin de la memoria de datos.
CLRWDT: Reinicia el contador del WDT (Watchdog timer)
REG1

equ

0x0D

org
movlw
movwf
clrw
clrf

0x00
0x0F
REG1
REG1

;
;
;
;
;

Mover literal 0Fh al registro W


Mover W a la direccion 0Ch.
Borra W
Borra REG1
W y REG1 finalmente con 00h.

end

CLRW y CLRF hacen que el flag Z se active. CLRWT hace que los flags TO y PD
se activen (activos en bajo).

http://lonely113.blogspot.com

6) DECF, INCF
DECF: Disminuye en 1 el dato en una direccin de la memoria de datos.
INCF: Incrementa en 1 el dato en una direccin de la memoria de datos.
REG1

equ

0x0D

org
movlw
movwf
incf

0x00
0x01
REG1
REG1,1

incf
decf

REG1,1
REG1,0

;
;
;
;

Mover literal 01h al registro W


Mover W a la direccion 0Ch.
Incrementar REG1 en 1
Guardar en REG1

; Disminuir REG1 en 1
; Guardar en W
; W queda finalmente con 02h.

end

El resultado de estas operaciones puede hacer que el flag de cero Z se active.


7) DECFSZ, INCFSZ
De manera similar a las instrucciones anteriores, la diferencia es que saltan la
siguiente instruccin si se activa el flag Z (Si el resultado de ejecutar la
instruccin es 0).

REG1

equ

0x0D

org
movlw
movwf
decfsz
movlw

0x00
0x01
REG1
REG1,0
0xFF

nop

;
;
;
;
;
;
;
;

Mover literal 01h al registro W


Mover W a REG1
Disminuir REG en 1. Guardar en W
No se ejecuta esta instruccin
porque la operacion anterior
hace que Z se active
No realizar operacin
El resultado final es 00h en W

end

El resultado de la instruccin INCFSZ ser 0 cuando se incremente 1 a FFh.

http://lonely113.blogspot.com

8) BCF, BSF
BCF: Poner a 0 un bit de un registro.
BSF: Poner a 1 un bit de un registro.
REG1

equ

0x0D

org
movlw
movwf
bcf
bsf

0x00
0x01
REG1
REG1,0
REG1,4

;
;
;
;
;

Mover literal 01h al registro W


Mover W a REG1
Pone a 0 Bit 0 de REG1
Pone a 1 Bit 1 de REG1
Resultado final es 10h en REG1

end

9) RLF, RRF
Rotar bits a la izquierda o a la derecha respectivamente. Incluyen el estado
actual del bit carry C en la rotacin.

REG1
equ
STATUS equ

0x0D
0x03

org
movlw
movwf
bcf
rlf

0x00
0x01
REG1
STATUS,0
REG1,1

rlf

REG1,1

rrf

REG1,0

end

;
;
;
;
;
;
;

Mover literal 01h al registro W


Mover W a REG1
Pone a 0 Bit de carry C.
Rotar a la izquierda
Guardar en REG1
Rotar a la izquierda
Guardar en REG1

; Rotar a la derecha
; Guardar en W
; El resultado final es 02h en W

http://lonely113.blogspot.com

10) BTFSC, BTFSS


BTFSC: Verificar bit de registro, saltar la siguiente instruccin si es 0.
BTFSS: Verificar bit de registro, saltar la siguiente instruccin si es 1.
REG1

equ

0x0D

org
movlw
movwf
btfsc
movlw
btfss
movlw

0x00
0x0F
REG1
REG1,4
0xCC
REG1,7
0xF0

;
;
;
;
;
;
;

Mover literal 0Fh al registro W


Mover W a REG1
Verifica Bit 4 de REG1
No se ejecuta
Verifica bit 7 de REG1
Se ejecuta
El resultado final es F0h en W

end

11) GOTO, CALL


GOTO: Instruccin de salto incondicional sin retorno. Carga en el PC la
direccin que se encuentra a su derecha.
CALL: Llamada a subrutina con retorno. Carga en el PC la direccin que se
encuentra a su derecha y guarda en el Stack la direccin de retorno de
subrutina.
La instruccin de retorno es RETURN que carga en el PC la direccin de retorno
almacenada en el Stack.
12) RETURN, RETLW, RETFIE
RETURN: Retorno de subrutina. Carga la direccin de retorno del Stack al PC.
RETLW
k: Retorno de subrutina. Carga la direccin de retorno del Stack al
PC y carga el literal k al registro W.
RETFIE: Retorno de rutina de interrupcin. Carga la direccin de retorno del
Stack al PC y pone a 1 el bit GIE (Habilitacin global de interrupciones) del
registro INTCON.
Este grupo de instrucciones y las anteriores se explicarn con mayor detalle en
la siguiente seccin.

http://lonely113.blogspot.com

e) Establecimiento de direccin de puertos I/O


Configuracin del modo de operacin de los puertos I/O (como salidas o
entradas). Es posible configurarlos pin a pin. En el siguiente ejemplo se muestra la
manera de hacerlo:
; Se asume que se incluye el fichero p16f84a.inc
org
bsf
movlw
movwf

0x00
STATUS,5
0x03
TRISA

movlw 0xF0
movwf TRISB

Bcf

STATUS,5

;
;
;
;
;
;
;
;
;
;

Cambio al banco 1
b00000011 a W
b00000011 al registro TRISA
RA0 y RA1 como entradas
RA2-RA4 como salidas
b11110000 a W
b11110000 al registro TRISB
RB0-RA3 como salidas
RB4-RB7 como entradas
Volver al banco 0

; Continua el programa

f) Estructura bsica de un programa


;-----------------------------------------------------------;Autor:
;Fecha:
;Titulo:
;Descripcion:
;-----------------------------------------------------------#INCLUDE
LIST

p16f84a.inc ; Usar la fichero de definiciones


P=16f84a
; PIC16F84A

;-----------------------------------------------------------; Definiciones del usuario


;-----------------------------------------------------------ORG

0x00

; Inicio de programa

;-----------------------------------------------------------; Modo de operacion de puertos I/O, interrupciones


;-----------------------------------------------------------;-----------------------------------------------------------; Codigo del programa
;-----------------------------------------------------------;-----------------------------------------------------------;Subrutinas
;-----------------------------------------------------------END

; Fin de programa

http://lonely113.blogspot.com

VIII. RUTINAS BASICAS


a) Puertos
Para leer o escribir en los puertos I/O primero se debe configurar los mismos
como entradas o salidas en los registros TRISA y TRISB (revisar el apartado
anterior). Luego se esto los registros PORTA y PORTB sern tratados como
cualquier otro registro.
El siguiente ejemplo lee el puerto A (entrada) y muestra el estado de los 4
primeros bit (RA3-RA0) en los 4 primeros bit del puerto B (RB3-RB0). Se podra
conectar Leds en el puerto B para observar el comportamiento.
INCLUDE
LIST
org
bsf
movlw
movwf
movlw
movwf
bcf
BEGIN: movf

p16f84a.inc
p=16f84a
0x00
STATUS,5
;
0x1F
;
TRISA
;
0xF0
;
TRISB
;
;
STATUS,5
;
PORTA,0
;

andlw 0x0F
movwf PORTB
goto
end

BEGIN

;
;
;
;
;
;

Cambio al banco 1
b00011111 a W
PORTA como entrada
b11110000 a W
RB0-RA3 como salidas
RB4-RB7 como entradas
Volver al banco 0
Leer PORTA y mover a W
AND entre W y literal. Borra el
nible superior. Guarda en W
Mover W a PORTB. Se escribe en
el nible inferior (Salidas).
Bucle infinito
Fin de programa

b) Bucles de retardo
El PIC ejecuta las instrucciones a muy alta frecuencia. En algunos casos es
necesario retrasar la ejecucin de ciertas instrucciones para poder observar los
cambios en los Pines de salida.
Por ejemplo, si necesitramos un oscilador conectado a un Led la frecuencia de
oscilacin estara sujeta a la frecuencia del Cristal (ciclo de instruccin=fosc/4).
#INCLUDE

p16f84a.inc

LIST

p=16f84a
0x00
STATUS,5
TRISA
STATUS,5
PORTA
PORTA,0

org
bsf
clrf
Bcf
clrf
BEGIN: bsf
nop
bcf
goto
End

PORTA,0
BEGIN

;
;
;
;
;
;
;
;
;

Cambio al banco 1
PORTA como salida
Volver al banco 0
Borrar PORTA
Poner a 1 PA0
LED en PA0
Poner a 0 PA1
Bucle infinito
Fin de programa

http://lonely113.blogspot.com

Si se trabaja con un oscilador de 10 MHz cada instruccin se ejecutara a 2.5 MHZ


y dependiendo de la cantidad de instrucciones el led seguramente oscilara a
cientos de KHz (imposible de ser percibidos por el ojo humano)
En este caso es necesario colocar bucles de retardo para hacer que el encendido y
apagado del Led sea a mucha menor frecuencia tal que pueda ser percibido por el
ojo humano. Esto se consigue con el uso de contadores anidados como se
muestra en el siguiente ejemplo:
INCLUDE
LIST
CONTA1 equ
CONTA2 equ
org
bsf
clrf
Bcf
clrf
BEGIN: bsf
movlw
movwf
movwf
movwf
LOOP1: decfsz
goto
movlw
movwf
decfsz
goto

bcf
movlw
movwf
movwf
movwf
LOOP2: decfsz
goto
movlw
movwf
decfsz
goto
Goto
End

p16f84a.inc
p=16f84a
0x0C
0x0D
0x00
STATUS,5
;
TRISA
;
STATUS,5
;
PORTA
;
PORTA,0
;
0xFA
;
CONTA1
;
0xFF
;
CONTA2
CONTA1
;
LOOP1
;
0xFA
;
CONTA1
;
CONTA2
;
LOOP1
;
;
;
PORTA,0
;
0xFA
;
CONTA1
0xFF
CONTA2
CONTA1
LOOP2
0xFA
CONTA1
CONTA2
LOOP2
;
BEGIN
;
;

Cambio al banco 1
PORTA como salida
Volver al banco 0
Borrar PORTA
Poner a 1 PA0
Inicio de rutina de retardo
Mueve valores de inicio de
cuenta a CONTA1 y CONTA2
Disminuir CONTA1
Saltar a LOOP1 si CONTA1>0
Reiniciar CONTA1 cuando
llegue a 0
Ademas disminuir CONTA2
Saltar a LOOP1 si CONTA2>0
Continuar si CONTA2=0
Fin de rutina de retardo
Poner a 0 PA1
Inicio de rutina de retardo

Fin de rutina de retardo


Bucle infinito
Fin de programa

Es necesario colocar dos retardos entre el cambio de 1 a 0 y de 0 a 1.


El bucle de retardo cuenta de 250 (FAh) ciclos de instruccin 255 (FFh) veces, es
decir, 250x255= 63750 ciclos de instruccin antes de pasar a la siguiente
instruccin. Se puede calcular el tiempo de retardo teniendo en cuenta la
frecuencia del cristal y la cantidad de ciclos que toma cada instruccin para ser
ejecutada.

http://lonely113.blogspot.com

c) Subrutinas
Una subrutina es un fragmento de cdigo que puede ser llamado cuantas veces se
necesite en el programa principal. Facilita la modificacin del cdigo y la reduccin
de uso de memoria de programa. Las subrutinas deben ir al final del programa
para evitar que se ejecuten junto con el programa principal pues el PIC no
diferencia uno del otro.
En el ejemplo anterior se observa que se requieren 2 bucles de retardo, incluirlos
en el programa principal tiene varias desventajas, entre ellas: Anlisis engorroso,
programa simple pero muy extenso, ocupa mucha memoria de programa, etc.
Es conveniente crear una subrutina de retardo y llamarlo en el programa principal
donde se requiera:
INCLUDE
LIST

p16f84a.inc
p=16f84a

CONTA1 equ
CONTA2 equ

0x0C
0x0D

org
bsf
clrf

0x00
STATUS,5
TRISA

Bcf
clrf
BEGIN: bsf
call
bcf
Call
goto

STATUS,5
PORTA
PORTA,0
DELAY
PORTA,0
DELAY
BEGIN

;Subrutinas
;-----------------------DELAY movlw 0xFA
movwf CONTA1
movwf 0xFF
movwf CONTA2
LOOP: decfsz CONTA1
goto
LOOP
movlw 0xFA
movwf CONTA1
decfsz CONTA2
goto
LOOP
end

;
;
;
;
;
;
;
;
;
;

Cambio al banco 1
Borrar el registro TRISA
PORTA como salida
Volver al banco 0
Borrar PORTA
Poner a 1 PA0
Llamada a rutina de retardo
Poner a 0 PA1
Llamada a rutina de retardo
Bucle infinito

; Inicio de rutina de retardo

; Fin de rutina de retardo


; Fin de programa

El programa se ve mucho ms simple y ordenado.

http://lonely113.blogspot.com

d) Tablas de datos
Las tablas de datos son subrutinas que agrupan una cierta cantidad de valores
numricos ordenadamente y donde cada uno de ellos puede ser ledo
dependiendo de algn criterio. El uso ms comn es la conversin de un formato
de datos a otro, por ejemplo Hexadecimal a 7 segmentos (para un display ctodo
comn), Hexadecimal a ASCII (Para un LCD), etc.
El siguiente ejemplo convierte un valor hexadecimal, que se lee en el puerto A
(RA3-RA0), a un cdigo para visualizar dicho valor en un display de 7 segmentos
conectado al puerto B (RB7-RB1).
INCLUDE
LIST

p16f84a.inc
p=16f84a

org
bsf
movlw
movwf
clrf
bcf
BEGIN: movf
call
movwf
goto

0x00
STATUS,5
0x0F
TRISA
TRISB
STATUS,5
PORTA,0
CONV
PORTB
BEGIN

;
;
;
;
;
;
;
;
;
;

Inicio de Programa
Inicio configuracion E/S
b'00001111'
RA0-RA3 como entradas
Puerto B como salida
Fin configuracion E/s
Mueve PORTA a W
Llama a subrutina CONV
Mueve W a PORTB
Bucle infinito

;Subrutina
; Tabla de conversion Hexadecimal a 7 segmentos.
CONV

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
end

PCL,1
0x7E
0x0C
0xB6
0x9E
0xCC
0xDA
0xFA
0x0E
0xFE
0xDE
0xEE
0xF8
0x72
0xBC
0xF2
0xE2

;0
;1
;2
;3
;4
;5
;6
;7
;8
;9
;A
;B
;C
;D
;E
;F

PC+0
PC+1
PC+2
PC+3

PC+F

;Fin de programa

http://lonely113.blogspot.com

La tabla es la subrutina CONV. Toma el valor hexadecimal que se encuentre en W


(proveniente del puerto A) y la suma al registro PCL (PCL almacena el byte bajo del
PC, la direccin de la siguiente instruccin a ejecutar). Automticamente Se
apunta a la direccin actual en el PC. La instruccin RETLW retorna de la subrutina
y mueve al registro W el valor presente a su derecha.
Por ejemplo, suponiendo que inicialmente W=05h:
1. Se llama a la subrutina, entonces PC=PC+5h.
2. Se apunta a la instruccin: retlw 0xDA ;5 que convierte 05h al valor
correspondiente que mostrar 5 en el display.
3. Retorno de interrupcin y carga de 0xDA en el registro W.

e) Interrupciones
Una interrupcin es un evento que hace que el microcontrolador deje de ejecutar
la tarea principal para pasar a una rutina (de interrupcin). Finalizada sta el
microcontrolador vuelve a la tarea principal.
La rutina de interrupcin debe comenzar en la direccin 0x04h (Vector de
interrupcin).
Es conveniente que justo al inicio de la rutina de interrupcin se incluyan
instrucciones para guardar el contenido del registro W y el estado de los flags del
registro STATUS en ubicaciones temporales, pues stos cambiarn al ejecutarse la
rutina de interrupcin.
Tipos
1) Internas

Por desbordamiento del registro TMR0. Cuando pasa de FFh a 00h.


Escritura de datos en EEPROM completa.

2) Externas

Por cambio de estado en el pin RB0/INT.


Por cambio de estado en uno de los pines RB4-RB7.

Este tipo de interrupciones son aprovechables para implementar programas.

http://lonely113.blogspot.com

2.1. Por cambio de estado en alguno de los pines RB3-RB7


Para utilizar interrupciones por cambio de estado en uno de los pines RB3RB7 se debe tener en cuenta:

Habilitar interrupciones Globales: poniendo a 1 el bit GIE del registro


INTCON.

Habilitar interrupciones por el puerto B: Poniendo a 1 el bit RBIE del


registro INTCON.

Permitir interrupciones por el puerto B: Cuando ocurre una


interrupcin el bit RBIF del registro INTCON se pone a 1 para pasar a
la rutina de interrupcin y no permitir ms interrupciones. Se debe
poner a 0 con alguna instruccin antes del retorno de interrupcin.
Caso contrario no se permitir ms interrupciones.

No se dispone de ningn bit para especificar el tipo de flanco, por


esto la rutina de interrupcin debe incluir algn mecanismo para que
ejecute ciertas instrucciones para un determinado flanco.

2.2. Por cambio de estado en el pin RB0/INT


Para utilizar interrupciones por el pin RB0/INT se debe tener en cuenta:

Habilitar interrupciones Globales: poniendo a 1 el bit GIE del registro


INTCON.

Habilitar interrupciones por el pin RB0/INT: Poniendo a 1 el bit INTE


del registro INTCON.

Especificar el tipo de flanco: Cambiando el bit INTEDG del registro


OPTION.
0: Flanco de bajada
1: Flanco de subida (por defecto)

Permitir interrupciones por RB0/INT: Cuando ocurre una interrupcin


el bit INTF del registro INTCON se pone a 1 para pasar a la rutina de
interrupcin y no permitir ms interrupciones. Se debe poner a 0 con
alguna instruccin antes del retorno de interrupcin. Caso contrario
no se permitir ms interrupciones.

http://lonely113.blogspot.com

El siguiente ejemplo es un contador decimal (0-9) de pulsaciones. El


pulsador se conecta al pin RB0/INT y produce una interrupcin cada vez
que se pulsa. La cuenta se muestra en BCD mediante 4 led conectados al
puerto A (RA0-RA3).
include
LIST
COUNT equ
TEMP
equ
TEMP2 equ
org
goto
org
movwf
movf
movwf
incf
movlw
subwf
btfss
goto
goto
RESUM: bcf
movf
movwf
movf
retfie
CLEAR: clrf
movf
movwf
movf
bcf
retfie

p16f84a.inc
P=16f84a
0x0C
0x0D
0x0E
0x00
; Inicio de programa
BEGIN
0x04
; Inicio de rutina de interrupcion
TEMP
; Mover registro W a memoria temporal TEMP
STATUS,0
TEMP2
; Salva el estado de flags
COUNT,1
; Incrementar COUNT y guardar en memoria
0x0A
; Mover d'10' a W
COUNT,0
STATUS,0
; Si COUNT=10 saltar a CLEAR
RESUME
; Si COUNT<10 saltar a RESUM
CLEAR
INTCON,1
; Habilita interrupciones por RB0
TEMP2,0
STATUS
TEMP,0
; Mover TEMP a W
; Retorno de interrupcion
COUNT
; Borrar COUNT
TEMP2,0
STATUS
TEMP,0
INTCON,1
;Permitir interrupciones
;Retorno de interrupcin

;Programa Principal
BEGIN: bsf
bsf
bcf
bsf
movlw
movwf
clrf
bcf
LOOP: movf
movwf
goto
end

INTCON,7
INTCON,4
INTCON,1
STATUS,5
0x01
TRISB
TRISA
STATUS,5
COUNT,0
PORTA
LOOP

;
;
;
;
;
;
;
;

Habilitacion global de interrupciones


Interrupciones por RB0
Permitir interrupciones por RB0
Configuracion E/S
b'00000001'
RB0 como entrada RB1-RB7 como salidas
PORTA como salida
Fin configuracion E/S

;Mueve COUNT a PORTA. Se muestra en BCD


;Bucle infinito
; Fin de programa

Ms ejemplos en http://lonely113.blogspot.com

http://lonely113.blogspot.com

IX. PROGRAMACIN DEL PIC


Registro de configuracin
Existe un registro CONFIG (direccin 2007h) que dispone de ciertas opciones a la
hora de programar (escribir) el PIC. Slo se puede acceder a este registro en el
momento de la programacin del dispositivo.

13

12

11

10

CP
9 8

WDT FOSC1 FOSC0


3
2
1
0

CP: Bit de proteccin de cdigo.


1: Proteccin de cdigo deshabilitada.
0: Proteccin de cdigo habilitada.
: Power-up timer o temporizador de encendido.
1: Power-up timer deshabilitado
2: Power-up timer habilitado
FOSC1, FOSC0: Bit de seleccin de tipo de oscilador.
11: Oscilador RC
10: Oscilador HS
01: Oscilador XT
00: Oscilador LP
Los bits del registro CONFIG se pueden modificar mediante directivas al compilador
o directamente en el programa que se utiliza para programar el PIC.
1) Mediante directivas al compilador
El fichero p16f84a.inc define directivas para modificar los bits del registro
CONFIG.
;---------Configuration Bits----_CP_ON
EQU
H'000F'
_CP_OFF
EQU
H'3FFF'
_PWRTE_ON
EQU
H'3FF7'
_PWRTE_OFF
EQU
H'3FFF'
_WDT_ON
EQU
H'3FFF'
_WDT_OFF
EQU
H'3FFB'
_LP_OSC
EQU
H'3FFC'
_XT_OSC
EQU
H'3FFD'
_HS_OSC
EQU
H'3FFE'
_RC_OSC
EQU
H'3FFF'

http://lonely113.blogspot.com

Estas directivas se escriben luego de importar el fichero. Por ejemplo:


Se utilizar un oscilador XT (cristal) y se deshabilitar el WDT.
include
LIST

p16f84a.inc
P=16f84a

__CONFIG _WDT_OFF & _XT_OSC

NOTA: __CONFIG (doble barra)


2) Directamente en el programa
Por ejemplo el programa del Pickit 2 permite modificar estos bits:

También podría gustarte