Aprendiendo a programar pics mediante el mplab

La verdad no s emucho sobre el pic… en mi escuela usamos el antiguo 16f84a… y pues solo nos andan limitando a ese, ya con el tiempo usaremos otro… este es un pequeño tutorialqu eencontre en internet y me resulto muy util.

Tutorial 1 – LED’s

Vamos a empezar con el primer tutorial de  microcontroladores pic. Vamos a hacer algo sencillo, encender y apagar leds. Así, vamos a empezar por lo más básico para ir aprendiendo las instrucciones del micro y ver mas a detalle el funcionamiento del PIC.

Tutorial 1.1 - Encendiendo y apagando LED’s

Ya vimos como encender un led, ahora veamos también como apagarlo. Este programa lo que hace es encender ocho leds conectados al puerto B del micro y después apagarlos. El código es el siguiente (descargar código):

led1.png
Las primeras líneas son directivas al ensamblador. LIST p=16F628a define el micro que se utilizará, radix hex define la raíz numérica por defecto, en este caso será hexadecimal, esto significa que cualquier número que se escriba en el código y no se especifíque  que raíz tiene será tomado como hexadecimal. En ensamblador los números se pueden representar en forma decimal, hexadecimal y binaria de la siguiente manera:

  • decimal: .14
  • hexadecimal: 0×0E ó 0Eh
  • binario: b’00001110′

En el código la raíz definida es hexadecimal, si quisieramos que fuera decimal tendriamos que escribir dec, para binaria bin y para octal oct. Después de la definición de la raíz está la directiva __config que se utiliza para definir la configuración del microcontrolador. La palabra de configuración 0×3D18 define que se utilizará el reloj interno del micro, se deshabilitará el watchdog, así como el reset y la protección de código. Más adelante se hablará más a detalle sobre la configuración del pic.

Después se declaran algunas constantes, para esto se utiliza la directiva equ. La sintaxis de la directiva es <nombre_de_la_constante> equ <valor> y lo que hace esta directiva es que cada vez que en el código se escriba la constante definida se tome el valor de constante, por ejemplo “RP0 equ 5“, cada vez que en el código aparezca RP0 el valor que se tomará será 0×05.

Después viene el programa principal. Es muy importante comenzar el programa siempre con la  directiva org en la dirección 0×00 ya que esta directiva define la dirección en la que se comenzará a escribir el código. Al momento de encender el micro o al hacer un reset lo primero que el microcontrolador hace es leer la dirección 0×00, si no hay nada en esa dirección lo más probable es que el micro se cicle. Otra cosa importante que debemos tomar en cuenta es que la memoria de programa del PIC 16F628A comienza en la dirección 0×05, es por eso que debemos poner también un org 0×05 para que el código comienze a escribirse a partir de esa dirección.

