domingo, 4 de noviembre de 2012

[Curso quierobits.com] Microcontroladores

9:28

[Curso  quierobits.com] Microcontroladores

Tomado de http://quierobits.com

[Curso  quierobits.com] Microcontroladores  
La tecnología se ha vuelto algo indispensable en nuestras vidas. Cada vez más aparatos y servicios se tornan digitales para brindarnos una mejor experiencia y usabilidad. Los microcontroladores juegan un papel muy importante en toda esta revolución digital. Su presencia es tal que los podemos encontrar desde en un avión hasta en un reloj despertador.
Este pretende ser un curso introductorio al uso de esta herramienta tan poderosa y flexible. Abarcará desde la descripción del microcontrolador hasta el desarrollo de algunos proyectos utilizando esta tecnología. Las entregas serán por módulos e irán de menos a más, facilitando el aprendizaje.
Bienvenidos sean entonces a este curso. Comenzaremos con la introducción al microcontrolador, su definición y algunos datos que deberás saber para una mejor comprensión.
¿Qué es un microcontrolador?
El microcontrolador es circuito integrado programable que contiene un procesador, memoria, entradas y salidas. Es muy flexible en el sentido de que puede ser programado para realizar cualquier tipo de tarea, pero está limitado en el hecho de que, una vez programado para cierta tarea, se dedica únicamente a ella.
Algunas de las compañías que se dedican a fabricar microcontroladores son:
  • Atmel
  • Freescale
  • Microchip
  • Intel
  • Texas Instruments
Diferencia entre microcontrolador y microprocesador
La diferencia radica principalmente en el propósito. El microprocesador está diseñado para ser de propósito múltiple, esto quiere decir que puede realizar distintas tareas según las aplicaciones que corran en él. El microcontrolador, al contrario, es de propósito específico, aunque puede ser programado para aplicaciones muy diversas, solo realizará la que le fue programada.
Aplicaciones
Los microcontroladores pueden realizar prácticamente cualquier tarea. En un automóvil, por tomar un ejemplo, podemos encontrar uno que se encargue del encendido; otro para controlar el sistema de frenos ABS; uno más dedicado al tablero; otro dedicado a la alarma; en fin, los podemos programar para satisfacer cualquier tipo de necesidad, es solo cuestión de ingenio y creatividad.
¿Qué debo saber antes de empezar este curso?
  • Conocimientos de programación (C/C++)
  • Conocimientos básicos de electrónica (Recomendado)
Con esto concluyo la primera entrega del curso básico de microcontroladores. Pronto encontrarán la siguiente entrada donde se mostrará la configuración inicial del microcontrolador y sus especificaciones.
¡Hasta pronto!

[Curso] Microcontroladores – Entrega 2 (Review Programación)


A petición de algunos lectores y pensando en aquellos que no tienen tanta experiencia con la programación, esta entrega se dedicará a revisar aspectos muy básicos de programación necesarios para desarrollar código para un microcontrolador. No vamos a entrar en muchos detalles, es simplemente para tener una guía de los conocimientos mínimos necesarios para desenvolvernos en el mundo de los microcontroladores. ¡Comencemos entonces!
TIPOS DE DATOS
En el microcontrolador se respetan los tipos de datos utilizados en C/C++ que son:
TipoLongitudRango
Short10 o 1
Signed int80 a 255
Char80 a 255
Unsigned int8-128 a 127
Long int160 a 65536
Float323.4 E-38 a 3.4 E 38
VARIABLES
Las variables pueden tomar distintos valores, dependiendo del asignado por el usuario o programador. Estas pueden ser locales o globales. Las variables locales son aquellas que son declaradas dentro de una función y solo podrán ser utilizadas dentro de la misma. Las variables globales son las variables declaradas fuera de todas las funciones y que pueden ser utilizadas por todas ellas.
La declaración de una variable se hace de la siguiente manera:
tipo_variable     nombre_variable = valor_asignado;
Ejemplo:
unsigned int       mi_variable = 34;
DEFINICIONES
Esto es muy útil para declara valores constantes a lo largo de nuestro programa o para facilitar el entendimiento de algunos pines o valores. A continuación se muestran unos ejemplos:
#Define Pi = 3.1416

