Vous êtes sur la page 1sur 21

PIC16F84.

Manual Básico

Requerimientos para programar

1. Windows 98 2º edición como mínimo.


2. Un puerto serie para el circuito propuesto en esta guía.
3. Los programas correspondientes para quemar o grabar. Ejemplo:
WinPic800, NTicprog.
4. los programas correspondientes para programar. En este caso se va a
explicar como programar en MPLab 7.0
5. Un circuito quemador
6. Un PIC16F84
7. conocimientos de electrónica básica.

Datos Técnicos

Sólo 35 instrucciones para aprender


1000 ciclos de borrado/escritura en memoria falsh
20 mA por pin.
Reset.
Sleep
Protección de código.
Varias opciones de Osciladores.
Rango de operación: 2.0V – 5.0V
Consumo: <2 mA a 5V, 4MHz.
Introducción:

Controler Interface Peripheral (PIC). Este circuito tiene la capacidad de


manejar un proceso a la vez.
ALU (Unidad Aritmético Lógica): es la región del PIC donde se efectúan
todas las operaciones lógicas como la suma, resta, salto, etc.
Vss = Tierra = Gnd = negativo.
Vdd = positivo.
Los datos se escriben así:
o Hexadecimal: 0x A1
o Binario: b‟01010101‟

68 variables para establecer en la memoria RAM.


Puerto A: 5 bits. Ejemplo: 01011.
Puerto B: 1 byte= 8 bits. Ejemplo: 01011101.
MCLR: Master Clear= Reset.
Tipos de osciladores:
o XT: Cristal de Cuarzo.
o RC: Resistencia – capacitor.
o HS: Cristal de alta velocidad.
o LP: Cristal de baja frecuencia y bajo consumo de potencia.

Conexión de RC:
Conexión de Reset:

Arquitectura interna:

Memoria ROM: 1K x 14 bits.


ALU(Unidad Aritmético Lógica) de 8 bits.
Acumulador: Región de memoria donde se guarda el resultado de una
operación lógica o aritmética. Conocido como “W”. Tiene 1 byte de datos
Contador de programa (PC)
Memoria: 1,024 posiciones

PC: registro que almacena la posición del último salto realizado por el
programa.
La parte del PIC que vamos a estar ocupando para grabar nuestros programas
se le conoce como “Bank0”, (Ver dibujo anterior). A esa sección que vamos a
estar ocupando es una memoria no volátil, comprendida entre la sección de
memoria: 50h y 7Fh.

La parte del PIC conocida como “Bank1” se usa por lo general para configurar
si las patillas del PIC van a aceptar datos del mundo exterior o bien funcionar
como salida de datos, el temporizador, modificar opciones avanzadas, etc.

Registros importantes:

TRISA: configuración de PORTA = RA0, RA1, RA2, RA3, RA4 (pines del PIC)
TRISB: configuración de PORTB =RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7
(pines del PIC).

STATUS: contiene la información de “las banderas” que indican el estado del


resultado de una operación lógica o matemática. Este registro tiene los
mismos valores tanto en el banco1 como en el banco0.

Tabla 1: STATUS (“Banderas”)


IRP RP1 RP0 TO PD Z DC C

 RP0 (Register Bank Selected Bits): cambio de banco.


o si RP0 = 0  Acceso a banco0
o si RP0 = 1  Acceso a banco1

 C (Carry): este bit del registro STATUS se activa a 1 lógico cuando el


resultado de una operación lógica o aritmética sobrepasa los 8 bits
disponibles de un registro o variable.

 Z (Zero): este bit del registro STATUS se activa a 1 lógico cuando el


resultado de una operación lógica o aritmética da cero; y se desactiva
o adquiere un estado de 0 lógico cuando el resultado de una
operación lógica o aritmética NO da cero.

Los otros registros se utilizan para una programación más avanzada.

Ley de los signos: (importante aprender)

Número Positivo C=1 Z=0


Cero C=1 Z=1
Número Negativo C=0 Z=0
Instrucciones
w=registro de trabajo. Lugar donde se almacenan los datos más importantes a
ocupar para las operaciones lógicas y aritméticas. Está compuesto de 1 byte u
8 bits, es decir ‘00000000’ por ejemplo, al igual que las variables que se
puedan declarar y la mayoría de los registros del PIC.

Para poner Comentarios en el código se usa “; “

Instrucciones de carga

clrw: limpia w, es decir, w=00000000.

