jueves, 26 de junio de 2014

PIC16F877A ARQUITECTURA

El microcontrolador PIC16F877 consta de un procesador, memoria de programa y memoria de datos, periféricos de entrada / salida, convertidores de AD y DA, módulos de transmisión y recepción de datos.
La arquitectura del microcontrolador es cerrada debido a que no se puede tener ningún contacto directo con el procesador interno del microcontrolador, en cambio en un microprocesador la arquitectura es abierta,  debido a que podemos agregar mas dispositivos en hardware dependiendo de las necesidades.
Los microcontroladores PIC16F877 cuentan con un set de instrucciones reducido en cambio la mayoría de los microprocesadores tienen gran cantidad de instrucciones. La mayoría de los microcontroladores posee una arquitectura Harvard mientras los microprocesadores  poseen una arquitectura Von Neuman.





Los microcontroladores se aplicación en las industrias para resolver problemas específicos por ejemplo: los  electrodomésticos, en la industria automotriz, en el procesamiento de imagen y video entre otros.

Cracterísticas PIC 16F877A
  • Procesador de arquitectura RISC avanzada
  • Juego de 35 instrucciones con 14 bits de longitud.
  • Todas las instrucciones de un solo ciclo, excepto para el programa ramas, que son de dos tiempos
  • Frecuencia de 20 Mhz
  •  Hasta 8K palabras de 14 bits para la memoria de código, tipo flash.
  •  Hasta 368 bytes de memoria de datos RAM
  • Hasta 256 bytes de memoria de datos EEPROM
  • Hasta 14 fuentes de interrupción internas y externas
  • Pila con 8 niveles
  • Código de protección programable
  • Modo Sleep de bajo consumo
  • Programación serie en circuito con 2 patitas
  • Voltaje de alimentación comprendido entre 2 y 5.5 voltios
  • Bajo consumo (menos de 2 mA a 5 V y 5 Mhz)
  • Hasta 256 x 8 bytes de memoria EEPROM de datos
  • Perro guardián (WDT)
  • Modos de direccionamiento directo, indirecto y relativo


ARQUITECTURA INTERNA DEL PIC 16F877A
El  PIC16F877A es un  procesador tipo RICS que es un procesador de instrucciones reducidas, por su pequeño número de instrucciones, además casi todas se realiza en la misma cantidad de tiempo, posee unidades que trabajan en paralelo conectadas por pipes o tuberias. Este procesador emplea una arquitectura Harvard lo que significa que trabaja las zonas de memoria de programa y datos en forma separada. 


La memoria del Programa en la parte superior izquierda con 8K posiciones por 14 bits, también esta la memoria de datos (RAM) de 368 posiciones por 8 bits. La memoria EEPROM 256 posiciones x 8 bits. El procesador que está formado por la ALU (unidad aritmetica lógica) el registro de trabajo W. Tambien están los periféricos I/O Port A, B, C, D, E el TMR0 (temporizador contador de eventos), TMR1 y TMR2 entre otros. También observamos un registro de instrucción que se carga cada vez que el ALU solicita una nueva instrucción a procesar.




En la parte intermedia encontramos el Status Reg. que es el registro de estado encargado de anotar el estado actual del sistema, cada vez que se ejecuta una instrucción se llevan a cabo cambios dentro del PIC 16F877A como desborde, acarreo, etc. Cada uno de esos eventos está asociado a un bit de este registro. Existe el Program Counter o contador de programa este registro indica la dirección de la instrucción a ejecutar. El registro en cuestión no es necesariamente secuencial, esto es no se incrementa necesariamente de uno en uno ya que puede darse el caso en el que salte dependiendo si hay una instrucción de bifurcación de por medio o puede haber alguna instrucción de llamada a función y/o procedimiento. También tenemos el bloque de la pila, cuya  función es ser un buffer temporal en el que se guarda el contador de programa cada vez que se suscita una llamada a un procedimiento y/o función (incluyendo interrupciones). Por tanto el nivel de anidamineto es de hasta 8 llamadas.

