Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pic16f84a 110301165859 Phpapp01 PDF
Pic16f84a 110301165859 Phpapp01 PDF
com
PIC16F84A
I. CARACTERSTICAS
CPU
Perifricos
Microcontrolador
http://lonely113.blogspot.com
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.
http://lonely113.blogspot.com
http://lonely113.blogspot.com
http://lonely113.blogspot.com
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.
R/W
RP1
6
R/W
RP0
5
R
4
R
3
R/W
Z
2
R/W
DC
1
R/W
C
0
http://lonely113.blogspot.com
R/W
INTEDG
6
R/W
T0CS
5
R/W
T0SE
4
R/W
PSA
3
R/W
PS2
2
R/W
PS1
1
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
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
http://lonely113.blogspot.com
direccionamiento
indirecto.
INDF
no
est
R/W
WRERR
3
R/W
WREN
2
R
WR
1
R
RD
0
http://lonely113.blogspot.com
RA3
3
RA2
2
RA1
1
RA0
0
TRISA4
4
TRISA3
3
TRISA2
2
TRISA1
1
TRISA0
0
TRISA
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
http://lonely113.blogspot.com
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
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
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
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
;
;
;
;
;
;
;
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
;
;
;
;
;
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
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.
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
; 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
;
;
;
;
end
0x00
0x11
0x10
0x0F
0x10
;
;
;
;
;
end
equ
0x0D
org
movlw
movwf
movlw
addwf
0x00
0x0F
0x0C
0x10
0x0C,1
movf
0x0C,0
movwf REG1
;
;
;
;
;
;
;
;
;
;
;
end
http://lonely113.blogspot.com
equ
0x0D
org
movlw
movwf
movlw
iorwf
0x00
0x08
REG1
0x07
REG1,1
comf
REG1,1
swapf REG1,0
;
;
;
;
;
;
;
;
;
;
end
equ
0x0D
org
movlw
movwf
clrw
clrf
0x00
0x0F
REG1
REG1
;
;
;
;
;
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
;
;
;
;
; Disminuir REG1 en 1
; Guardar en W
; W queda finalmente con 02h.
end
REG1
equ
0x0D
org
movlw
movwf
decfsz
movlw
0x00
0x01
REG1
REG1,0
0xFF
nop
;
;
;
;
;
;
;
;
end
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
;
;
;
;
;
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
;
;
;
;
;
;
;
; Rotar a la derecha
; Guardar en W
; El resultado final es 02h en W
http://lonely113.blogspot.com
equ
0x0D
org
movlw
movwf
btfsc
movlw
btfss
movlw
0x00
0x0F
REG1
REG1,4
0xCC
REG1,7
0xF0
;
;
;
;
;
;
;
end
http://lonely113.blogspot.com
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
0x00
; Inicio de programa
; Fin de programa
http://lonely113.blogspot.com
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
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
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
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
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
2) Externas
http://lonely113.blogspot.com
http://lonely113.blogspot.com
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
;
;
;
;
;
;
;
;
Ms ejemplos en http://lonely113.blogspot.com
http://lonely113.blogspot.com
13
12
11
10
CP
9 8
http://lonely113.blogspot.com
p16f84a.inc
P=16f84a