martes, 2 de julio de 2013

Guia1 del PIC 16F84A



Guía de laboratorio No 1
    “Programación del PIC 16F84A”.





Un microcontrolador, es un circuito integrado programable que contiene los elementos necesarios para controlar un sistema.

PIC significa Peripheral Interface Controler es decir un controlador de periféricos.

Cuando hablamos de un circuito integrado programable que controla periféricos, estamos hablando de un sistema que contiene entre otras cosas una unidad aritmético-lógica, unas memorias de datos y programas, unos puertos de entrada y salida, es decir estamos hablando de un pequeño ordenador diseñado para realizar unas funciones específicas.

Podemos encontrar microcontroladores en lavadoras, teclados, teléfonos móviles, ratones etc.

Hay multitud de microcontroladores con más memoria, entradas y salidas, frecuencia de trabajo, coste, subsistemas integrados y un largo dependiendo de cada tipo de microcontrolador.

El microcontrolador PIC 16F84 del fabricante Microchip Technology Inc es un sistema sencillo, barato y potente para muchas aplicaciones electrónicas.

Las características del controlador las podemos encontrar en la web del fabricante www.microchip.com

Las terminales del PIC 16F84  son 18 en el modelo A y son las siguientes:

 


Estructura interna del microcontrolador






Características:

Alimentación:
El PIC se alimenta a 5 V entre los puntos Vdd (+) y Vss (-). El consumo del circuito depende de las cargas en los puertos y de la frecuencia de trabajo.

Frecuencia de trabajo:
Los PIC's necesitan un reloj oscilador que marcará la frecuencia de trabajo.
Estos osciladores pueden ser del tipo :

RC Formado por una resistencia y un condensador
HS se utiliza un cristal de cuarzo o resonador cerámico
XT Cristal o resonador hasta 4 Mhz
LP Bajo consumo (hasta 200Khz)

Los osciladores se colocan entre las terminales OSC1 y OSC2

Puertos de ENTRADA/SALIDA
Los puertos son entradas y salidas del microcontrolador al exterior, por ellas
enviamos o introducimos señales digitales TTL (5V) de forma que podemos
comunicar el microcontrolador con el exterior.

En este caso tenemos 2 puertos de entrada y salida E/S. Sus nombres son RA y RB.

El puerto RA tiene 5 pines RA0-RA4, un caso particular es RA4/TOCK1 que puede actuar como pin de entrada o como entrada de impulsos para un contador denominado TMRO

El puerto RB tiene 8 líneas que van desde RB0-RB7 .Cada línea del RA o del RB se puede configurar como entrada o salida mediante 2 registros llamados TRISA y TRISB.

Con esta información podemos montar un sencillo entrenador para PIC's 16F84
con el puerto RA como entrada y el puerto RB como salida. Utilizaremos como
entrada unos microinterruptores y como salida unos leds conectados al puerto
RB0-RB7.





Memorias.
Todo dispositivo programable necesita de una memoria para poder almacenar el programa, poder manejar variables y almacenar datos.



MEMORIA DE PROGRAMA
En el PIC 16F84 la memoria de programa o de instrucciones es una memoria tipo FLASH de 1K. En esta memoria almacenaremos el programa que ejecutará el microcontrolador.

Existe un registro especial llamado contador de programa PC cuya finalidad es avanzar por las instrucciones del programa de forma secuencial excepto cuando se encuentran instrucciones de salto.

Mapa de memoria de programas




MEMORIA DE DATOS
La memoria de datos sirve para almacenar variables, leer puertos de entrada o
escribir en los puertos de salida, podemos también acceder al temporizador o al registro EEPROM

La memoria de datos en el PIC 16F84 está formada por dos zonas:
MEMORIA RAM de 68 registros de propósito general (SRAM)
MEMORIA EEPROM de 68 registros cuya característica principal es que no se
perderán los datos cuando se desconecta la alimentación.


Mapa de memoria de datos