Ejemplo:

Antes: w=01010101
Instrucción: clrw
Después: w=00000000

clrf: limpia variable o dirección de memoria.

Ejemplo:

Antes: TRISA= 01010111


Instrucción: clrf
Después: TRISA=00000000

Movlw [dato]: copia un dato a registro w.

Ejemplo:

Antes: w=0x08
Instrucción: movlw 0xFF
Después: w= FF.

movwf f: copia el dato almacenado en el registro “w” y lo guarda en el registro


“f ”.

movf f,d: copia el dato almacenado en el registro “ f “.

f = registro o variable declarada.


d = determina el lugar donde va a almacenarse el dato.
Si d = 0 ; el dato se copia al registro w.
Si d = 1 ; el dato se refresca o actualiza, ya que vuelve a guardarse en el
mismo lugar. (esto se ocupa para verificar las banderas del PIC).
Ejemplo:

Antes: PORTA=0x05
w=0xFA
Ejecutar instrucción: movf PORTA,0
Después: PORTA = 0x05
w=0x05

Instrucciones de bit

bcf f,b: esta instrucción se utiliza para colocar un 0 lógico en un bit


especificado por b, en el registro f.

Ejemplo:

Antes:11111111
Instrucción: bcf PORTA,5 (quinta posición de derecha a izquierda)
Después: PORTA=11101111

bsf f,b: esta instrucción se utiliza para colocar un 1 lógico en un bit


especificado por b, en el registro f.

Ejemplo:

Antes:00000000

Instrucción: bcf PORTA,5 (quinta posición de derecha a izquierda)

Después: PORTA=00010000

Instrucciones de salto

goto: se desplaza hacia una etiqueta.

Ejemplo:

ladrillo: goto hola


código ignorado
código ignorado
 hola: código
código
código

Se desplaza desde la posición de la etiqueta ladrillo hacia la viñeta o


etiqueta hola ubicada arriba o abajo, (no importa) e ignora el código que
le sigue.
end: fin del programa. Es importante colocarlo siempre al final del código.

<nombre de la variable> EQU <región de memoria>: declara variables o


registros. Es importante empezar desde 0x0C, porque desde esa localidad de
memoria inicia el área de la memoria RAM y únicamente acepta 68 variables.

Ejemplo1:
Michael EQU 0x0C
Ejemplo2:
pAlAbRa EQU 0x1A

org <posición>: esta instrucción indica la posición de las 1,024 disponibles


donde inicia a escribirse el programa del PIC.

Ejemplo1:
org 0
Ejemplo2:
org 1023

Instrucciones de suma

addlw <dato>: esta instrucción suma aritméticamente el registro w con el dato


y el resultado lo almacena en w.

Ejemplo:

Antes: w=0x50
Instrucción: addlw 0x01
Después: w=0x51

addwf f,d: esta instrucción suma aritmética el registro w con un registro (“ f “) y


lo guarda en el registro w si d=0 y si lo guarda en el mismo registro si d=1.

Ejemplo1:

Antes: PORTA = 0x02


w=0x01
Instrucción: addwf PORTA,1
Después: PORTA =0x03
w=0x01

Ejemplo2:

Antes: PORTA =0x02


w=0x01
Instrucción: addwf PORTA,0
Después: PORTA =0x02
w=0x03

Instrucciones de resta:

sublw <dato>: esta instrucción efectúa una resta aritmética. Al dato escrito se
le resta el valor del registro w y el resultado se guarda en el registro w.

Ejemplo:

Antes: w=0x03
Instrucción: sublw 0x01
Después: w=0x02

subwf f,d: esta instrucción resta aritméticamente el valor de w del registro “ f ”.


El resultado se guarda en w cuando d=0. El resultado se guarda en el mismo
registro cuando d=1.

Ejemplo1:

Antes: Contar=0x04
W=0x01
Instrucción: subwf Contar,0
Después: Contar=0x04
W=0x03

Ejemplo2:

Antes: Contar=0x04
W=0x01
Instrucción: subwf Contar,1
Después: Contar=0x03
W=0x01

Instrucciones de incremento y decremento:

decf f,d : esta instrucción resta una unidad al registro “ f ”. Si el valor de d=0 el
resultado se guarda en el registro w. Si el valor de d=1 entonces el resultado se
guarda en el mismo registro “ f ”.

Ejemplos:

Antes: PORTA = 0x10


