lunes, 14 de mayo de 2012

Trabajo Práctico Nº 3: "Programar el PIC16F84A en: lenguaje ensamblador y en lenguaje C"

Objetivos para esta actividad

  • Armar un circuito en el protoboard.
  • Programar el microcontrolador en lenguaje ensamblador.
  • Programar el microcontrolador en lenguaje C.
  • Verificar el funcionamiento del programa usando el simulador integrado en el MPLAB y el programa PROTEUS.
  • Verificar el funcionamiento final del conjunto hardware y software programando el microcontrolador, usando para ello el programador PICKIT2.
  • Medir la forma de onda con el osciloscopio, capturarla mostrando el periodo/frecuencia de la señal mediante los cursores.

Introducción teórica:

Lenguaje Ensamblador:

Con el término de software se designan todas las instrucciones con las que se indica a un microprocesador o microcontrolador que hacer. El repertorio de instrucciones que el microprocesador reconoce se denomina conjunto de instrucciones. Su forma dependerá del microprocesador que se utilice. El conjunto de instrucciones necesarias para llevar a cabo una tarea dada se llama programa.
Los microprocesadores trabajan en código binario. Las instrucciones escritas en código binario se conocen como código de maquina. Escribir programas en este código es un proceso tedioso que requiere habilidad; esta sujeto a errores, dado que el programa es una serie de ceros y unos y no es fácil comprender el significado de las instrucciones con solo observar la secuencia. Una alternativa es utilizar un código taquigráfico de fácil comprensión para representar como ADDA. Este código taquigráfico se conoce como código mnemónico, y es un código “auxiliar para la memorización”. Este tipo de código se conoce como lenguaje ensamblador. Escribir un programa utilizando mnemónicos es más sencillo, porque son una versión abreviada de la operación que realiza una instrucción. También, dado que las instrucciones describen las operaciones del programa, se facilita su comprensión y se reduce la posibilidad de cometer errores, comparando con las secuencias binarias de la programación en código maquina. Sin embargo, todavía debe convertirse el programa ensamblador en código maquina, ya que solo este reconoce el microprocesador. Esta conversión se puede hacer a mano usando las hojas de especificaciones del fabricante que dan el código binario para cada mnemónico. También existen programas de computo para hacer la convención, estos programas se conocen como compiladores para lenguaje ensamblador.
Los lenguajes de alto nivel proporcionan un tipo de lenguaje de programación que describe de forma mas cercana y mas accesible el tipo de operaciones que se requieren. Ejemplos de estos lenguajes son BASIC, C, FORTAN y PASCAL. Sin embargo, aun es necesario convertir estos lenguajes a código de maquina usando un compilador para que lo pueda utilizar el microprocesador.

Programa utilizado para programar en lenguaje ensamblador: MPLAB 

Descargué el programa MPLAB.IDE de la pagina oficial de Microchip, y cargué un vídeo de como lo instale, eligiendo las opciones necesarias a usar. 


(El video, no esta muy bien hecho, por la primera vez que  use un editor de videos: Camtasia, pido compasion!!)
 
Lenguaje C:
C es un lenguaje de alto nivel que a menudo se utiliza en vez del lenguaje ensamblador para programar microprocesadores.
Cuando se compara con el lenguaje ensamblador, tiene  la ventaja de ser mas fácil de manejar y que un mismo programa se puede usar con microprocesadores diferentes; para ello, basta usar el compilador apropiado para traducir el programa C al código de maquina del microprocesador involucrado. El lenguaje ensamblador varía dependiendo del tipo de microprocesador mientras que C es un lenguaje estandarizado por el ANSI (American National Standards Institute).
 
Programa utilizado para programar en lenguaje C: PIC C

Los microcontroladores y El PIC16F84A:

Un microcontrolador es un circuito  integrado programable que contiene todos los componentes  necesarios para controlar el funcionamiento de una tarea determinada, como el control de una lavadora, un teclado de ordenador, una impresora, un sistema de alarma, etc. Para esto, el microcontrolador utiliza muy pocos  componentes asociados. Un sistema  con microcontrolador debe disponer de una memoria donde se almacena el programa que gobierna el funcionamiento del mismo que, una vez programado y configurado, solo sirve para realizar la tarea asignada. La utilización de un microcontrolador en un circuito reduce notablemente el tamaño y numero de componentes y en consecuencia, disminuye el número de averías y el volumen y el peso de los equipos, entre otras ventajas.
El microcontrolador es uno de los inventos más notables del siglo XX. En el mercado hay gran cantidad de ellos, con multitud de posibilidades y características. Cada tipo de microcontrolador sirve para una serie de casos y es el diseñador del sistema quien debe decidir cual es el microcontrolador mas idóneo para cada uso.
En los últimos años han tenido un gran auge los microcontroladores PIC fabricados por Microchip Technology Inc. Los PIC (Peripheral Interface Controller) son una familia de microcontroladores que ha tenido gran aceptación y desarrollo en los últimos años gracias a que sus buenas características, bajo precio, reducido consumo, pequeño tamaño, gran calidad, fiabilidad y abundancia de información, lo convierten en muy fácil, cómodo y rápido de utilizar.
El PIC16F84A esta encapsulado en un económico DIL de 18 pines, debido a sus múltiples aplicaciones y facilidad de uso es uno de los microcontroladores mas utilizados en la actualidad para la realización de proyectos sencillos.