Esta memoria está formada por dos bancos Banco0 y Banco1, los primeros registros son llamados de propósito específico y están desde la dirección de memoria 00h – OBh para el Banco0 y desde la dirección  80h – 8Bh para el Banco1.


Mapa de memoria RAM detallada de los registros de propósito especifico



Otras características:
Dentro del microcontrolador hay unos registros especiales que determinan algunas de las características notables del microcontrolador:

- Temporizador/Contador TMR0
- Perro guardián watchDog (WD)
- Interrupciones.
- Reset .(Reinicio del sistema)



DISEÑO DE PROYECTOS
Frente a un problema técnico, hay que buscar una solución de forma barata y
sencilla, en este proceso de búsqueda de soluciones, los microcontroladores PIC pueden ayudarnos a realizar soluciones sencillas, rápidas y baratas.

Partiremos de un planteamiento teniendo presente todas las variables que afectan al sistema, desarrollaremos la idea y la implementaremos con las herramientas adecuadas.

Diagrama de flujo del desarrollo de proyectos con microcontrolador:




PROGRAMACIÓN EN ENSAMBLADOR PIC 16F84
Para programar un PIC 16F84 necesitamos conocer las instrucciones para generar el código fuente para posteriormente compilarlo por ejemplo con MPASM, emular el programa y poder grabarlo para implementarlo en el circuito correspondiente.

El listado de instrucciones de microchip (el fabricante del microcontrolador) son
las siguientes:



MNEMÓNICO
OPERANDOS
OPERACION
DESCRIPCION   
f,d
w + fd
Suma el contenido del registro w al contenido del registro f, y almacena el resultado en w si d = 0, y en el registro f si d = 1.
f,d
w AND fd
Efectúa la operación AND lógico entre el contenido del registro w y el contenido del registro f, y almacena el resultado en w si d = 0, y en f si d = 1.
Esta instrucción realiza la operación AND bit a bit.
f
00 h → f
Se borra el contenido del registro f y el flagZ se activa
-
00 h → w
El registro de trabajo w se carga con 00h. El flag Z se pone a 1
f,d
Complemento de fd
Hace el complemento del contenido del registro f bit a bit. El resultado se almacena en el registro f si d=1 y en el registro w si d=0, en este caso f no varía.
f,d
f - 1 → d
Se decrementa el contenido del registro f en una unidad. El resultado se almacena en f si d=1 y en w si d=0, en este caso f no varía.
f,d
f - 1 → d (si es 0 salta)
Decrementa el contenido del registro f en una unidad, el resultado se almacena en f si d=1 y en w si d=0, en este caso, f no varía. Si el resultado es cero, se ignora la siguiente instrucción y, en ese caso la instrucción tiene una duración de dos ciclos.
f,d
f + 1 → d
Se incrementa en una unidad el contenido del registro f, si d=1 el resultado se almacena en f, si d=0 el resultado se almacena en w, en este caso el resultado de f no varía.
f,d
f + 1 → d (si es 0 salta)
Incrementa el contenido del registro f en una unidad, el resultado se almacena de nuevo en f si d=1, y en w si d=0, en este caso, f no varía. Si el resultado es cero, se ignora la siguiente instrucción y, en ese caso la instrucción tiene una duración de dos ciclos.
f,d
w OR fd
Efectúa la operación lógica OR entre el contenido del registro w y el contenido del registro f, y almacena el resultado en f si d=1 y en w si d=0.Esta instrucción realiza la operación OR bit a bit.
f,d
fd
El contenido del registro f se carga en el registro destino dependiendo del valor de d. Si d=0 el destino es el registro w, si d=1 el destino es el propio registro f. Esta instrucción permite verificar dicho registro ya que el flagZ queda afectado.
f
wf
Mueve el contenido del registro w al registro f
-
No operación
No realiza operación alguna, pero sirve para consumir un ciclo de instrucción, equivalente a 4 de reloj.
f,d
Rota fizq por carryd
Rotación de un bit a la izquierda del contenido del registro f, pasando por el bit de acarreo C,desde los bits menos significativos a los más significativos. El bit D7 pasa al CARRY del registro STATUS, el contenido del CARRY pasa al D0, el D0 al D1, etc. Es como si multiplicáramos por dos el contenido del registro.
Si d=1 el resultado se almacena en f, si d=0 el resultado se almacena en w.
f,d
Rota fdcha por carryd
Rotación de un bit a la derecha del contenido del registro f, pasando por el bit de acarreo C,desde los bits más significativos a los menos significativos. El bit C del registro STATUS pasa al D7, el D0 pasa al bit C, el D1 al D0, etc. Es como si dividiéramos por dos el contenido del registro.
Si d=1 el resultado se almacena en f, si d=0 el resultado se almacena en w
f,d
f - wd
Resta en complemento a dos el contenido del registro f menos el contenido del registro w almacena el resultado en w si d=0 y en f si d=1.
f,d
Intercambia nibbles de f → d
Los cuatro bits de más peso del registro f se intercambian con los 4 bits de menos peso del mismo registro. Si d=0 el resultado se almacena en w, si d=1 el resultado se almacena en f.
f,d
w XOR fd
Realiza la función OR-Exclusiva entre el contenido del registro w y la constante k de 8 bits. El resultado se almacena en w.
Esta instrucción realiza la operación EXOR bit a bit.


