jueves, 12 de agosto de 2010

PIC 16F84 y su programación

Bueno amigos, como dije en la entrada anterior vamos a trabajar con los microcontroladores PIC  y particularmente con el modelo 16F84 (luego pasaremos al 16f877).
El PIC 16F84 se trata de uno de los microcontroladores más populares del mercado actual, ideal para principiantes, debido a su arquitectura de 8 bits, 18 pines, y un set de instrucciones RISC muy amigable para memorizar y fácil de entender. Internamente consta de:
§  Memoria Flash de programa (1K x 14).
§  Memoria EEPROM de datos (64 x 8).
§  Memoria RAM (68 registros x 8).
§  Un temporizador/contador (timer de 8 bits).
§  Un divisor de frecuencia.
§  Varios puertos de entrada-salida (13 pines en dos puertos, 5 pines el puerto A y 8 pines el puerto B).
Otras características son:
§  Manejo de interrupciones (de 4 fuentes).
§  Perro guardián (watchdog).
§  Bajo consumo.
§  Frecuencia de reloj externa máxima 10MHz. (Hasta 20MHz en nuevas versiones). La frecuencia de reloj interna es un cuarto de la externa, lo que significa que con un reloj de 20Mhz, el reloj interno sería de 5Mhz y así pues se ejecutan 5 Millones de Instrucciones por Segundo (5 MIPS)
§  No posee conversores analógicos-digital ni digital-analógicos.
§  Pipe-line de 2 etapas, 1 para búsqueda de instrucción y otra para la ejecución de la instrucción (los saltos ocupan un ciclo más).
§  Repertorio de instrucciones reducido (RISC), con tan solo 30 instrucciones distintas.
§  4 tipos distintos de instrucciones, orientadas a byte, orientadas a bit, operación entre registros, de salto.
Programación:
Microchip desarrollo un programa llamado MPLAB que se recomienda trabajar. Este programa y aunque a muchos no nos guste esta basado en un lenguaje de bajo nivel llamado assembler o ensamblador (en castellano). La programación con este leguaje no es estructurada ya que rompe con todos los principios de esta ultima debido al reiterado uso de la instrucción goto (ir a), no existe ninguna estructura de control (como ser el if, while, for). Se desarrollaron mucho editores para escribir los programas para PIC en otros leguajes de alto nivel como ser C,C++,BASIC, pero la desventajas de estos últimos es que utilizan mucha memoria de programa y a veces no juega en contra. Asi que por ahora vamos a aprender a programar un PIC 16f84 de 35 instrucciones con código assembler en el editor que microchip pone al alcance de los usuarios. Para descargar el MPLAB lo pueden hacer gratuitamente desde el siguiente link: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002
Set de instrucciones para el PIC 16F84
Notaciones para números:
  • Decimal : D'100'  ó  .100
  • Hexadecimal  : H'64'  ó  0x64  ó  64
  • Octal : O'144'
  • Binario : B'01101100'
  • ASCII : A'C'  ó  'C'
Notaciones para registros literales:
  • w : Registro W, similar al acumulador, es el registro de trabajo.
  • f  : Campo de 5 bits (fffff), contiene la dirección del banco de registros, que ocupa el banco 0 del área de datos. Direcciona uno de esos registros.
  • k : Representa una constante de 8 bits.
  • d : Bit del código OP de la instrucción. Selecciona el destino donde se guarda el resultado de una operación. Si d=0, el destino es W, y si d=1 el destino es f.
  • b : Determina la posición de un bit dentro de un registro de 8 bits, (o sea, tomará valores entre 0 y 7)
Símbolos:
  • [] : Opciones.
  • ()  : Contenido.
  • => : Se asigna a ...
  • <> : Campo de bits de un registro.
  • E : Pertenece al conjunto ...
  • Label : Nombre de la etiqueta.
  • TOS : Cima de la pila con 8 niveles en la gama media.
  • PC : Contador de programa que direcciona la memoria de instrucciones.
Banderas o flags:
Los Flags o banderas son marcadores, representados por bits dentro del registro STATUS, y son:
  • Z   : Flag de cero, se pone a 1 cuando una operación lógica o aritmética da 0 (cero) como resultado. En cualquier otro caso se pone a 0.
  • C   : Flag de Carry, se pone a 1 cuando la operación que le afecta sobrepasa el nivel de representación del procesador, en nuestro caso es de 8 BIT's , de esta manera si sumamos a 0b11111111 un 0b00000011 el resultado sería 0b00000010 y el BIT de Carry pasaría a 1.
  • DC : Flag de carry del nibble inferior, este se comporta igual que el BIT de Carry, solo que el límite de representación son los 4 bits inferiores, de esta manera si tenemos 0b00001111 y sumamos 0b00000111, el resultado será 0b00010110 y el BIT de DC se pone a 1, el BIT de Carry estará a 0 al no superarse los 8 bits y el de Z a 0 al ser el número diferente de 0.