Ahora si, veamos que instrucciones tenemos. Al inicio, después de org 0×00 tenemos un goto Inicio, goto hace es un salto incondicional hacia la dirección que se le indique, en este caso la dirección es la etiqueta Inicio. bsf se utiliza para cambiar el estado lógico de un bit de un registro a un nivel alto, la sintáxis es bsf f,b donde f es el registro y b el bit que se quiere cambiar (bsf STATUS,RP0), lo que hace esa línea es seleccionar el banco de memoria 1, el micro tiene 4 bancos de memoria y en esos 4 bancos estan repartidos todos los registros (en realidad la mayoria estan repartidos en 2 bancos, los 2 ultimos sirven de espejo a los 2 primeros. En el banco 0 se encuentra el registro STATUS y dentro de ese registro están los bits de selección de banco. Debemos cambiar al banco 1 ya que ahí se encuentra el registro de configuración del puerto B (TRISB) que dependiendo de la configuración que tenga hará que el puerto B se comporte como entrada o como salida. Una vez en el banco 1 configuramos el puerto B como salida, de eso se encarga clrf, esta instrucción borra el contenido de un registro, al estar en el banco 1 clrf PORTB hace que todos los bits del registro TRISB se pongan en un nivel bajo, configurando así el puerto B como salida. Después regresamos de nuevo al banco 0 con bcf STATUS,RP0. bcf realiza la acción contraria de bsf, pone a 0 un bit del registro específicado. Con eso termina la configuración del puerto B.

De las demás instrucciones la única “desconocida” es nop, esta instrucción sólo sirve para consumir un ciclo de instruccion ya que su definición es no realizar ninguna operación. Los nop en el código estan para que las salidas en el puerto B creen una señal cuadrada. Lo que hace la ultima parte del código es primero cargar 0xFF al registro W, luego pasar ese valor al puerto B para poner las salidas en alto, luego limpia el puerto B para tener la salida en bajo y el ultimo goto hace que el ciclo se esté repitiendo y repitiendo.

Al implementar este ejemplo vemos que los leds no encienden y apagan sino que se quedan encendidos y no cambian nunca de estado. Esto no es del todo cierto. Encienden y apagan pero tan rápido que no nos damos cuenta. De eso trata la segunda parte del tutorial, que proximante les pasare para que aprendan un poco mas sobre los pics.

6 Responses to Aprendiendo a programar pics mediante el mplab

  1. QUE ABURRIDOOOOOO……ES MAS FACIL UTILIZAR EL
    FABULOSO PROGRAMA LLAMADO “PIC SIMULATOR IDE”,CON EL PRENDO EL LED TAN SOLO CON CINCO LINEAS DE CODIGO,Y LO COMPILA INMEDIATAMENTE….CREO QUE TE GASTASTE LA JUVENTUD EN NA….

  2. opino igual que tu, pero existen maestros de la edad de la canica que opinan que es mejor aprender desde lo basico, se que existen mejores programas, te agradezco el comentario…., si existe algo en lo que pueda ayudar para mejorar el sitio me gusta que me lo digan invesitigare sobre el programa que mencionas, aunque tambien me gustaria saber que opinas de unirte a mi web, y de vez en cuando exponer algunos temas de electronica o de lo que sea.. espero tu respuesta

  3. Como dijeron, existen otros programas que hacen eso en pocas lìneas, pero obviamente, el que lo dijo tiene poca idea de programaciòn. Cuando programas en asembler estas programando en un lenguaje de bajo nivel y te aseguras de que cada instrucción use solo un ciclo de máquina. En cambio, cuando usas un lenguaje de alto nivel (tipo el picbasic o el C) tenes que tener en cuenta que vas a usar mucha mas memoria del microcontrolador que si usaras asembler.
    A veces, lo mas facil no es lo mas eficiente, y lo mas rapido no es lo mejor.

  4. yo creo que es mejor programar en assambler, por que asi chekas perfectamente linea por linea como funciona el programa, y puedes optimizar su funcionamiento, los programas de alto nivel sirven, pero para programadores inexpertos, que tienen poca idea de lo quela electronica es, y solo les interesa sacar los programas por sacarlos. esa es mi mas humilde opinion

  5. Hola también opino lo mismo se me hace mas fácil programar con el software “PIC IDE” ademas que las simulaciones están de poca lcd, lcd grafico, motor a pasos interface USART,EEPROM….etc, es una maravilla, nada mas que eso si compañeros desgraciadamente esta muy limitado ese software para otros Microcontroladores PIC como la Familia C, y creo que es válido aprender de todo y aprender desde lo básico lo que me gusta de ensambrador es que TU gobiernas el PIC y en otros softwares como PIC C el emulador es el que mantiene el control del PIC, además que no te pide sintaxis como en C y no es nesesario tener la libreria específica del PIC basta con tener a la mano el mapa de memoria del PIC a programar y listo, eso si en ningún momento menosprecio PIC C es muy practico sobre todo para cuestines matemáticas como multiplicación división y comunicación solo que para empezar y ser todo un experto Prefiero Ensamblador y para programar Multiples PIC’s MPLAB

    • Woow un comentario muy acertado a mi parecer, siempre es bueno conocer las bases… pero considero que debemos de buscar la forma a la cual nos adaptemos mas y nos resulte mas conveniente, tambien dependiendo de nuestra aplicacion.

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>