MNEMÓNICO

OPERACION
DESCRIPCION
f,b
Pone a 0 bit b de registro f
Pone a cero el bit número b del registro f.
f,b
Pone a 1 bit b de registro f
Pone a 1 el bit b del registro f
f,b
Salto si bit b de reg. f es 0
Si el bit número b del registro f es cero, la instrucción que sigue a ésta se ignora y se trata como un NOP (skip). En este caso, y sólo en este caso, la instrucción BTFSC precisa dos ciclos para ejecutarse.
f,b
Salto si bit b de reg. f es 1
Si el bit número b del registro f está a 1, la instrucción que sigue a ésta se ignora y se trata como un NOP (skip). En este caso, y sólo en este caso, la instrucción BTFSS precisa dos ciclos para ejecutarse.

MNEMÓNICO
OPERANDOS
DESCRIPCIÓN
BANDERAS
k
w + kw
Suma el contenido del registro w al literal k, y almacena el resultado en w.Si se produce acerreo el flagC se pone a "1".
k
w AND kw
Efectúa la operación AND lógico entre el contenido del registro w y el literal k, y almacena el resultado en w.
Esta instrucción realiza la operación AND bit a bit.
k
Llamada a subrutina k
Salvaguarda la dirección de vuelta en la Pila y después llama a la subrutina situada en la dirección cargada en el PC.
El modo de cálculo de la dirección efectiva difiere según la familia PIC utilizada. También hay que posicionar PA2, PA1 y PA0 (PIC 16C5X) o el registro PCLATCH (En los demás PIC) antes de ejecutarse la instrucción.
-
Borra temporizador del WDT
Se borra tanto el registro WDT (watchdog) como su preescaler. Los bits T0# y PD# del registro de estado se ponen a "1".
k
Ir a dirección k
Salto incondicional, normalmente se utiliza para llamar a la subrutina situada en la dirección que se carga en PC.
El modo de cálculo de la instrucción carga desde el bit 0 al 10 de la constante k en el PC y los bits 3 y 4 del registro PCLATH en los 11 y 12 del PC
k
w OR k → w
Se realiza la operación lógica OR entre el registro w y el literal k. El resultado se almacena en el registro w.
Esta instrucción realiza la operación OR bit a bit.
k
kw
El registro w se carga con el valor de 8 bits del literal k
-
Retorno de una interrupción
Carga el PC con el valor que se encuentra en la parte alta de la Pila, asegurando así la vuelta de la interrupción. Pone a 1 el bit GIE, con el fin de autorizar de nuevo que se tengan en cuenta las interrupciones.
k
Retorno con k en w
Carga el registro w con el literal k, y después carga el PC con el valor que se encuentra en la parte superior de la PILA, efectuando así un retorno de subrutina.
-
Retorno de una subrutina
Carga el PC con el valor que se encuentra en la parte superior de la PILA, efectuando así un retorno de subrutina
-
Modo Standby
Pone al circuito en modo Sleep (bajo consumo) con parada del oscilador. Pone a 0 el flagPD# (Power Down) y el flagTO# (TimerOut) se pone a 1. Se puede salir de este estado por:
  1. Activación de MCLR para provocar un Reset.
  2. Desbordamiento del watchdog si quedó operativo en el modo reposo.
  3. Generación de una interrupción que no sea TMR0 ya que ésta se desactiva con la instrucción SLEEP.