Instrucción: decf PORTA,0
Después: PORTA =0x10 ; w= 0x0f

Antes: PORTA = 0x10


Instrucción: decf PORTA,1
Después: PORTA =0x0f

incf f,d : esta instrucción incrementa el valor del registro “ f “ en uno. Si d=0 el
resultado se guarda en el registro w; si d=1 se guarda en el mismo registro “ f “.

Ejemplos:

Antes: PORTB=0x01
Instrucción: incf PORTB,0
Después: PORTB=0x01 ; w=0x02

Antes: PORTB=0x01
Instrucción: incf PORTB,1
Después: PORTB=0x02

Instrucciones lógicas:

andlw <dato>: realiza una operación “AND” entre el registro w y el dato


(también llamado máscara o “ k “). Ejemplo:

Antes: w=b‟10100111‟
AND
Instrucción: andlw b‟01011111‟

Después: w=b‟00000111‟

andwf f,d : realiza una “AND” entre w y un registro “ f “. Si d=0 el resultado se


guarda en el registro w; si d=1 se guarda en el mismo registro “ f “. Ejemplo:

Antes: w=b‟10100111‟ ; PORTA=b‟01011111‟

Instrucción: andwf PORTA,0

w=b‟10100111‟
AND
PORTA=b‟01011111

Después: w=b‟00000111‟
comf f,d : realiza un complemento bit a bit de un registro “ f “. Si d=0 el
resultado se guarda en el registro w; si d=1 se guarda en el mismo registro “ f “.

Ejemplo:

Antes: PORTA=b‟01010101‟
Instrucción: comf PORTA,1
Después: PORTA=b‟10101010‟

iorlw k : realiza una operación “OR” del registro w con el dato “k” y el resultado
se guarda en el registro w. Ejemplo:

Antes: w=b‟01010101‟
Instrucción: iorlw b‟00001111‟
Después: w=b‟01011111‟

iorwf f,d: esta instrucción realiza una operación “OR” del registro w con otro
registro “ f ”. Si d=0 el resultado se guarda en el registro w; si d=1 se guarda en
el mismo registro “ f “. Ejemplo:

Antes: w=b‟01010101‟ : PORTA=b‟00001111‟


Instrucción: iorwf PORTA,0
Después: w=b‟01011111‟ : PORTA=b‟00001111‟

Antes: w=b‟01010101‟ : PORTA=b‟00001111‟


Instrucción: iorwf PORTA,1
Después: w=b‟01010101‟ : PORTA=b‟01011111‟

rlf f,d: esta instrucción realiza un movimiento de bits del registro “ f ”,


desplazando uno a uno los 8 bits pasando por la bandera de acarreo hacia la
izquierda. Si d=0 el resultado se guarda en el registro w; si d=1 se guarda en el
mismo registro “ f “. Ejemplo:

Antes: w=b‟00000000‟ : PORTB= b‟00001111‟ : C=0


Instrucción: rlf PORTB,0
Después: w= b‟00011110‟ : PORTB= b‟00001111‟

Antes: w=b‟00000000‟ : PORTB= b‟00001111‟ : C=1


Instrucción: rlf PORTB,1
Después: w= b‟00000000‟ : PORTB= b‟00011111‟

Carry(C) Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0


rrf f,d: esta instrucción realiza un movimiento de bits del registro “ f ”,
desplazando uno a uno los 8 bits pasando por la bandera de acarreo hacia la
derecha. Si d=0 el resultado se guarda en el registro w; si d=1 se guarda en el
mismo registro “ f “. Ejemplo:

Antes: w=b‟00000000‟ : PORTB= b‟00001111‟ : C=1


Instrucción: rrf PORTB,0
Después: w=b‟10000000‟ : PORTB= b‟00001111‟

Antes: w=b‟00000000‟ : PORTB= b‟00001111‟ : C=1


Instrucción: rrf PORTB,1
Después: w=b‟00000000‟ : PORTB= b‟10001111‟

Carry Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0


(C)

swapf f,d: esta instrucción realiza un cambio de “Nible”. Si d=0 el resultado se


guarda en el registro w; si d=1 se guarda en el mismo registro “ f “. Ejemplo:

0001 0100  Nible


Nible alto Nible bajo

Antes: PORTA=5A
Instrucción: swapf PORTA,1
Después: PORTA=A5

xorlw <dato>: realiza una operación “XOR” entre el registro w y el dato