#Define pin_A6 = Led_encendido
OPERADORES
OperadorDescripción
=Asignación de valor
+Suma
-Resta
*Multiplicación
/División
%Módulo
>>Corrimiento a la derecha
<<Corrimiento a la izquierda
++Incremento
Decremento
<=Menor o igual
>=Mayor o igual
==Igual
!=Diferente
&&AND lógico
||OR lógico
&AND bit a bit
|OR bit a bit
^XOR bit a bit
FLUJO DE PROGRAMA Y CONDICIONALES
While
Este controlador de flujo permite realizar instrucciones mientras se cumpla una condición. Si la condición se cumple, entra al ciclo, de lo contrario, sale de él. La sintaxis es de la siguiente manera:
while (condición) {
     //Código
}
Ejemplo:
while(mi_variable<8){
     mi_variable++;
}
Do while
Este controlador es muy parecido al while, realiza una serie de instrucciones mientras se cumpla una condición, pero se diferencia del while en el hecho de que por lo menos una vez se ejecuta el código dentro. La sintaxis va así:
do {
     //Tu código aquí
}while(condición);
Ejemplo:
do{
     edad++;
}while(edad<=10);
For
El ciclo for es aquel que realiza la misma serie de instrucciones determinada cantidad de veces. Esta cantidad de veces está determinada por una condición. Además, el ciclo for cuenta con una condición inicial y con una instrucción de modificación de la variable condicionada. La sintaxis se muestra a continuación:
for(condición_inicial ; condición ; modifiación_variable){
     //Tu código aquí
}
Ejemplo:
for(edad=0; edad < 18;  edad++){

     printf(”Menor de edad”);
}
If / Else
Con estas instrucciones puedes ejecutar código dependiendo de si una condición se cumple o no. En combinación con la instrucción Else, puedes ejecutar una instrucción si se cumple una condición y otra en caso de que no se cumpla. Por ejemplo, si una persona es mayor de edad se le permite votar, en caso contrario no se le permite. La sintaxis es de la siguiente forma:
if (condición){
     //Ejecuta código
}
else {
     //Código alternativo
}
Ejemplo:
if(edad>=18){
     acceso_permitido=true;
}
else{
     acceso_permitido=false;
}
También es posible utilizar if’s anidados, esto es condicionales dentro de otro condicional. Ejemplo:
if(mes==febrero){

     if(año==bisiesto){
          numero_dias=29;
     }
     else{
          numero_dias=28;
     }
}
Switch / Case
Este comando es una alternativa a los if’s anidados, pues permite seleccionar de una lista de posibles opciones la instrucción a realizar. Para esto, se revisa una variable y se compara con todas las posibles opciones, en caso de coincidir con alguna, se ejecutan las líneas de código destinadas para dicha opción. En caso de no coincidir con ninguna, es posible establecer una opción de default que se ejecuta en estos casos. La sintaxis es de la siguiente manera:
switch(variable){

     case opción_1:
          //Código para la opción 1
     break;
     case opción_2:
          //Código para la opción 2
     break;
     default:
          //Código para la opción de default
}
Ejemplo:
switch(variable){

     case opción_1:
          //Código para la opción 1
     break;
     case opción_2:
          //Código para la opción 2
     break;
     default:
          //Código para la opción de default
}
Break
La sentencia break permite cortar el flujo de las instrucciones de control de flujo, tal como el while, do while, for y switch case. En esta última es muy importante que no olvides utilizar esta sentencia después de cada instrucción, de lo contrario, continuará ejecutando las instrucciones para las demás opciones.
FUNCIONES
Las funciones son código para realizar ciertas tareas específicas. Son reutilizables, es decir, se pueden utilizar en distintas partes del programa las veces que sea necesario. Además, es posible que reciban y devuelvan ciertos valores, pero de igual manera puede que no lo hagan. La sintaxis es de la siguiente forma:
valor_de_regreso  nombre_de_función(parámetro_1,parámetro_2){
     //Tu código va aquí
}
Ejemplo:
int  edad(int usuario){

     switch(usuario){
          case 1: return 18;
          case 2: return 15;
          case 3: return 20;
          default: return 16;
     }
}
Es importante notar que el hecho de usar el comando return hace la función de break al terminar el flujo de la función y regresar el valor especificado.
Un ejemplo del uso de esta función sería:
main(){

     int edad_usuario;

     edad_usuario=edad(2);
}
Esto nos asignaría el valor de 15 a la edad del usuario.
COMENTARIOS
Existen dos tipos de comentarios: comentarios de una línea y comentarios de párrafo.
Los comentarios de una línea se escriben iniciándolos con doble slash “//”. Ejemplo:
//Este es un comentario de una línea.
Los comentarios de párrafo se inician con un “/*” y terminan con un “*/”. Ejemplo:
/* Este es un comentario de párrafo.
Puede tener la extensión que uno desee.
Solo no hay que olvidar cerrarlo */
Los comentarios son ignorados por el compilador. Sirven como referencias para los programadores para tener una mejor comprensión del código.
Los comentarios son una parte muy importante en la programación y me gustaría hacer especial énfasis en esta cuestión, pues es un detalle que gran parte de las personas que se inician en la programación descuidan o no le dan tanta importancia.
Es altamente recomendable comentar un código, pues no solo son referencias para uno mismo, sino para los futuros lectores del mismo código.
Con esto finalizo la segunda entrega del curso de microcontroladores. Estén al pendiente de la siguiente entrega donde se verá la arquitectura del microcontrolador y se mostrará cómo configurarlo para empezar a trabajar con él.