k
k - ww
Resta en complemento a dos del contenido del literal k el contenido del registro w, y almacena el resultado en w.
k
w XOR kw
Realiza la función OR-Exclusiva entre el contenido del registro w y la constante k de 8 bits. El resultado se almacena en w.
Esta instrucción realiza la operación EXOR bit a bit.


Ejercicios:

Comprobar cada uno de los siguientes programas en lenguaje ensamblador del PIC 16F84A usando la herramienta de simulación MPLAB IDE y verificar el contenido de los registros tras ejecutar cada instrucción.


PROG1.ASM
; --------------------------------------------------------------------------------------------------------
; EL SIGUIENTE PROGRAMA SUMA 05 Y 02 en formato hexadecimal
; --------------------------------------------------------------------------------------------------------
                                                           COMENTARIOS
LIST P=16F84                    
SUMA1 EQU 0X0C           
SUMA2 EQU 0X0D                       
RESUL EQU 0X0E           
; --------------------------------------------------------------------------------------------------------
; Se han definido 3 variables SUMA, SUMA2 y RESUL en diferentes posiciones ; de la memoria de datos REGISTER FILE MAP
; --------------------------------------------------------------------------------------------------------
ORG 0
; --------------------------------------------------------------------------------------------------------
; Origen de las instrucciones en el PROGRAM MEMORY MAP
; --------------------------------------------------------------------------------------------------------
                                W    SUMA1    SUMA2           RESUL        COMENTARIO
movlw 0X05                       
movwf SUMA1                  
movlw 0X02                       
movwf SUMA2                  
movfw SUMA1                  
addwf SUMA2 , 0              
movwf RESUL                  
END                                     
;---------------------------------------------------------------------------------------------------------


PROG2.ASM
Sumar en binario 0001 y 0010. Guardar el resultado en 0x0E

LIST P=16F84                    
SUMA1 EQU 0X0C           
RESUL EQU 0X0E                       
; --------------------------------------------------------------------------------------------------------
; Se han definido 2 variables SUMA y RESUL en diferentes posiciones de la  ;memoria de datos en el REGISTER FILE MAP
; --------------------------------------------------------------------------------------------------------
ORG 0
; --------------------------------------------------------------------------------------------------------
; Origen de las instrucciones en el PROGRAM MEMORY MAP
; Directiva de compilación
; --------------------------------------------------------------------------------------------------------
movlw b'0001'       
movwf SUMA1       
movlw b'0010'       
addwf SUMA1 , 0  
movwf RESUL       
END                          



PROG3.ASM
; --------------------------------------------------------------------------------------------------------
; PROG3.ASM PROGRAMA PARA SUMAR EN BINARIO 2 Y 3
; RESULTADO GUARDADO EN 0X0D
; --------------------------------------------------------------------------------------------------------
LIST P=16F84                    
SUMA1 EQU 0X0C           
RESUL EQU 0X0D                       
; --------------------------------------------------------------------------------------------------------
; Se han definido 2 variables SUMA1 y RESUL
; en diferentes posiciones de la memoria de datos en el REGISTER FILE MAP
; --------------------------------------------------------------------------------------------------------
ORG 0
; --------------------------------------------------------------------------------------------------------
; Origen de las instrucciones en el PROGRAM MEMORY MAP
; --------------------------------------------------------------------------------------------------------
movlw b'0010'       
movwf SUMA1       
movlw b'0011'       
addwf SUMA1 , 0  
movwf RESUL       
END                          
;--------------------------------------------------------------------------------------------------------




