lunes, 7 de mayo de 2012

Trabajo Practico N°3

"Programación de un microcontrolador de 8 bits"

En este trabajo, el objetivo es iniciarse en la programación de microcontroladores (en este caso, específicamente, el PIC16F84A), utilizando los lenguajes de programación Assembler y C. Además, se aprende sobre compiladores (MPASM para la programación en Assembler y PIC-C Compiler para la programación en C) y sobre simuladores (MPLAB SIM para la programación en Assembler y el Isis de Proteus para ambas programaciones). Para ello, se hizo que un LED parpareara cada aproximadamente 200ms.
Circuito esquemático en Kicad. Incluye el PIC16F84A a programar, el circuito oscilador (cristal y capacitores), el pulsador de Reset con una resistencia de 10K y el LED conectado a RB7 con una resistencia de 330Ω, en modo "sink".
Lo primero que realizamos fue dibujar el circuito esquemático con el software Kicad para saber dónde íbamos a conectar cada componente:
Cuando realizamos el circuito esquemático, se tomó la decisión de conectar el LED en el pin RB7 (pin 13 en el encapsulado del microcontrolador PIC16F84A) en modo "SINK" (debido a que el microcontrolador admite una mayor corriente que en el modo "SOURCE"), por lo que se conectó el led a una resistencia de 330Ω (para limitar la corriente que iba a pasar), y ésta a VCC (+5v).
Por eso, el LED se iba a prender cuando el valor de RB7 fuese un 0 lógico y se iba a apagar cuando fuese un 1 lógico.

Luego, procedimos a escribir la programación para que el programa cumpliese su objetivo en lenguaje Assembler, utilizando el software que provee Microchip llamado MPLAB (contiene un editor de código, un ensamblador y un simulador). El código resultante en Assembler fue:

; -----------------------------------------------------------------
; Descripción:
; Este programa hace parpadear a un LED conectado a RB7
; -----------------------------------------------------------------
 LIST  p=PIC16F84A
 INCLUDE  <p16f84a.inc>
 __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
 ERRORLEVEL -302
; -----------------------------------------------------------------
 RP0 EQU 5
 LED EQU 7
; -----------------------------------------------------------------
; Variables
 CBLOCK 0x0c
 d1
 d2
 ENDC
; -----------------------------------------------------------------
; -----------------------------------------------------------------
 #DEFINE BANK1 bsf STATUS,RP0
 #DEFINE BANK0 bcf STATUS,RP0
; -----------------------------------------------------------------
; -----------------------------------------------------------------
; 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 Principal
; -----------------------------------------------------------------
Inicio
 ; Configuramos el bit 7 de Port B como salida (RB7)
 BANK1
 bcf TRISB,LED
 BANK0


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
; -----------------------------------------------------------------

Nota: El código de la rutina del Delay de 200ms fue realizado mediante la página http://www.piclist.com/techref/piclist/codegen/delay.htm 
Una vez realizado esto, se realizó la programación en lenguaje C, con el software CCS. El código resultante en C fue:

#include "D:\Led_84_C\Led_84_C.h" 

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 

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

}

Código del Header (Led_84_C.h):

#include <16F84A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT
#use delay(clock=4000000)


Con las dos programaciones realizadas decidimos simular las dos, para asegurarnos de que el software se comportase respetando la programación, verificando de ésta manera el funcionamiento de nuestro código.
Primero, utilizamos el simulador que incluye el MPLAB, el MPSIM. Con éste programa, verificamos el cambio de valor del pin RB7 y que éste se realizase según el tiempo establecido (200ms aproximadamente).
Luego, procedimos a realizar la simulación utilizando el software Isis de Proteus. Para ello, realizamos el circuito esquemático en este software, similar al realizado con el Kicad (con la diferencia de que el clock se configuró mediante herramientas de configuración del Isis, por lo que no se incluyó el oscilador de 4MHz, ni los dos capacitores que se utilizan para manejar el clock).
Después se cargó el archivo ".hex" generado por el compilador del CCS (el PIC-C Compiler) y se verificó el funcionamiento de encendido y apagado del LED y su velocidad mediante un osciloscopio del Isis, para asegurarnos de que funcionase correctamente a 200ms (aproximadamente). Luego se realizó lo mismo, pero con el ".hex" generado por el MPASM (ensamblador del MPLAB).
Se pueden ver las pruebas en el siguiente video:
Habiendo comprobado que todo funcionase según nuestros requerimientos, procedimos a armar el circuito esquemático realizado en el Kicad en una protoboard, incluyendo (en otro sector de la misma) todo el conexionado necesario para la programación del microcontrolador y para la alimentación de la placa con VCC de 5v obtenidos por el puerto usb de la computadora y GND o VSS, obtenida también por el puerto usb.

Circuito armado en el protoboard. En el centro de la protoboard se puede observar el circuito con el PIC16F84A,  cristal, capacitores, resistores, LED, y pulsador (con unos puentes de conexión). En el sector de la derecha de la imagen se puede observar los conectores de programación del PICKIT 2 Clone, donde se colocó el microcontrolador para programarlo y de donde se obtiene la tensión con la que trabaja el circuito (+5V obtenidos por el puerto USB de la computadora).
En la imagen anterior, se puede observar en el sector izquierdo de la protoboard  el sector en que colocamos al microcontrolador cuando debía estar en funcionamiento, y en el derecho el conexionado para colocar al microcontrolador para pasarle la programación, mediante el programador PICKIT 2 Clone, realizado en la práctica 1, con el software "PICkit 2 Programmer", que se obtiene gratuitamente de la página oficial de Microchip (al igual que el MPLAB con todos sus componentes).
Luego, programamos al PIC16F84A con uno de los ".hex" generado anteriormente, comprobamos el tiempo de encendido y apagado del LED mediante un osciloscopio digital. Luego, hicimos lo mismo, pero con el otro ".hex". Los resultados se pueden apreciar en las siguiente imágenes:
Medición del tiempo, para comprobar que tardase los 200ms que corresponden, según las instrucciones de la actividad, con la programación hecha en Assembler.

Medición del tiempo, para comprobar que tardase los 200ms que corresponden, según las instrucciones de la actividad, con la programación hecha en C.
También, decidimos grabar un video del funcionamiento con el microcontrolador programado con uno de los archivos ".hex", utilizados también en el paso anterior:
 

Descarga de los archivos utilizados en éste proyecto (proyecto Kicad con el esquemático, diseño en Isis para simulación, proyecto de MPLAB y proyecto de CCS): http://www.mediafire.com/?v9htc2700g5lsd5

1 comentario:

  1. I just want to thank you for sharing your information and your site or blog this is simple but nice Information I’ve ever seen i like it i learn something today. Empresas de ensamble

    ResponderEliminar