[Curso] Microcontroladores – Entrega 3 (Hardware y Configuración)

En esta la tercera entrega, revisaremos los aspectos de hardware del microcontrolador, así como le algunos elementos que iremos utilizando a lo largo de todo el curso. Además, empezaremos a utilizar el software para crear nuestros programas y después exportarlos al microcontrolador. Finalmente, haremos la configuración inicial del microcontrolador para poder empezar a usarlo.
MICROCONTROLADOR PIC 18F4620
El microcontrolador que estaremos utilizando es el PIC 18F4620 de Microchip. En esta liga pueden obtener la hoja de especificaciones (Data Sheet).

En la hoja de especificaciones podemos encontrar la siguiente información:
  • Número de pines: 40
  • Frecuencia de operación: 40 MHz
  • Memoria de programa (bytes): 65536
  • Memoria de datos (bytes): 3968
  • Memoria EEPROM (bytes): 1024
  • Fuentes de interrupciónes: 20
  • Puertos I/O: A,B,C,D,E.
  • Timers: 4
  • Módulos PWM: 1
  • Comunicación Serial: MSSP, USART mejorada.
  • Módulos ADC (10 bits): 13 canales de entrada.
HARDWARE ADICIONAL
Conforme avancemos en el curso iremos revisando todos estos aspectos con más detalle, por el momento, son saber que el microcontrolador los tiene es suficiente. Ahora pasaremos a revisar otros elementos de hardware que utilizaremos a lo largo del curso:
  • Fuente 5V: Es la que nos brindará la energía necesaria para alimentar al microcontrolador.
  • Push buttons: Son botones que sirven para mandar una señal de entrada al microcontrolador.
  • Resistencias: Material que se pone al flujo de corriente eléctrica. Las fabrican con diferentes valores y las utilizaremos dependiendo de nuestras necesidades.
  • Capacitores: Condensadores que sirven como almacén de energía eléctrica.
  • Led’s: Diodos emisores de luz; son muy útiles como indicadores de ciertas salidas o del funcionamiento del microcontrolador.
  • Protoboard: Placa de pruebas en donde desarrollaremos todas nuestras prácticas.
  • Alambre para protoboard: Nos permitirá realizar las conexiones entre los diferentes pines del microcontrolador y dispositivos externos.
  • Cristal de reloj: Esto es muy importante, pues es el que nos indicará la frecuencia a la que trabajará nuestro microcontrolador.
  • Potenciómetro: Es una resistencia variable. Nos sirve, entre otras cosas, para observar el resultado de algún circuito al variar la resistencia.
  • Fotorresistencia: Esta resistencia varía su resistividad dependiendo de la luz que recibe del exterior.