PROG4.ASM
; --------------------------------------------------------------------------------------------------------
; SUMA EN DECIMAL 3 Y 5 RESULTADO EN 0X12
; --------------------------------------------------------------------------------------------------------
LIST P=16f84
SUM      EQU 0x10
RESUL EQU 0x12
ORG 0
;---------------------------------****** INICIO *****------------------------------------------------
movlw d'3'              
movwf SUM            
movlw d'5'              
addwf SUM,0         
movwf RESUL       
END
;---------------------------------------------------------------------------------------------------------


Ejercicios propuestos
- Sumar cuatro números en binario (0,1,2,3)

- Sumar tres números y almacenar los números y el resultado en las direcciones 0x0c 0x0d 0x0e 0x0f

 - Sumar 2 números, almacenar el resultado en 0x0d, borrar el contenido del  registro SUM y borrar el contenido del registro acumulador W


PROG5.ASM
Cargar el número 5 en 1Ah (VALOR1) y incrementar dos veces (Almacenar en 1ch)
;---------------------------------------------------------------------------------------------------------
; Programa que incrementa el valor 5
; --------------------------------------------------------------------------------------------------------
LIST P=16F84
VALOR EQU 1Ah              
ORG 0
;---------------------------------------------------------------------------------------------------------
; INICIO
;---------------------------------------------------------------------------------------------------------
INICIO
movlw h'5'                          
movwf VALOR                  
incf VALOR,1                     
incf VALOR,1
END
;---------------------------------------------------------------------------------------------------------



PROG6.ASM
DECREMENTAR UN VALOR

LIST p=16F84
v equ 0x0a
org 0
inicio
movlw 0x05
movwf v
decf v,1
decf v,1
movfw v
end


Ejercicios propuestos
-       Restar dos números binarios y almacenar el resultado en la dirección 0x10

-       Decrementar el valor 10 cinco veces y almacenarlo en la dirección 0x2b


PROG7.ASM
Realiza una operación AND entre dos registros
;---------------------------------------------------------------------------------------------------------
list p=16f84
reg1   equ    0xa0
reg2   equ    0xa1
res       equ    0xa2

org 0
;---------------------------------------------------------------------------------------------------------
Inici0
movlw b'01110011'          
movwf reg1                        
movlw b'01010101'          
movwf reg2                                    
andwf reg1,0                      
movwf res                          
end











PROG8.ASM
Realizar operación OR entre un registro y un literal

;--------------------------------------------------------------------------------------------------------
list p=16f84
reg1   equ     0xa0
res      equ      0xa1
org 0
;--------------------------------------------- inicio del programa------------------- --------------
inicio
movlw b'00001100'
movwf reg1
iorlw b'00110000'
movwf res
end
;---------------------------------------------------------------------------------------------------------


PROG9.ASM
Rotar dos veces hacia la izquierda el contenido de un registro
; --------------------------------------------------------------------------------------------------------
; rotar el valor 00111111 2 veces a la izquierda
;---------------------------------------------------------------------------------------------------------
list p=16f84
regequ 0x0b
org 0
;---------------------------------------------------------------------------------------------------------
inicio
movlw b'00000110'
movwfreg
rlf reg,1
rlf reg,1
end



Ejercicios propuestos
-Realizar una rotación 4 veces hacia la derecha de un registro de valor
'10110000'

-Realizar una OR Exclusiva de val1='00110101' y val2='10100110'

-Intercambiar los 4 bits menos significativos por los cuatro más  Significativos del valor b'00111010', almacenarlos en un registro