La programación de microcontroladores PIC en lenguaje C se puede comprender mejor si se estudian sus elementos básicos; una vez que se dominen estos elementos se podrá dar solución a la gran mayoría de problemas de programación. En este artículo se explican los detalles de la programación de microcontroladores PIC en lenguaje C, es decir la sintaxis (cómo se deben escribir las instrucciones) y el uso de las instrucciones con ejemplos prácticos.
mikroC PRO para PIC está basado en el lenguaje C estándar empleado en la programación de computadoras, por lo tanto se encontrará que hay sólo unas pequeñas diferencias propias de la aplicación en el campo de los microcontroladores. La programación en el compilador mikroC PRO se basa en PROYECTOS. Cada proyecto está conformado por un conjunto de archivos interrelacionados entre sí.
El propósito de la mayoría de los programas es resolver un problema. Los programas resuelven los problemas por medio de la manipulación de información o datos. Normalmente los programas se caracterizan por permitir el ingreso de información, tener uno o varios lugares de almacenamiento de dicha información, contar con las instrucciones para manipular estos datos y obtener algún resultado del programa que sea útil para el usuario. En la programación de PIC en C existen pequeños detalles que se deben tener muy en cuenta y que permitirán que los programas realizados cumplan las tareas para los cuales fueron diseñados.
¡Descubre el mundo de los microcontroladores PIC y lleva tus habilidades de programación al siguiente nivel! Obtén nuestro eBook y disfruta aprendiendo paso a paso desde cero, podrás realizar proyectos prácticos, encontrar soluciones a problemas comunes y explorar una amplia cobertura de temas desde lo más básico a lo más avanzado. Incluye software y ejemplos resueltos.
Declaración de Variables
La declaración de variables es un aspecto fundamental en la programación en C. La declaración de variables se hace donde aparecen los puntos suspensivos ... La elección del tipo de datos es crucial, ya que el tipo de dato no es problema cuando la promoción a un entero superior siempre ocurre, una característica importante del funcionamiento de C.
Lea también: IVA 21% Excel
El tipo float es para números con punto decimal, mientras que los demás tipos son para números enteros. Por ejemplo, en operaciones de multiplicación, la compatibilidad de tipos es esencial:
- Tampoco te deja multiplicar Long int= short*const - a pesar de que Long int es mucho más largo que short.
- Solución: Long int= long int*const - sí funciona y no da error al compilar.
De esta manera, se pueden convertir los resultados parciales que eran del tipo short int, que debían multiplicarse por ciertos valores constantes, al tipo long int para evitar problemas. EL TIPO DE DATOS - ése era el problema.
Las funciones también pueden manejar tipos de datos específicos. En este ejemplo la función es numérica tipo char, su nombre es Bin2_7seg y tiene un parámetro digit de tipo char.
Elementos Básicos de la Programación en MikroC
Lo anterior constituye una breve descripción de los siete elementos básicos de la programación: entrada de datos, tipos de datos, operaciones, salida, ejecución condicional, lazos y funciones. La EJECUCIÓN DE UNA INSTRUCCIÓN consiste en la realización de las operaciones especificadas en esa instrucción. Las instrucciones del programa, que son las que va a ejecutar o realizar el microcontrolador, se colocan donde van los puntos suspensivos ...
Instrucciones Fundamentales
- Instrucción de asignación (=): Permite asignar a una variable un valor constante, el contenido de otra variable o el resultado de una expresión matemática. La asignación va de derecha a izquierda.
- Instrucción de entrada de datos (variable=PORTx): Permite el ingreso de uno o más datos a través de los pines del microcontrolador y almacenarlos en una o más variables.
- Instrucción de salida de datos (PORTx=dato): Permite el envío de datos, el contenido de una variable o el resultado de una expresión matemática hacia los pines de un puerto.
Control de Flujo
- Instrucción de decisión (if...else): Permite la ejecución de las instrucciones1 si la condición es verdadera, de lo contrario se ejecutan las instrucciones2. Esto incluye casos como la instrucción de decisión sin else, o con una sola instrucción.
- Instrucción iterativa condicional (while): Permite ejecutar un grupo de instrucciones de manera repetitiva, mientras una condición sea verdadera. La ejecución del programa permanece indefinidamente en esta línea mientras el bit IOFS del registro OSCCON sea igual a cero. Un ejemplo de un lazo infinito. En mikroC PRO, cualquier valor numérico diferente a cero se considera VERDADERO, y un valor numérico igual a cero se considera FALSO. Al valor numérico del puerto A se le suma el valor 65, el resultado se envía hacia los pines del puerto B.
- Instrucción hacer-mientras (do...while): Permite ejecutar un grupo de instrucciones de manera repetitiva, mientras una condición sea verdadera. La variable kp tiene un valor inicial de cero. La instrucción kp=Keypad_Key_Click( ); se ejecuta y luego se revisa la condición (!kp). Mientras kp sea igual a cero (FALSO) la condición será VERDADERA (!kp), debido al operador de negación ! que cambia el valor de verdad a su estado contrario. Como resultado se tendrá un lazo infinito mientras la variable kp siga en cero. Si la variable es igual a 1 se ejecutan únicamente las instrucciones1, si es igual a 2 se ejecutan únicamente las instrucciones2 y así sucesivamente.
Funciones
Una función es una agrupación de instrucciones para formar una nueva instrucción creada por el programador (usuario). Empleando funciones, la solución total de un determinado problema se divide en varios subproblemas, cada uno de los cuales es resuelto por medio de una función particular, aplicando de esta manera la conocida máxima "Divide y vencerás". Las funciones constituyen una de las características fundamentales de mikroC PRO, pues todo programa bien escrito hace uso de ellas.
Lea también: Guía IVA reducido
Un ejemplo de prototipo de función es char Bin2_7seg(char digit); y su definición char Bin2_7seg(char digit){. La función se utiliza como si fuera una instrucción cualquiera, tomando en cuenta el tipo de función y su(s) parámetro(s). En este ejemplo se tiene PORTB=Bin2_7seg(PORTA). Esto significa que la variable PORTA remplaza a la variable digit. Por lo tanto si PORTA es igual a 0, la función devuelve el valor 0x3F que será enviado al puerto B. La definición de la función, si se hace sin declaración, se debe hacer antes de la función principal, de lo contrario se producirán errores de compilación por tratar de usar una función desconocida. Una función numérica como esta puede dar como resultado un número hexadecimal dependiendo del valor que tenga la variable digit. Si digit es igual a 0 la función devuelve (return) el valor 0x3F. Si digit es igual a 1, la función devuelve el valor 0x06, y así sucesivamente.
Consideraciones Adicionales y Buenas Prácticas
- Ten en cuenta que C es case sensitive. Final != final.
- Los signos de agrupación siempre deben estar en pareja, es decir si hay tres llaves de apertura {{{, deben haber tres llaves de cierre correspondientes }}}.
- Además asegúrate siempre de usar corchetes en el if, para no tener problemas luego.
- Con respecto a los comentarios, se puede decir que son importantes aunque no son necesarios.
Lea también: ¿Cómo localizar tus XML del SAT?