PROGRAMADOR DE PICS
Para poder pasar la información de tu programa creado en la computadora al microcontrolador, necesitarás un programador de PICs. Este tipo de hardware lo puedes encontrar en tiendas de electrónica o en sitios de ventas por internet. Los hay de comunicación serial, pero yo te recomiendo que consigas uno con interfaz USB por su practicidad.
El programador debe incluir el software necesario para la instalación del programador y la importación de los archivos generados por el software de compilación.
El programador es más o menos como el siguiente:
SOFTWARE Y CONFIGURACIÓN DEL MICROCONTROLADOR
El software que utilizaremos para programar es el CCS PCWH Compiler. Aquí utilizamos la versión 4.058, pero cualquiera les puede ser de utilidad. Lo pueden descargar de esta dirección web.
Una vez instalado el IDE de Microchip, comenzaremos con la configuración del microcontrolador. Crearemos un nuevo proyecto utilizando el Project Wizard del compilador:
Lo guardamos en el directorio de preferencia:
Una vez que hayamos guardado nuestro proyecto, nos aparecerá una ventana para configurar el microcontrolador. Por el momento solo vamos a trabajar en la sección General. Lo primero que haremos es seleccionar el microcontrolador PIC 18F4620:
Después, configuramos el Clock Rate o frecuencia de reloj. Aquí vamos a utilizar una frecuencia de 10MHz, pero ustedes pueden trabajar a 4, 8, 12 MHz, o la frecuencia que tengan disponibl con su reloj.
Sleccionamos la velocidad del oscilador y lo ponemos en High Speed:
Las casillas siguientes no deben estar seleccionadas, por el momento no vamos a proteger nuestro código de lecturas y tampoco habilitaremos el modo de Switch Over, que se utiliza para cambiar de canales para dar mantenimiento, por ejemplo.
Finalmente, deshabilitaremos el reinicio del microcontrolador por Brownout o bajo en el suministro de energía eléctrica.
Con esto terminamos con la configuración inicial de nuestro microcontrolador.
Una vez creado el proyecto, podemos revisar que se creó un archivo con extensión .c y otro con extensión .h.
En el archivo .c es donde implementaremos todo nuestro código correspondiente a las funciones del microcontrolador, es decir, el main, las funciones adicionales, interrupciones, importación de librerías y demás.
En el archivo .h es donde va la configuración del microcontrolador. Todos los FUSES (fusibles) se definen aquí. También las demás definiciones con respecto a valores y nombres de pines. Las variables globales pueden ser definidas aquí igualmente. Otro punto importante es que todas las funciones utilizadas en el archivo .c deben estar definidas con anterioridad en el archivo .h. Por ejemplo, si tengo la siguiente función en el archivo .c y la estoy utilizando,
//Archivo .c

int calcula_edad (long fecha_actual, long fecha_nacimiento){

edad=fecha_actual – fecha_nacimiento;

return edad;

}
la definiría en el archivo .h de la siguiente manera:
//Archivo .h

Int calcula_edad(long, long);
Después de haber realizado la configuración mediante el Project Wizard //Confirmar si así se llama, tu archivo .h debe contener la siguiente información:
// .h

#include <18F4620.h>

#device adc=8;

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                        //High speed
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOIESO                   //Internal External Switch Over mode...
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV21                   //Brownout reset at 2.1V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or...
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table...
#FUSES NOWRTC                   //configuration not registers write...
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOXINST                  //Extended set extension and Indexed...
#FUSES PBADEN                   //PORTB pins are configured as analog...
#FUSES LPT1OSC                  //Timer1 configured for low-power...
#FUSES MCLR                     //Master Clear pin enabled

