Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Pic16f84a para Aprender A Programar PDF
Pic16f84a para Aprender A Programar PDF
com
PIC16F84A
I. CARACTERÍSTICAS
CPU
Periféricos
Microcontrolador
III. PINES
68 registros SRAM a partir de la dirección 0Ch hasta la dirección 7Fh (Banco 0).
Las direcciones 8Ch – CFh (Banco 1) apuntan a los mismos registros del Banco 0.
Por ejemplo: Apuntar a la dirección 8Ch es igual que apuntar a la dirección 0Ch.
Direcciones 50h a 7Fh no implementadas físicamente.
Contiene el estado aritmético del ALU, el estado del RESET y el bit de selección
de Banco para la memoria de datos.
Registro de Lectura/Escritura.
Todos los cambios del registro PCH pasan a través del registro PCLATH.
http://lonely113.blogspot.com
PORTA
RA4 RA3 RA2 RA1 RA0
4 3 2 1 0
TRISA
TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
4 3 2 1 0
PORTB
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
7 6 5 4 3 2 1 0
TRISB
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
7 6 5 4 3 2 1 0
Donde:
k: Literal.
b: Bit de registro (0 - 7)
http://lonely113.blogspot.com
Directiva EQU
Directiva ORG
Directiva END
Directiva LIST
LIST P=16f84a
http://lonely113.blogspot.com
Directiva INCLUDE
b) Uso de Comentarios
c) Etiquetas (Label)
end
http://lonely113.blogspot.com
d) Instrucciones
org 0x00
movlw 0x0F ; Mover literal 0Fh al registro W
movwf 0x0C ; Mover W a la direccion 0Ch.
movlw 0x10 ; Mover 10h a W
addwf 0x0C,1 ; Sumar W con el dato en la
; direccion 0Ch. Guardar en
; direccion 0Ch.
movf 0x0C,0 ; Mover el dato en direccion 0Ch.
; a W.
movwf REG1 ; Mover W a REG1 (direccion 0Dh)
; El resultado final es 1Fh en
; REG1 (direccion 0Dh)
end
org 0x00
movlw 0x08 ; Mover literal 08h al registro W
movwf REG1 ; Mover W a la direccion 0Ch.
movlw 0x07 ; Mover 07h a W.
iorwf REG1,1 ; OR entre W y REG1. Guardar en
; REG1
comf REG1,1 ; Complementa los bits de REG1
; Guardar en REG1
swapf REG1,0 ; Intercambio de nibles de REG1
; Guardar en W
; El resultado final es 0Fh en W
end
org 0x00
movlw 0x0F ; Mover literal 0Fh al registro W
movwf REG1 ; Mover W a la direccion 0Ch.
clrw ; Borra W
clrf REG1 ; 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
org 0x00
movlw 0x01 ; Mover literal 01h al registro W
movwf REG1 ; Mover W a la direccion 0Ch.
incf REG1,1 ; Incrementar REG1 en 1
; Guardar en REG1
incf REG1,1
decf REG1,0 ; Disminuir REG1 en 1
; Guardar en W
; W queda finalmente con 02h.
end
7) DECFSZ, INCFSZ
org 0x00
movlw 0x01 ; Mover literal 01h al registro W
movwf REG1 ; Mover W a REG1
decfsz REG1,0 ; Disminuir REG en 1. Guardar en W
movlw 0xFF ; No se ejecuta esta instrucción
; porque la operacion anterior
; hace que Z se active
nop ; No realizar operación
; El resultado final es 00h en W
end
8) BCF, BSF
org 0x00
movlw 0x01 ; Mover literal 01h al registro W
movwf REG1 ; Mover W a REG1
bcf REG1,0 ; Pone a 0 Bit 0 de REG1
bsf REG1,4 ; Pone a 1 Bit 1 de REG1
; Resultado final es 10h en REG1
end
9) RLF, RRF
org 0x00
movlw 0x01 ; Mover literal 01h al registro W
movwf REG1 ; Mover W a REG1
bcf STATUS,0 ; Pone a 0 Bit de carry C.
rlf REG1,1 ; Rotar a la izquierda
; Guardar en REG1
rlf REG1,1 ; Rotar a la izquierda
; Guardar en REG1
org 0x00
movlw 0x0F ; Mover literal 0Fh al registro W
movwf REG1 ; Mover W a REG1
btfsc REG1,4 ; Verifica Bit 4 de REG1
movlw 0xCC ; No se ejecuta
btfss REG1,7 ; Verifica bit 7 de REG1
movlw 0xF0 ; Se ejecuta
; El resultado final es F0h en W
end
org 0x00
bsf STATUS,5 ; Cambio al banco 1
movlw 0x03 ; b’00000011’ a W
movwf TRISA ; b’00000011’ al registro TRISA
; RA0 y RA1 como entradas
; RA2-RA4 como salidas
movlw 0xF0 ; b’11110000’ a W
movwf TRISB ; b’11110000’ al registro TRISB
; RB0-RA3 como salidas
; RB4-RB7 como entradas
Bcf STATUS,5 ; Volver al banco 0
; Continua el programa
;------------------------------------------------------------
;Autor:
;Fecha:
;Titulo:
;Descripcion:
;------------------------------------------------------------
;------------------------------------------------------------
; Definiciones del usuario
;------------------------------------------------------------
;------------------------------------------------------------
; Modo de operacion de puertos I/O, interrupciones
;------------------------------------------------------------
;------------------------------------------------------------
; Codigo del programa
;------------------------------------------------------------
;------------------------------------------------------------
;Subrutinas
;------------------------------------------------------------
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 serán tratados como
cualquier otro registro.
b) Bucles de retardo
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 “p16f84a.inc”
LIST p=16f84a
CONTA1 equ 0x0C
CONTA2 equ 0x0D
org 0x00
bsf STATUS,5 ; Cambio al banco 1
clrf TRISA ; PORTA como salida
Bcf STATUS,5 ; Volver al banco 0
clrf PORTA ; Borrar PORTA
BEGIN: bsf PORTA,0 ; Poner a 1 PA0
movlw 0xFA ; Inicio de rutina de retardo
movwf CONTA1 ; Mueve valores de inicio de
movwf 0xFF ; cuenta a CONTA1 y CONTA2
movwf CONTA2
LOOP1: decfsz CONTA1 ; Disminuir CONTA1
goto LOOP1 ; Saltar a LOOP1 si CONTA1>0
movlw 0xFA ; Reiniciar CONTA1 cuando
movwf CONTA1 ; llegue a 0
decfsz CONTA2 ; Ademas disminuir CONTA2
goto LOOP1 ; Saltar a LOOP1 si CONTA2>0
; Continuar si CONTA2=0
; Fin de rutina de retardo
bcf PORTA,0 ; Poner a 0 PA1
movlw 0xFA ; Inicio de rutina de retardo
movwf CONTA1
movwf 0xFF
movwf CONTA2
LOOP2: decfsz CONTA1
goto LOOP2
movlw 0xFA
movwf CONTA1
decfsz CONTA2
goto LOOP2 ; Fin de rutina de retardo
Goto BEGIN ; Bucle infinito
End ; Fin de programa
El bucle de retardo cuenta de 250 (FAh) ciclos de instrucción 255 (FFh) veces, es
decir, 250x255= 63750 ciclos de instrucción antes de pasar a la siguiente
instrucción. Se puede calcular el tiempo de retardo teniendo en cuenta la
frecuencia del cristal y la cantidad de ciclos que toma cada instrucción para ser
ejecutada.
http://lonely113.blogspot.com
c) Subrutinas
Una subrutina es un fragmento de código que puede ser llamado cuantas veces se
necesite en el programa principal. Facilita la modificación del código y la reducción
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.
org 0x00
bsf STATUS,5 ; Cambio al banco 1
clrf TRISA ; Borrar el registro TRISA
; PORTA como salida
Bcf STATUS,5 ; Volver al banco 0
clrf PORTA ; Borrar PORTA
BEGIN: bsf PORTA,0 ; Poner a 1 PA0
call DELAY ; Llamada a rutina de retardo
bcf PORTA,0 ; Poner a 0 PA1
Call DELAY ; Llamada a rutina de retardo
goto BEGIN ; Bucle infinito
;Subrutinas
;------------------------
DELAY movlw 0xFA ; Inicio de rutina de retardo
movwf CONTA1
movwf 0xFF
movwf CONTA2
LOOP: decfsz CONTA1
goto LOOP
movlw 0xFA
movwf CONTA1
decfsz CONTA2
goto LOOP ; Fin de rutina de retardo
d) Tablas de datos
Las tablas de datos son subrutinas que agrupan una cierta cantidad de valores
numéricos ordenadamente y donde cada uno de ellos puede ser leído
dependiendo de algún criterio. El uso más común es la conversión de un formato
de datos a otro, por ejemplo Hexadecimal a 7 segmentos (para un display cátodo
común), Hexadecimal a ASCII (Para un LCD), etc.
;Subrutina
; Tabla de conversion Hexadecimal a 7 segmentos.
e) Interrupciones
Tipos
1) Internas
2) Externas
Para utilizar interrupciones por cambio de estado en uno de los pines RB3-
RB7 se debe tener en cuenta:
0: Flanco de bajada
1: Flanco de subida (por defecto)
include “p16f84a.inc”
LIST P=16f84a
COUNT equ 0x0C
TEMP equ 0x0D
TEMP2 equ 0x0E
org 0x00 ; Inicio de programa
goto BEGIN
org 0x04 ; Inicio de rutina de interrupcion
movwf TEMP ; Mover registro W a memoria temporal TEMP
movf STATUS,0
movwf TEMP2 ; Salva el estado de flags
incf COUNT,1 ; Incrementar COUNT y guardar en memoria
movlw 0x0A ; Mover d'10' a W
subwf COUNT,0
btfss STATUS,0 ; Si COUNT=10 saltar a CLEAR
goto RESUME ; Si COUNT<10 saltar a RESUM
goto CLEAR
RESUM: bcf INTCON,1 ; Habilita interrupciones por RB0
movf TEMP2,0
movwf STATUS
movf TEMP,0 ; Mover TEMP a W
retfie ; Retorno de interrupcion
CLEAR: clrf COUNT ; Borrar COUNT
movf TEMP2,0
movwf STATUS
movf TEMP,0
bcf INTCON,1 ;Permitir interrupciones
retfie ;Retorno de interrupción
;Programa Principal
Registro de configuración
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.
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
include “p16f84a.inc”
LIST P=16f84a
2) Directamente en el programa