(también llamado máscara o “ k “). Ejemplo:

Antes: w=b‟00101011‟
XOR
Instrucción: andlw b‟01010101‟
Después: w=b‟01111110‟

xorwf f,d: esta instrucción realiza una operación “XOR” del registro w con otro
registro “ f ”. Si d=0 el resultado se guarda en el registro w; si d=1 se guarda en
el mismo registro “ f “. Ejemplos:

Antes: w=b‟01010101‟ : PORTA=b‟00001111‟


Instrucción: xorwf PORTA,0
Después: w=b‟01011010‟ : PORTA=b‟00001111‟

Antes: w=b‟01010101‟ : PORTA=b‟00001111‟


Instrucción: xorwf PORTA,1
Después: w=b‟01010101‟ : PORTA=b‟010111010‟
Saltos:

btfsc f,d: esta instrucción realiza un salto de la línea de código de la posición


que sigue si el bit del registro “ f “ es igual a cero. Ejemplo:

a: btfsc reg1,3 Cuando el pic llega a la posición “a:” evalúa el valor del “reg1”, en
b: proceso x su tercer bit; si éste es cero salta a una posición y realiza el
c: proceso y “proceso y”, sino sigue con el “proceso x”.
proceso z

btfss f,d: esta instrucción realiza un salto de la línea de código de la posición


que sigue si el bit del registro “ f “ es igual a uno. Ejemplo:

a: btfss reg1,3 Cuando el pic llega a la posición “a:” evalúa el valor del “reg1”, en
b: proceso x su tercer bit; si éste es uno salta a una posición y realiza el
c: proceso y “proceso y”, sino sigue con el “proceso x”.
proceso z

decfsz f,d: esta instrucción realiza un decremento en uno del registro “ f”. Si
d=0 el resultado se guarda en el registro w; si d=1 se guarda en el mismo
registro “ f “. Ejemplo:

a: decfsz reg1,0 Esta operación resta uno al valor de la variable “reg1”.


b: proceso x Si el resultado = 0 salta la instrucción siguiente.
c: proceso y Si el resultado ≠ 0 la instrucción siguiente es ejecutada.
proceso z

incfsz f,d: esta instrucción realiza un incremento en uno del registro “ f”. Si d=0
el resultado se guarda en el registro w; si d=1 se guarda en el mismo registro
“f“. Ejemplo:

a: incfsz reg1,0 Esta operación suma uno al valor de la variable “reg1”.


b: proceso x Si el resultado = 0 salta la instrucción siguiente.
c: proceso y Si el resultado ≠ 0 la instrucción siguiente es ejecutada.
proceso z

nop (no operation): esta instrucción no hace nada y no afecta el estado de las
banderas. Tarda un ciclo de máquina en ser ejecutada. Ejemplo:

nop
nop

call: se usa esta instrucción para realizar llamadas a etiquetas que se ubican
dentro del código. Ejemplo:
La secuencia es:
call etiqueta1 Primera línea.
… Tercera línea.
etiqueta1: nop Cuarta línea.
nop El resto del código.
….
return: esta instrucción es utilizada para regresar a la última línea de donde se
realizó la instrucción call. Ejemplo:
La secuencia es:
call etiqueta1 Primera línea.
Tercera línea.
….. Cuarta línea.
etiqueta1: nop Quinta línea.
….. Segunda línea.
return El resto del código

sleep: esta instrucción coloca al pic en modo de hibernación, bajo consumo de


corriente y deja de realizar las instrucciones programadas hasta que se
produzca una interrupción. Ejemplo:

a: sleep
Empezando a programar.
Lo primero a tomar en cuenta es:
tener instalado un depurador. Ejemplo: mplab 7.0
cumplir con los requisitos mínimos de instalación y operación.
Iniciativa de aprender.

Vocabulario:
Compilar: operación que se realiza para crear el archivo hexadecimal (*.hex)
que se va a grabar en el PIC con otro programa como por ejemplo winpic 800.

Compilar = Construir = Hacer.

Pasos para iniciar nuestro primer proyecto:


botón inicio –> programas –>microchip –>mplab IDE 7.0
a continuación se encuentran dos formas para crear un proyecto:
o en la barra de herramientas de proyectos de dar clic a nuevo
proyecto.
o en el menú proyectos –-> nuevo.
Se escribe un nombre para nuestro proyecto.
Se escribe el lugar donde se va a guardar nuestro proyecto (es
importante hacerlo lo más cercano a la raíz del sistema operativo,
porque da error al compilar).
Click en ok.