#use delay(clock=10000000)
Habrás notado que nos saltamos una gran parte de la configuración del Wizard. Esas configuraciones son para otro tipo de cuestiones, como entradas y salidas, puertos análogos, timers, watchdog timer, interrupciones, comunicación serial, etc. Por lo pronto no vamos a utilizar nada de eso. Pero no te preocupes, conforme vaya avanzando el curso iremos tocando cada punto y se pueden habilitar esas características manualmente modificando los FUSES del archivo .h.
Ya teniendo configurado nuestro microcontrolador, estamos listos para comenzar a utilizarlo. Mantente al pendiente de la siguiente entrega, en la que ya entraremos de lleno a la programación del microcontrolador y con algunas prácticas.

[Curso] Microcontroladores – Entrega 4 (I/O: Entradas y Salidas)

Bienvenidos a esta la cuarta entrega del curso de microcontroladores. Antes de comenzar con el tema de esta ocasión me gustaría hacer notar las nuevas características del curso. Para empezar, de ahora en adelante todas las entregas serán prácticas, de forma que puedas ir adquiriendo conocimiento y poniéndolo en práctica inmediatamente. Aquí se incluye una práctica muy sencilla que sirve como ejemplo del tema visto. El código de la práctica se encuentra en nuestro sitio y también estará disponible una versión descargable de los archivos del PCW. Además, todas las prácticas estarán disponibles en formato PDF para que las puedas llevar a donde sea. Aunque ésta es la primera práctica que está disponible en este formato, pronto se pondrán a disposición las prácticas anteriores también. Finalmente, esta entrega cuenta con un video que explica algunos detalles con respecto al microcontrolador y a la práctica desarrollada, para que puedas verla funcionando completamente. Sin más preámbulos, comencemos con el tema de hoy.
Algo muy básico en el uso de los microcontroladores es el manejo de entradas y salidas, pues ésta es la forma en que el micro se comunica con el exterior, ya sea para recibir información como para entregar resultados. Es recomendable que nos familiarizemos con la forma anglosajona de llamar a las entradas y a las salidas que son inputs & outputs, pues se abrevia muy fácilmente como I/O.
Por lo pronto nos centraremos en las entradas discretas o las que se refieren a solo uno de los dos estados posibles, sí o no, o en el caso del microcontrolador (MCU), alto o bajo.
Ya se mencionaron en la entrega pasada cuáles son los pines disponibles para la entrada y salida de información (que son prácticamente todos los pines).
Pero ¿cómo hacer uso de estas entradas y salidas? Lo primero que tenemos que hacer es incluir la librería stdio (standard I/O) al principio de nuestro código de la siguiente manera:
#include <stdio.h>
Las instrucciones clave que nos pueden ayudar son las siguientes:
  • input_x () .- Recibe un byte completo desde un puerto, por ejemplo, del puerto A sería: input_a().
  • input (pin_x) .- Revisa el estado del pin declarado y lo almacena en una variable asignada. Este solo tiene el valor de True o False.
  • output_x (value) .- Entrega un byte completo por un puerto determinado, de la misma forma en que lo hace en la instrucción de entrada.
  • output_low (pin_x) .- Manda una señal de estado 0 al pin especificado o una señal de False.
  • output_high (pin_x) .- Mnada una señal de 1 o True al pin especificado (5Volts).
  • output_bit (pin_x, state) .- Manda una señal de True o False, dependiendo del valor asignado al estado (state).
  • output_toggle (pin) .- Manda una sela que cambia de estado, dependiendo del estado anterior del pin. Prácticamente es aplicar una operación lógica NOT a la salida.
