Mis primeros programas

Los primeros programas en assembler o la primera vez que programamos un PIC resulta algo complicado, ya que, por otro lado, estamos probando nuestro programador de PICs, también que nuestro PIC funcione correctamente y luego pensamos en todo lo que podemos hacer con este pequeño chip.

PIC16F84A

El pic 16F84A es uno de los más usados por todos los que se inician en el campo de la programación de microcontroladores, asi que el primer programa que haremos sera para este PIC. Antes de comenzar, debo mencionar que no presentare un tutorial de Assembler, pero les recomiendo este archivo para el PIC16F84A, donde están todas sus instrucciones y más.

Información recomendada

Programación PIC16F84A

Libro Microcontrolador PIC16F84 Desarrollo de proyectos

Más aún les brindare información sobre algunos puntos.
Toda esta información será suficiente para comenzar.

Programa

Este es el programa que recomiendo para comenzar.
Es el clásico “Hola mundo” de los programas en microcontroladores, el famoso “led intermitente” o led que parpadea o “Led Blink”.

  1. ;http://www.archimon-tx8.blogspot.com
  2. list p=16F84A
  3. include "p16f84a.inc"
  4.  
  5. ;Definicion de fuses
  6.  
  7. __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
  8.  
  9. ;Ubicacion de variables en banco de memoria
  10.  
  11. COUNT1 equ 0x0c
  12. COUNT2 equ 0x0d
  13.  
  14. ;Inicio de programa
  15.  
  16. org 0x00
  17.  
  18. ;Modo de operacion de puertos I/O, interrupciones
  19.  
  20. bsf STATUS,5
  21. movlw b'11111110'       ;la unica salida será RB0
  22. movwf TRISB      
  23. bcf STATUS,5  
  24.  
  25. ;Codigo de programa
  26. INICIO    
  27.          bsf  PORTB,0  
  28.          call DELAY     ;llamo a la rutina de retardo
  29.          bcf  PORTB,0  
  30.          call DELAY     ;otra vez para notar el efecto del parpadeo
  31.          goto INICIO
  32.  
  33. DELAY movlw 0xFF  ; Subrutina de retardo
  34.       movwf COUNT1  ; 256x256=65536 cuentas
  35.       movwf COUNT2
  36. LOOP  decfsz COUNT1,1 ; Decrementa COUNT1
  37.       goto LOOP  ; Salta si COUNT1=0
  38.       movlw 0xFF  
  39.       movwf COUNT1  ; COUNT1=FF
  40.       decfsz COUNT2,1 ; Decrementa COUNT2
  41.       goto LOOP  ; Salta si COUNT2=0
  42.       return   ; Retorno de subrutina
  43.  
  44. end   ; Fin de programa


Si bien otros programas iniciales son más sencillos que este, no son suficientes para asegurar que todo está bien.

Circuito

Aquí está el circuito para probar el programa en la práctica.



Trabajaremos con Proteus, por lo práctico de este programa en las simulaciones de microcontroladores. También nos ayudara para asegurar que nuestro programa funciona bien.
En el circuito no se ve pero tambien se tiene que conectar la fuente de alimentación, pin 5 - tierra y pin 14 - Vcc (5V)

Información del programa

Veamos un poco la estructura del programa:
Luego del “list” y el “include” que nos permiten añadir las instrucciones del Pic especificado pasamos a la palabra de configuración.
Aquí tenemos información de las palabras de configuración más importantes para el PIC16F84A.

PWRTE (power up timer: temporizador de encendido) provee un retardo fijo de 72ms en el encendido 
únicamente, diseñado para mantener el reset mientras la fuente se estabiliza.
CP protección de código.
WDT (watchdog: temporizador de perro guardián)reset cuando hay desbordamiento. 
Evita los posibles cuelgues de programa.
Tipo de oscilador:
RC: Formado por una resistencia y un condensador. No preciso.
LP: Baja frecuencia. Entre 32K a 200KHz.
XT: Oscilador a cristal de cuarzo. Genera entre 100k a 4MHz.
HS: Para frecuencias entre 4M a 20MHz.
Nuestra palabra de configuración:
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Protección de codigo (CP) no es necesario por lo que la deshabilitamos (OFF).
WDT tampoco es necesario por lo que es un programa sencillo.
PWRTE siempre lo considero activado. Es muy importante.
XT es por que trabajo con un cristal de 4MHz.

Luego definimos las variables que utilizamos COUNT1 y COUNT2.
El banco de memorias comienza en la posición 0x0c.

Definimos el modo de operación de los puertos.

Por último la rutina principal de bucle infinito.

INICIO    
         bsf  PORTB,0  
         call DELAY     ;llamo a la rutina de retardo
         bcf  PORTB,0
         call DELAY     ;otra vez para notar el efecto del parpadeo
         goto INICIO


“bsf” pone a 1 lógico el Pin 0 del puerto B.
“bcf” pone a 0 lógico el Pin 0 del puerto B.

Así se logra prender y apagar el led conectado al Pin 0 pero este efecto no sería observable sin un retardo, ya que las instrucciones como había mencionado demoran 1us.
El retardo se da en:

call DELAY

Donde se salta a la rutina de retardo “DELAY”.

DELAY movlw 0xFF  ; Subrutina de retardo
      movwf COUNT1  ; 256x256=65536 cuentas
      movwf COUNT2
LOOP  decfsz COUNT1,1 ; Decrementa COUNT1
      goto LOOP  ; Salta si COUNT1=0
      movlw 0xFF  
      movwf COUNT1  ; COUNT1=FF
      decfsz COUNT2,1 ; Decrementa COUNT2
      goto LOOP  ; Salta si COUNT2=0
      return   ; Retorno de subrutina


Como había mencionado, con el StopWatch se puede calcular el tiempo que demora este retardo de forma exacta, obtuve 196ms o 200ms para redondear.


No hay comentarios :

Publicar un comentario