Pasos preliminares para crear nuestro primer programa:


Existen tres formas:
o La primera es: el la barra de herramientas estándar dar clic en nuevo.
o La otra es: en el menú archivo –>nuevo.
o Ctrl + n.
La siguiente ventana que aparece es donde se va a escribir el código del
pic a programar.
En ella se puede escribir.
Después de que se ha escrito algo se puede guardar.
Guardar en el mismo lugar que el proyecto a ocupar.

Pasos para crear el programa:


Declarar en la ventana de código el número del pic a ocupar. Ejemplo:
Si yo voy a ocupar un pic16f84a, entonces:
list p=16f84a
include <p16f84a.inc>

si yo voy a ocupar un pic 16c84, entonces:


list p=16c84
include <p16c84.inc>
En caso de ser necesario declarar las variables a ocupar. Ejemplo:
Es importante recordar que la región de memoria RAM designada para
declarar variables en le caso del pic16f84a empieza desde el 0x0C en
adelante, hasta 68 variables.

Las letras a, b, c, de están reservadas por el programa.

AX EQU 0x0C
BX EQU 0x0D
CX EQU 0x0E
DX EQU 0x0F

Establecer desde qué posición se inicia el programa. Ejemplo:


Recordar que el pic sólo ejecuta una tarea a la vez, por lo tanto sería un
desperdicio de espacio empezar desde más adelante.
org 0
org 23

Escribir el programa.

Escribir “end ” al final.


Nuestro primer programa

Programa 1:
Haga un programa que muestre el número 14.

list p=16f84a en esta parte se especifica el #


include <p16f84a.inc> de PIC a ocupar

org 0 indica el inicio del programa en la memoria

bsf STATUS,RP0
clrf TRISA Acá se establece el Puerto A
bcf STATUS,RP0 como salida de Datos

movlw b‟00001110‟ se le asigna el valor 14 a “ w”


movwf PORTA se muestra el valor en
el Puerto A

end FIN

Programa 2:
Por el puerto B se obtiene el dato del puerto A multiplicado por dos.

List p=16f84a
include <p16f84a.inc>

org 0
;este es un comentario
;acceso a banco 0
bsf STATUS,RP0
clrf TRISB ;si es cero = salida de datos
movlw 0xFF
movwf TRISA ; si son uno =entrada de datos
bcf STATUS,RP0

end
Programa 3:
Por el Puerto B se obtiene el dato introducido por el puerto A, pero los bits
pares de la salida se fijan siempre a “1”. El orden de los bits es B0, B1, B2…
B5, B6, B7; siendo los pares: B0, B2, B4, B6. Por ejemplo si se introduce por el
puerto A el dato „- - - 01100‟. En el puerto b se obtiene „- - - 11101‟

List p=16f84a
include <p16f84a.inc>

org 0

bsf STATUS,RP0
clrf TRISB
movlw 0xFF
movwf TRISA
bcf STATUS,RP0

inicio:
movf PORTA,0
iorlw b‟01010101‟
movf PORTB
goto inicio

end

Programa 4:
Por el puerto B se obtiene el contenido del puerto A pero los bits impares de la
salida de fijan a “0”.
List p=16f84a
include <p16f84a.inc>

org 0

bsf STATUS,RP0
clrf TRISB
movlw 0xFF
movwf TRISA
bcf STATUS,RP0

inicio:
movf PORTA,0
andlw b‟01010101
movf PORTB
goto inicio

end
Circuito quemador de PIC por puerto serie

R1 10 kOhm
R2 1,5 kOhm
C2 100 uF/16 V
C3 22 uF/16 V
D2 Diodo zener 5,1 V (1N4733a)
D6 Diodo zener 8,2 V (1N4738a)
D3, D4, D5, D7 1N4148
Q1, Q2 BC547B
Porta IC de 18 pines
Conector DB9 hembra.
Tableta de cobre, FeCL3, metro de cable utp,
Caja rectangular con tapadera.
Enlaces:

www.microchip.com
www.victoryvictor.net/pic.htm
www.microchip.com/downloads/en/DeviceDoc/35007b.pdf
http://perso.wanadoo.es/chyryes/tutoriales/pic0.htm
maicol_ut192@hotmail.com
www.ecacssc.blogspot.com

Vous aimerez peut-être aussi