Con este conjunto de instrucciones básicas podemos empezar a manejar entradas y salidas en nuestro microcontrolador, lo que nos permitirá interactuar con el mundo exterior y empezar a utilizar el dispositivo para diferentes aplicaciones.
Resistencia de Pull-up.
Ahora que le daremos uso a los push buttons, es necesario saber como se conectan. En realidad es muy sencillo, lo único que se necesita es conectar una terminal a tierra y otra a positivo. Sin embargo, utilizaremos una resistencia de pull-up de manera que cuando se presione el botón nos entregue una señal de 0, pero mientras no esté presionado, la señal sea 1. Si no contaramos con esta resistencia de pull-up, si el botón estuviera presionado o no, siempre tendríamos una señal de 0. Esta es la relevancia de la resistencia de pull-up.
Práctica
Un aspecto muy importante y que nunca debes olvidar al momento que implementes tu código es que todo tu código se debe de estar ejecutando continuamente. Para esto requerimos de un ciclo infinito y es por eso que dentro del main incluiremos un ciclo while(true) en el que ejecutaremos nuestro código.
Otra instrucción que utilizaremos esta ocasión y que no se había mencionado antes es la de:
delay_ms(x);
Esta instrucción ejecuta un retardo de x milisegundos. Esto lo utilizaremos para darle un tiempo a nuestro usuario de realizar ciertas acciones. Aunque hay formas más efectivas de manejar estos tiempos, eso lo veremos más adelante, por lo pronto esta instrucción nos funciona. Además existe el retardo en microsegundos y su sintaxis es como sigue:
delay_us(x);
La práctica consiste en algo muy sencillo. El microcontrolador realizará 5 operaciones diferentes: suma, multiplicación, módulo, bitwise AND y un corrimiento. Sin embargo, no las realizará todas al mismo tiempo, sino que realizará una a la vez. El usuario mediante dos push buttons seleccionará cuál de todas las operaciones realizará el MCU. Uno de los botones es para ir a la siguiente operación y el otro es para regresar. Además, el MCU cuenta con un heartbeat led que nos indica el funcionamiento del microcontrolador. A continuación está el código para esta práctica:
#include "C:\Users\..." //Directorio donde se encuentra tu archivo
#include <stdio.h>

int8 button=1  //Variable, guarda el estado actual
void main()
{

  while(true){
    output_low(pin_d4);   //Ponemos en bajo los pines
    output_low(pin_d5);

    heartbeat_led();
    aritmetic_op(buttons());

    delay_ms(100);
  }
}

//Función que indica el funcionamiento del microcontrolador
void heartbeat_led(){
       output_toggle(pin_d2);
}

//Función que recibe la entrada de los botones
int8 buttons(){

    //Se revisa si algún botón fue presionado.
        if(input(pin_a0)==1 && button<=5){
                  button++;                  //Incremento de estado
                  output_high(pin_d4);       //Indicador de incremento
        }
        else if (input(pint_a1)===1 && button>=1){
                  button--;                  //Decremento de estado
                  output_high(pin_d5);       //Indicador de decremento
        }

         return button;    //Regresar el estado en el que se encuentra.
}

/*Función que manda como salida al puerto b
el resultado de la operación indicada por el estado*/
void aritmetic_op(int8 operation){

     //Se definieron dos variables aleatorias, en este caso 5 y 4
         int8 value1=5;
         int8 value2=4;

      /*Dependiendo del estado recibido desde la función
        buttons(), se realiza una u otra operación*/

         switch(operation){

                case 1: output_b(value1+value2);       //Suma
                break;

                case 2: output_b(value1*value2);       //Multiplicación
                break;

                case 3: output_b(value1%value2);       //Módulo
                break;

                case 4: output_b(value1&value2);       //Bitwise AND
                break;

                case 5: output_b(value1<<2);         //Shift a la derecha
                break;

                default: ;
}
A continuación se encuentra un video que muestra el funcionamiento de la práctica:
Con esto concluimos la cuarta entrega del curso de microcontroladores. Estén pendientes de la siguiente entrega donde aprenderemos a utilizar el teclado matricial.
MATERIAL DESCARGABLE


Leer más: http://quierobits.com/tag/pic/#ixzz2BHABfmUo

Written by

We are Creative Blogger Theme Wavers which provides user friendly, effective and easy to use themes. Each support has free and providing HD support screen casting.

0 comentarios:

Publicar un comentario

 

© 2013 Antikythera Electronica y domotica. All rights resevered. Designed by Templateism

Back To Top