Para empezar a escribir un programa sea en lenguaje ensamblador o lenguaje C, necesitamos tener como conocimientos previos:
  • El pin out del uC. 
  • El Master Clear (reset).
  • El reloj del sistema (Clock). 
  • Características eléctricas de los puertos.
  • Conexionado de distintos periféricos externos. 
  • Arquitectura del uC PIC16F84A. 
  • Registros SFR y GPR. 
  • Registro de configuración. 
  • Instrucciones y Directivas. 
  • Primeros pasos en C. 
  • Funciones. Funciones de I/O discretas, de temporización en C. Sentencias.
 Arquitectura del uC pic16f84a, Registros 

 
 Conexionado de distintos periféricos externos
  • El Oscilador:


 
  •  Conectar el PIC con un LED:(en este practico lo conectamos con RB7)
  •  Boton de Reset (MCLR:Master Clear)


---------------------------------------------------

Problema a resolver:

  Al microcontrolador PIC16F84A conectar un led al pin RB7. El programa deberá encender y apagar ese led cada 200ms aproximadamente (+/- 5%), usando un clock a cristal de 4MHz.

Pasos a seguir:
  1. Dibujar el esquemático en el KICAD.
  2. Armar el circuito en el protoboard.
  3. Programar en lenguaje ensamblador al uC con el MPLAB, resolviendo el programa solicitado.
  4. Programar en lenguaje C al uC con el CCS, resolviendo el programa solicitado.
  5. Verificar el correcto funcionamiento, usando el MPSIM y el PROTEUS.
1. Dibujar el esquemático en el KICAD.






2. Armar el circuito en el protoboard.






3. Programar en lenguaje ensamblador al uC con el MPLAB, resolviendo el programa solicitado.

Programa escrito, trabajo hecho con la ayuda del Grupo 4:

------------------------------------------------------------------

;El programa hace titilar a una Led conectado a RB7

    LIST p=PIC16F84A
    INCLUDE <P16F84A.inc>

    __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF 
;Config, es donde configuramos el tipo de oscilacion que vamos a usar...

    ERRORLEVEL -302
;Equivalencias:

    RP0 EQU 5
    LED EQU 7

; Variables
    CBLOCK 0x00     
     d1
    d2
    ENDC

; Vectores
    ORG    0x000
    goto Inicio        ; Vector de Reset
   
    ORG 0x004
    goto Isr        ; Vector de Interrupción
  

; Rutina de servicio de interrupción
Isr
    retfie

; Programa

Inicio
    ; Configuramos el bit 7 de Port B como salida (RB7)
    bsf STATUS,RP0
    bcf TRISB,LED
    bcf STATUS,RP0

Loop
    bcf PORTB, LED
    call Delay_200ms
    bsf PORTB, LED
    call Delay_200ms
    goto Loop

; Sub-Rutinas

; Delay = 0.2 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.2 seconds = 200000 cycles
; Error = 0 %
Delay_200ms
            ;199993 cycles
    movlw    0x3E
    movwf    d1
    movlw    0x9D
    movwf    d2
Delay_200ms_0
    decfsz    d1, f
    goto    $+2
    decfsz    d2, f
    goto    Delay_200ms_0

            ;3 cycles
    goto    $+1
    nop

            ;4 cycles (including call)
    return

END
-------------------------------------------------------------



4. Programar en lenguaje C al uC con el CCS, resolviendo el programa solicitado.

 --------------------------------------------------------------

void main()
{

   while(TRUE)
   {
      output_high (PIN_B7);
      delay_ms (200);
      output_low (PIN_B7);
      delay_ms (200);
   }
}
--------------------------------------------------------------------

5. Verificar el correcto funcionamiento, usando el MPSIM y el PROTEUS.

Verifique el funcionamiento del programa, con MPSIM, que es un simulador del MPLAB, lo que comprobe fue como cambia de 0 a 1,  RB7, en el tiempo predeterminado (200ms). Luego verique lo mismo con el PROTEUS(Isis), dibujando el esquemático en el mismo y cargando el . hex.




FIN DEL TRABAJO PRÁCTICO:

Trabajo terminado: Led titilando, gracias al pic16f84, programado en ensamblador:

 

El vídeo no es de buena calidad, luego trataremos de subir algo mas "prolijo"...