Antes de programar un microcontrolador
Son muchos los conocimientos necesarios para diseñar circuitos con microcontroladores, sin embargo los hemos ido abordando poco a poco de la manera más simple posible. Iniciamos con descripciones básicas del hardware y luego abordamos parte del software, incluimos la estructura interna y vimos 4 tipos de lenguajes de programación disponibles, podríamos decir que ya estamos muy cerca de crear nuestro primer programa pero aún debemos conocer algunas características que se deben tener en cuenta a la hora de programar.
Algunas de estas características se configuran dentro del programa por lo cual se podría considerar que establecer sus valores forma parte de la programación, sin embargo son parte obligatoria y por lo tanto no se deben omitir aunque su función no está orientada a las taréas del programa principal sino a monitorear y controlar el buen funcionamiento del chip durante su funcionamiento. Veamos de que se trata.
A partir de este punto debemos escoger un microcontrolador para enfocarnos en él pues hasta ahora hemos estado explicando todo de forma general, lo unico que varía entre un chip y otro es que unos tienen más prestaciones pero los métodos de configuración y programación son los mismos. Vamos a escoger el PIC16F877/A para nuestros siguientes artículos entendiendo que este tiene suficiente potencia para la mayoría de las aplicaciones.
La primera consideración son los componentes externos que llevará cada microcontrolador en sus pines destinados a estos.
La imagen anterior es tomada del software simulador PROTEUS que estaremos usando a partir de ahora, anteriormente usamos livewire para simular circuitos y generar las gráficas pero vamos a cambiar a proteus porque es el único simulador que conozco que incluye microcontroladores en su librería, se pueden simular los programas en flowcode pero tiene una cantidad muy limitada de componentes así que usaremos PROTEUS.
Lo primero que podemos notar es la conexión de un Cristal oscilador X1 en los pines 13(OSC1/CLKIN) y 14(OSC2). Este tipo de componentes vienen fabricados para una frecuencia específica y depende de nuestras necesidades será nuestro cristal, la frecuencia máxima admisible es de 20MHz, la única forma de no usar este componente es si activamos el oscilador interno del microcontrolador, aunque este brindará una frecuencia menor a la máxima posible con un cristal
El pin MCLR es un reset por hardware cuando es llevado a tierra, por eso lo alimentamos con 5V a través de una resistencia de 10k para impedir un reset indeseado y podemos añadir un pulsador para llevarlo a tierra si queremos provocar el reset con un pulsador para cuando el programa "se guinde" o de problemas (cosas que pueden suceder).
Luego tenemos los pines dedicados a la fuente de alimentación que brindará energía al micro, Proteus no los incluye porque considera obvio que si vamos a simular un micro estará energizado pero nos apoyaremos en el diagrama de conexiones del micro para identificarlos.
Diagrama de conexiones del PIC16F877. Fuente: Flowcode opción CHIP
Podemos identificar los pines 11 y 32 como VDD y 12 y 31 como VSS donde se deben conectar el positivo y negativo de la fuente, la alimentación para estos dispositivos es de 5VDC.
Configuraciones en el microcontrolador antes de programar.
Luego de las conexiones físicas fíjas debemos considerar la configuración del microcontrolador a nivel de programa, estas configuraciones definen cómo se comportará el microcontrolador durante la ejecución de la tarea y monitoreará que no existan problemas permitiendo protegerlo de ciertas anomalías que puedan ocurrir.
En primer lugar antes de crear cualquier programa debemos elegir el chip que vamos a usar, en base a ello se presentarán las siguientes opciones entre las que debemos configurar la frecuencia del reloj (debe ser igual a la frecuencia del Cristal oscilador que conectamos en los pines 13 y 14) y los fusibles.
Ahh si, los fusibles, recuerdo haberlos mencionado en algún artículo anterior pero en este punto vamos a profundizar un poco.
Primero veamos como quedaría nuestra configuración inicial en FlowCode.
Al crear un proyecto lo primero que nos pide es escoger el chip, luego aparece la ventana que veremos a la derecha donde se configura el reloj y dando al boton de configurar chip aparece la ventana de la izquierda donde configuramos los fusibles.
Los fusibles más importantes que podemos resaltar son Oscillator donde elegimos el tipo de oscilador que usaremos, se pueden conectar otro tipo de osciladores en lugar de un cristal así que el valor colocado aquí dependerá de la frecuencia estando disponibles: LP, XT, HS, RC cuya descripción veremos en la siguiente imágen, WDT o watchdog timer que se encarga de resetear el programa luego de cierto tiempo, debemos desactivarlo si queremos evitar esto, Power Up Timer es otro fusible que debemos desactivar por las mismas razones.
Data EE read protect y code Protect nos permiten proteger nuestro programa para que no sea extraído sin autorización (suponiendo que estamos vendiendo un producto y no queremos copias piratas lo activamos, pero si no estamos distribuyendo un producto los desactivamos ya que podríamos necesitar extraer el programa en algún momento y si activamos este fusible no podríamos.
BROWNOUT protege contra bajos voltajes para evitar que el micro sufra daños.
En C Podemos usar el programa CCS PIC COMPILER para obtener una lista de fusibles que ofrece cada microcontrolador eligiendo el que queremos usar para ver los correspondientes con su respectiva descripción.
Para configurar nuestro programa en C procedemos de la siguiente forma:
1.- Usar la directiva #Include para seleccionar el microcontrolador a usar.
#include <16f877a.h>
Notemos que terminamos el nombre con .h lo que hace referencia a un archivo de librería que se está llamando para que ejecute en nuestro programa las funciones correspondientes a ese microcontrolador.
2.- Se establece la donfiguración de los fusibles mediante la directiva #fuses luego se añaden los fusibles de la forma que están descritos en la tabla que acabamos de presentar, para añadir varios se separan con una coma.
#fuses HS,NOWDT,NOPUT,NOPROTECT,BROWNOUT
Esos son los que estaremos usando siempre pero puede añadir o quitar fusibles de acuerdo a las necesidades de su programa.
3.- Establecer la frecuencia de oscilación usando la directiva #use delay(clock=frecuencia), si queremos establecer una frecuencia de 20Mhz sería:
#use delay(clock=20M)
4.- Definir los pines que actuaran como entrada y los que actuaran como salida.
Lo primero que debemos elegir son los puertos que usaremos y donde deseamos conectar nuestras entradas y salidas, luego se configuran estos pines para que actuen como tal, para una configuración en C podemos usar la directiva #use fast_io(PUERTO) y en puerto va la letra del puerto que deseamos usar. También podemos usar #use standart_io(PUERTO), la diferencia es que si usamos la fast_io debemos definir cuales pines del puerto seleccionado serán usados como salida y cuales como entrada asignando un 1 a los pines de entrada y un 0 a los de salida, esto mediante la instrucción set_tris_PUERTO(Valores para los bits).
Por ejemplo si queremos configurar el puerto D como salida usaríamos #use fast_io(B) y luego en el programa principal estableceríamos set_tris_B(0b00000000) 0B es la forma de indicar que el valor está en binario y los siguientes numeros son los valores para cada bit, Ponemos 0 para salidas y 1 para entradas. también se puede usar 0x para colocar el valor en hexadecimal.
standard_io sin embargo no requiere más configuraciones, cuando un puerto se desea usar de una forma al haber definido standard_io el programa lo puede cambiar entre entrada y salida según se esté implementando en el programa principal.
Las salidas deben limpiarse para evitar datos erroneos, esto se hace llevandolas a cero en el programa principal con la función output_PUERTO(0x00)
5.- Establecer un bucle while infinito para el programa principal si queremos que nuestra tarea se mantenga en ejecución siempre (generalmente queremos eso)
Nuestra estructura de configuración base quedaría como se muestra en la siguiente imágen
En lenguaje ensamblador se vería de la siguiente forma:
; ZONA DE DATOS **********************************************************************__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
LIST P=16F877A
INCLUDE <P16F877.INC>
; ZONA DE CÓDIGOS ********************************************************************
ORG 0; El programa comienza en la dirección 0.
Inicio
bsfSTATUS,RP0; Acceso al Banco 1.
clrfPORTB; Las líneas del Puerto B se configuran como salida.
movlwb'00011111'
movwfPORTA ; Las 5 líneas del Puerto A se configuran como entrada.
bcfSTATUS,RP0; Acceso al Banco 0.
Principal
;a partir de aquí va el código que ejecuta la tarea
De esta forma se establecen las configuraciones en los tres lenguajes mencionados, no es posible para LDmicro en donde solo se puede configurar la frecuencia del reloj y el micro con el que se desea trabajar.
En los artículos futuros nos vamos a centrar en la programación en LENGUAJE C, usaremos el espacio que nos está ocupando describir el mismo funcionamiento en los distintos lenguajes para intentar dar más detalles de la programación en C, posiblemente abordemos Flowcode en el futuro, ensamblador solo si alguien lo solicita y LDmicro en ocasiones especiales.
Nuestros softwares por defecto seran CCS PIC COMPILER C para escribir el código en C y Proteus para simulaciones cuando se requieran.
Con toda esta información creo que ahora si estamos listos para crear nuestros primeros programas, me despido agradeciendote por leer y apoyar mi artículo, esperando que te pueda ser de mucha utilidad y quedando atento a la sección de comentarios.
Artículos relacionados.
- Microcontroladores: Lenguajes de Programación (Diagrama de flujo)
- Microcontroladores: Lenguajes de Programación (Escalera)
- Microcontroladores: Lenguajes de Programación (Lenguaje C)
- Microcontroladores: Lenguajes de Programación (Ensamblador)
- Microcontroladores: Registros
- Microcontroladores: Identificando los terminales de conexión.
- Microcontroladores: Composición interna.
- Lógica Combinacional - Operaciones lógicas básicas
- Hoja de datos (DATASHEET) de Componentes
Lecturas recomendadas
- José M. Angulo Usategui, Ignacio Angulo Martínez, Microcontroladores PIC: Diseño práctico de aplicaciones (primera parte)
- Ronald J. Tocci, Neal S. Widmer, Sistemas digitales: principios y aplicaciones
- Albert Paul Malvino, Principios de electrónica, Sexta edición.
- Robert L. Boylestad, Electrónica: Teoría de Circuitos.
- Timothy J. Maloney, Electrónica Industrial, dispositivos y sistemas.
Congratulations @electronico! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s)
Your next target is to reach 200 comments.
You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word
STOP
To support your work, I also upvoted your post!
Check out the last post from @hivebuzz:
Vaya! no soy muy bueno comentando, no es que no lea a otros, solo no se me da bien comentar. Me la has puesto difícil esta vez eh. Pero lo intentaré, ya veras!!
De nada @electronico 😊👍 ¡Le deseamos un buen día!
¡Enhorabuena!
✅ Has hecho un trabajo de calidad, por lo cual tu publicación ha sido valorada y ha recibido el apoyo de parte de CHESS BROTHERS ♔ 💪
♟ Te invitamos a usar nuestra etiqueta #chessbrothers y a que aprendas más sobre nosotros.
♟♟ También puedes contactarnos en nuestro servidor de Discord y promocionar allí tus publicaciones.
♟♟♟ Considera unirte a nuestro trail de curación para que trabajemos en equipo y recibas recompensas automáticamente.
♞♟ Echa un vistazo a nuestra cuenta @chessbrotherspro para que te informes sobre el proceso de curación llevado a diario por nuestro equipo.
Cordialmente
El equipo de CHESS BROTHERS
Muchas gracias por el apoyo!!