No te preocupes si te quedan dudas respecto a los FLAGS, éstas se aclararán a medida que vayas avanzando en el tutorial.
Instrucciones:
A las instrucciones para programar las puedes ver desde el siguiente sitio: http://micropic.galeon.com/instrucciones.htm 
Cualquier duda que tengas lo analizaremos. De todas formas no te preocupes por saber todas las instrucciones, eso se adquiere con la practica.. y a medida que siga el tutorial vas a poder ver como trabaja cada una.
Estas instrucciones las pueden sacar de la hoja de datos del micro, que la pueden descargar del siguiente link: http://www.datasheetcatalog.net/es/datasheets_pdf/1/6/F/8/16F84.shtml
¿Qué son las demoras?
El PIC 16f84 con un reloj de 4Mhz realiza 1000000 (un millón) de instrucciones por segundo, lo que quiere decir que para hacer una rutina que se adapte a tiempos que predeterminemos debemos hacer demoras entre tareas.
Las demoras o retardos son subrutinas del programa que básicamente lo que hacen es un bucle controlado con el fin de ajustar los procesos a los tiempos determinados por el programador. Por ejemplo si quiero prender un led por 5 segundos, deberé  activar la salida en la que esta conectada el led y luego hacer un bucle que equivalga en tiempo a 5 segundos. Para esto existen diversos cálculos… pero encontré un programa muy preciso que los hace bastante bien con tan solo poner la cantidad de segundos. Se llama PICloops y lo pueden descargar del siguiente link: http://www.biltronix.com/picloops.html.


Microcontroladores

Microcontroladores

Bueno amigos, voy a dar una breve explicación sobre que es un microcontrolador y que hace. Un microntrolador es un dispositivo electrónico programable, que tiene como estructuras básicas de funcionamiento, una memoria de trabajo, una unidad central de proceso (ALU) y los puertos de entrada salida. Estas características variar según el modelo de microcontrolador y la marca con la que trabajemos. A continuación les dejo una tabla que da un poco de idea acerca de la variedad de microcontroladores:
Empresa
8 bits
12 bits
14 bits
16 bits
32 bits
64 bits
Observaciones
x
x
x
x
MCS-48(familia 8048)
MCS51(familia 8051)
8xC251
x
x
x
x
x
National Semiconductor
x
x
x
x
x
x
Familia 10f2xx Familia 12Cxx Familia 12Fxx, 16Cxx y 16Fxx 18Cxx y 18Fxx
PIC24F, PIC24H y dsPIC30FXX,dsPIC33F con motor dsp integrado
PIC32
x
x
NXP
(antes Philips)
80C51
XA
Cortex-M3, Cortex-M0, ARM7, ARM9
Parallax
Renesas
(antes Hitachi y Mitsubishi)
x
x
Texas Instruments
C2000, Cortex-M3 (ARM) , TMS570 (ARM)

 Los microcontroladores con los que vamos a trabajar nosotros son los denominados PIC.
Microcontroladores PIC:
Los PIC son una familia de microcontroladores tipo RISC fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la división de microelectrónica de General Instrument.
El nombre actual no es un acrónimo. En realidad, el nombre completo es PICmicro, aunque generalmente se utiliza como Peripheral Interface Controller (controlador de interfaz periférico).
El PIC original se diseñó para ser usado con la nueva CPU de 16 bits CP16000. Siendo en general una buena CPU, ésta tenía malas prestaciones de E/S, y el PIC de 8 bits se desarrolló en 1975 para mejorar el rendimiento del sistema quitando peso de E/S a la CPU. El PIC utilizaba microcódigo simple almacenado en ROM para realizar estas tareas y aunque el término no se usaba por aquel entonces, se trata de un diseño RISC que ejecuta una instrucción cada 4 ciclos del oscilador.
En 1985 la división de microelectrónica de General Instrument se separa como compañía independiente que es incorporada como filial (el 14 de diciembre de 1987 cambia el nombre a Microchip Technology y en 1989 es adquirida por un grupo de inversores) y el nuevo propietario canceló casi todos los desarrollos, que para esas fechas la mayoría estaban obsoletos. El PIC, sin embargo, se mejoró con EPROM para conseguir un controlador de canal programable. Hoy en día multitud de PICs vienen con varios periféricos incluidos (módulos de comunicación serie,UARTs, núcleos de control de motores, etc.) y con memoria de programa desde 512 a 32.000 palabras (una palabra corresponde a una instrucción en ensamblador, y puede ser 12, 14 o 16 bits, dependiendo de la familia específica de PICmicro).
Basicamente los PIC se dividen en dos familias: los PIC  de gama baja por un lado y los PIC de gama baja por otro lado.
PIC de gama baja: Los PIC de gama baja son PIC que tienen juegos de 35 instrucciones para programar, no son buenos para procesar grandes lotes de información. Dentro de esta familia se encuentra el famoso PIC 16f84 que es uno de los mas usados.
PIC de gama alta: Esta familia de PIC tienen juegos de 70 instrucciones para programar. Los PIC de alta gama verdaderamente son poderosas herramientas para procesar información…desde la serie de los 18Fxxx hasta los dsPIC  de 32 bits, poseen puertos de E/S con comunicación usb entre otras. Algunas de estos poseen hasta 100 patas, y pueden procesar hasta imágenes y videos!!
Para averiguar mas información sobre los PIC aconsejo leer un buen libro o buscar mas información en internet… nosotros nos vamos a enfocar en la programación de estas bellezas de la ingeniería.