ORGANIZACION DE MEMORIA DEL PIC 16F877A


La memoria del PIC 16F877A se divide en memoria de datos y programa. La de datos a su vez se divide en:

• SFR (Registros de propósito especial) :Son registros que ayudan a configurar el hardware interno asi como sirven para escribir o leer valores de los diferentes componente que constituyen el PIC 16F877A. Por ejemplo con el  registro “TRISB” podemos configurar el modo de trabajo de las líneas del puerto B
• GFR (Registros de propósito general): Estos  son posiciones de memoria que podemos usar para almacenar valores que emplean nuestros programa.





La memoria de datos del PIC 16F877A se divide en cuatro bancos. Las posiciones bajas siempre están reservadas para los SFR en tanto que las altas para los GFR.

El PIC 16F877A también cuenta con una memoria EEPROM, con 256 posiciones, para acceder a la memoria no podemos leer o escribir directamente es decir colocar la dirección y obtener o dejar el valor. Para eso haremos uso de registros adicionales de tal manera que la usaremos indirectamente.

INSTRUCCIONES PIC 16F877A
Este PIC 16F877A consta de 35 instrucciones con las cuales las podemos dividir en tres grupos
Instrucciones orientadas a byte : Estas reservan los 7 bits de menor peso donde se  indica la dirección del registro que será operado. Realizada la operación usamos el bit d para indicar donde será almacenado el resultado.
Instrucciones orientas a bit: Estas se encargan  escribir o leer una posición (bit) dentro de un registro. Una los 7 bits inferiores son destinados para indicar la dirección de registro que vamos a operar y los siguientes tres bit especifican el bit dentro del registro.
Literales o de control: nos sirven para crear bucles o llamar subrutinas a realizar.

PRENDER APAGAR UN LED PIC16F877A ASSEMBLER

Comenzaremos a hacer un programa sencillo en el cual podremos en assembler usando el PIC 16F877A para prender y apagar un led presionando un pulsador como se muestra en el diagrama.

Haremos uso de dos puertos del PIC 16F877A, el puerto B y el puerto D, declararemos al puerto B como entrada y el puerto D será configurado como salida.  En el grafico podemos observar que el pin RB0 está puesto el pulsador y una resistencia en  una configuración pull up, cuando no se está presionando el pulsador se pone un valor alto (5V) a la entrada RB0 y cuando se presiona se le pone un nivel bajo (0V).  En la salida RD0 para que encienda el led su salida debe estar a un nivel bajo por eso al momento de desarrollar el programa en assembler deberemos testear el pin BB0 y si esta en un nivel alto pondremos un valor alto en la salida RD0 que mantendra apagado el led, caso contrario pondremos un valor bajo en la salida RD0 lo cual hara que el led encienda.



PROGRAMA EN ASSEMBLER PARA EL PIC 16F877A
Para realizar el programa utilizaremos el MPLABX 2.0
Abrimos el programa MPLABX IDE.

  • Hacemos clic en file, seleccionamos New Project...
  • En ventana “Choose Project” que emerge seleccionamos “ Microchip Embedded “ y “Standalone Project”  ,luego hacemos clic en “next”.
  • En la ventana que emerge ”Select Device” dejamos el recuadro de “Family” en “all  families” y en el recuadro de “Device” digitamos “PIC16F877A” , luego presionamos “next”.
  • En la ventana “Select Tool”  seleccionamos “Simulator” y cliqueamos “Next”.
  • En “Select compiler” seleccionamos “mpasm(v5.54)[……..”.
  • Ahora seleccionamos la ubicación y nombre del proyecto.
  • Una vez creado el proyecto seleccionamos  New File y aparecerá una ventana “Choose File Type” y seleccionamos “assembler” si no aparece en la lista seleccionamos “Other” aparecerá una nueva lista donde podremos seleccionar “assembler”.
  • Luego podrás ponerle nonbre a File y seleccionar una carpeta dentro del proyecto y listo.
Ahora es momento de escribir el programa en assembler que se grabara en el pic 16f877a será el siguiente: