Proyecto Arduino

Control de música desde un NES pad.

 Materiales:

  •  1 NES pad
  •  1 Arduino UNO
  •  Cables para conexiones



 El proyecto consiste en utilizar el NES pad para controlar el reproductor de música, poder cambiar la canción, subir el volumen, abrir y cerrar el reproductor etc.



 Para ello se utilizo un script en python que mediante el modulo serial nos estuviese comunicando con el arduino y este a su vez nos mandara la información de los botones que están presionando en el NES pad.




El NES pad cuenta con 8 botones, los cuales consisten:
  •  flechas ( Arriba, Abajo, Izquierda, Derecha ) 
  •  boton Select
  •  boton Start
  •  boton A
  •  boton B

A cada uno de los botones se le asignara un comando especial para el uso del reproductor de música. El reproductor que seleccione fue Banshee.

Para conectar el NES pad tome en cuenta su diagrama de pin out.




Despues de las conexiones indicadas con el pinout el sketch de arduino para este proyecto es el siguiente quedo de la siguiente manera.

Este sketch hace envios por el puerto serial hacia la pc, despues necesitamos un cliente que este recibiendo los datos del arduino y para ello tenemos este script en python.

Como podemos ver en el script se pregunta en que puerto esta conectado el arduino, y despues inicia ciclos para verificar que boton ha sido presionado segun la informacion que el arduino le envia a la pc.

Cada boton crea una impresion de una letra por el puerto serial, python la captura y decide que hacer.
  • Flecha arriba : Aumentar volumen
  • Flecha Abajo : Bajar volumen
  • Flecha Izquierda: Devolver una cancion o reiniciarla
  • Flecha Derecha: Siguiente cancion
  • Start: iniciar el reproductor
  • Select: cerrar el reproductor
  • Boton B: detener la reproduccion actual
  • Boton A: cambiar entre pausado y reproducion.


He aquí una demostración en video:

Proyecto PIC

Manipulación de un motor de corriente directa usando un microprocesador.

Para este proyecto utilize un puente H ya que me ayudara a controlar el motor de corriente directa, y en esta entrada.




Material.






La mayor parte de como se controla con el puente H ya que es el que permite controlar la direccion del motor.
Por la parte del pic pensé en usarlo como si fuese ya un circuito tipico de uso industrial ya sea en maquinas o aparatos de mediano tamaño pero con tareas especificas, es decir un circuito en el cual su principal función es dar ciclos realizando una misma tarea.

El motor que encontre es de un viejo reproductor de discos.
abajo
arriba





 






En realidad tiene dos motores, el que se supone hace girar los discos y el que mueve el lector óptico de arriba hacia abajo y viceversa. Pero usaré solo uno para propositos de muestra del funcionamiento del puente H y el PIC16F628A.

El Codigo del PIC El codigo que estoy usando es realmente simple. En realidad tenia unas pocas  series randoms para el movimiento del motor, pero por alguna razón el pic no lograba ejecutarlas ni en la simulación..

El pic logra mover el motor para ambas direcciones, aunque presenta un poco de fallos con la corriente electrica.


Puente H

¿Qué es un puente H? 


El puente H o puente en H es un circuito electrónico que permite a un motor eléctrico DC girar en ambos sentidos, avanzar y retrocerder.
Los puentes H ya vienen hechos en algunos circuitos integrados, pero también se  pueden construir a partir de componentes discretos.


Un puente H se construye con 4 interruptores (mécanicos o mediante transistores). Cuandos los interruptores S1 y S4 están cerrados ( S2 y S3 abiertos ) se aplica una tensión positiva en el motor, haciéndolo girar en un sentido. Abriendo los interruptores S1 y S4 ( cerrando S2 y S3 ), el voltaje se invierte, permitiendo el giro en sentido inverso del motor.

Un puente H se usa para invertir el giro de un motor, pero también se puede usar para frenarlo de manera brusca, al hacer un corto entre las bornas del motor, o incluso puede usarse para permitir que el motor frene bajo su propia inercia, cuando desconectamos el motor de la fuente que lo alimenta.
Basicamente se puede hacer esto tomanto en cuenta las Sn



La forma más común de hacer un puente H es usando interruptores de estado sólido ( son llamados transistores ), puesto que sus tiempos de vida y frecuencias de conmutación son mucho más altas. En convertidores de potencia es impensable usar interruptores mecánicos, dado sus especificaciones tan embonables a los requerimientos.

Además los interruptores se acompañan de diodos que permitan a las corrientes circular en sentido inverso al previsto cada vez que se conmute la tensión puesto que el motor está compuesto por bobinados que durante varios períodos de tiempo se opondrán a que la corriente varié.


Ahora vemos un puente H creado comunmente.


¿Que se necesita?

  • 2 transistores 2N2222 que son los que conmutaran las salidas.
  • 4 transistores TIP31 los cuales actuaran como interruptores.
  • 4 Diodos rectificadores para crear un puente de diodos a manera que limpien la señal analógica y se pueda usar el motor de corriente directa.


Relativamente es muy sencillo y los 2N2222 son los que ayudan como puentes para ver si se avanza o se retrocede.



Ahora, como se menciono más arriba. El uso de transistores y del puente rectificador es necesario en sistemas que requieren manejar voltajes altos y movimientos precisos, pero como en mi caso estoy usando un maximo de 5V con 200 miliamperes y a falta de transistores utilizaré una implementación wannabe pero efectiva del puente H.

Para ello utilizaré:
  • 2 circuitos integrados NE555 para aprovechar sus flipflops como transistores
  • 2 push o fuentes para crear interrupciones
  • 2 diodos rectificadores 1N4004 
  • 2 capacitores de .1 microFaradios
  • 2 resistores de 220 Komhs
  • Algo de cable

El diagrama de conexiones seria algo así:

Normalmente se usan reistencias pull-up si el disparador sera con negativo o pull-down si el disparador sera con positivo. Esto para que mande las señales de voltaje correctas, pero como el voltaje y amperaje que utilizaré son minimos, pués me di el lujo de utilizar resistores "normales".

Ambas salidas del motor de corriente directa van a un 555 y el motor esta compartiendo señal mediante los diodos rectificadores, para regular que el voltaje sea similar en ambos lados, obviamente no al mismo tiempo.

Por ultimo puedo decir que al utilizar este tipo de puente H ( si es que se  le puede llamar asi ) también se pueden usar las 4 variaciones. Avanza,frena por inercia, frena bruscamente, retrocede.

Una vez armado nos quedaria más o menos de esta forma:



Solo faltaria conectar el motor a las terminales de ambos lados para que funcione.
Y así es como se ensambla un puente H improvisado para motores tipicamente llamados " de juguete " que no son mas que motores de corriente directa. 



Interrupciones en arduino

¿Que es una interrupción?

Las interrupciones se refieren al paro inmediato del funcionamiento común del sistema. Esto es muy útil para hacer que las cosas sucedan automáticamente en programas que sean sensibles a estados, también pueden ayudar con problemas de temporizadores. También puede servir para detener completa o parcialmente el sistema en caso de que algún evento especifico suceda.

Un ejemplo de como utilizar estas interrupciones sería el de un lector de datos por ejemplo un sensor de temperatura. Suponiendo que al inicio del programa se toma lectura de la temperatura después se llama una función que cree la estadísticas, se empaqueta, se manda por algún protocolo seguro y después hace otra lectura. Ahora bien si llegamos a tener una aumento de temperatura inesperado queremos que tome esa temperatura y la envíe, pero esto es un problema ya que el proceso de creación de estadística, empaquetado y envió es tarado, más sin embargo si se le asigna una interrupción a la lectura de temperaturas el programa entero es interrumpido y se ejecuta la lectura para después enviar los datos que son más importantes.

También si tenemos un sistema que este enviando datos cualesquiera para monitorearlos, podemos asignar una interrupción que se accione con un botón para detener el programa y poder utilizar los datos, o para dejar de recibir más datos, según sea el caso.

¿Cómo usar una interrupción con el arduino?

La mayoría de las placas arduino tienen dos interrupciones externas.

   Interrupcion externa 0 : ( pin digital 2 )
   Interrupcion externa 1: ( pin digital 3 )

Esto para el arduino UNO.

Para usar interrupciones tenemos la función:

 void attachInterrupt( interrupcion, funcion, modo )

Dicha función especifica que función se invoca cuando se produce una interrupcion externa, si ya existia una función adjuntada al pin se substituye por la nueva.

Los parámetros de esta función son:

  •   interrupcion: el número de la interrupción ( Es un int y puede ser 0 o 1 esto para asignar el pin a usar ).

  •   funcion: Es la función que se invocara cuando la interrupción suceda, esta funcion NO debe tener parametro NI tampoco devolver nada. Comunmente se le conoce como  rutina de interrupción de servicio.

  •   modo: Esto define el criterio de la interrupción es decir cuando se considerara como interrupción. Existen 4 constantes predefinidas para poder usarlas como modos. 

   LOW Se dispara la interrupción cuando el pin tenga un valor bajo ( Cero lógico o LOW ).


   CHANGE Se dispara la interrupción cuando el pin se tenga un valor alto ( Uno lógico o HIGH ).

   RISING Se dispara la interrupción cuando el pin pase de valor bajo a alto ( LOW a HIGH | 0 a 1 ).

   FALLING Se dispara la interrupción cuando el pin pase de valor alto a bajo ( HIGH a LOW | 1 a 0 ).


Como dato queda decir que también se cuenta con funciones para activar o desactivar el uso de las interrupciones. Con tan solo usar la función noInterrupts() se asegura de que no se interrumpa la porción de código que le sigue a esta función, también esta la función interrupts() que hace lo contrario, ya que permite las interrupciones.Esto puede ser útil dependiendo el caso y se maneja similar a los hilos y candados.
Podríamos tener una porción de código así:

     void loop() {
        noInterrupts();
        FuncionCritica();
        interrupts();
        funcionComun();
        funcionComun2();
   }

Ahora vemos como seria el diagrama de conexiones para realizar una prueba.

Basicamente es un push button, un led y un par de resistencias acomodadas de manera que  se puedan utilizar con el siguiente codigo.


De no utilizar las interrupciones, el led tendria un comportamiento un poco raro, ya que pudiese no captar bien las señales que se le envian.
Esto es muy familiar respecto a los threads y los candados.

Sistemas operativos embebidos

¿Qué es un sistema operativo embebido?

Se puede definir como un sistema computacional que realiza una función espesifica o es diseñada con una aplicacion de software embebida. Dichos sistemas utilizan sistemas operativos en una ROM, tal como si fuera un disco duro en el uso de la pc.

¿Qué hace bueno a un sistema operativo integrado?

Son modulares, escalables, altamente configurables, tienen soporte para CPU y aceptan controladores de dispositivos perifericos.

Algunos ejemplos de estos sistemas operativos embebidos son:


  • OS/2 ( eComStation ) Este sistema fue uno de los más usados para sistemas embebidos, empezo a utlizarse para cajeros automaticos pero ya no es común ver dichos cajeros con este tipo de sistema.


  • Windows CE Al igual que OS/2 también fue muy usado en cajeros automaticos, aunque también llego a utilizarse en sistemas de navegación por mapas y se utilizo en la videoconsola Dreamcast, la cual no fue muy buena.






  • Windows XP Embedded Es básicamente el sistema operativo windows XP pero con la fortuna de que se pueden elegir las funciones y servicios que se necesitan, este sistema operativo es el que usan cajeros automáticos, expendedores, puntos de venta, algunas consolas y maquinas de videojuegos.




  • OSEK Este sistema es usado en un consorcio de empresas como un estandar abierto que rige la mitad de la industria automóvil, se puede ver en automóviles como los BMW, Chrysler, Opel o renault.



  • FreeBSD Este sistema operativo no es propio de sistemas embebidos, su versatilidad y su codigo abierto unix-like han permitido a la comunidad realizar proyectos para portarlo a sistemas embebidos.Satisfactoriamente se utiliza en televisores, routers, sistemas de seguridad y fue la base para CellOs.







  • vxWorks Este sistema operativo es un poco diferente ya que pertenece a la rama de RTOS   (real time operating systems ) y se utiliza en muchos dispositivos destacando que fue usado para operar vehículos espaciales.



  • QNX Este sistema fue desarrollado escensialmente para sistemas embebidos y esta disponible para muchas arquitecturas, tiene la capacidad de instalarse diferentes window managers y proporciona características de estabilidad frente a fallos de perifericos y aplicaciones. QNX se utilizo tambien en el Dreamcast.



  • LynxOS Este sistema junto con QNX pertenecen tambien a la familia de RTOS unix-like. Fue desarrollado con para su uso con una arquitectura de intel x86 y en su actualidad funciona con arquitecturas ARM, MIPS y PowerPC.



  • Embedded Debian, básicamente son los paquetes de Debian optimizados para su uso con procesadores menos potentes, RAM de baja capacidad y aplicaciones espesificas. Este sistemas operativo embebido forma parte de los mas importantes bajo el yugo del nucleo linux, ya que es de los mas estables que contienen dicho nucleo.


  • SALE Sonia Arch Linux Embedded, en marzo fue el release de la versión alfa/beta de este sistema operativo integrado. Dicho proyecto tiene un compilador de kernel customizado a partir de la distribución Arch Linux  y cuenta con la posibilidad de manejar el sistema como servidor, monitoreando el sistema via web, además de proximamente incluirle una versión de inteligencia artificial para su uso, muy prometedor y de codigo abierto.





¿Por qué usar un sistema operativo embebido?

Por que permite la multitarea y utilizar diferentes soluciones ya desarrolladas (dependiendo el sistema a usar ) para la solución de problemas, en vez de tener que desarrollar heurísticas para cada sistema embebido que se desarrolle. Son robustos y personalizables y tienen soporte en la web.

Consideraciones

Cuando se va a usar un sistema operativo integrado se deben tener ciertas consideraciones, ¿Qué procesadores son soportados por el OS?, ¿qué necesidades tiene el kernel con respecto al sistema embebido?,¿Tiene soporte para los drivers de los perifericos que necesito?


Gumstix

Los equipos Gumstix se concentran basicamente en dos productos: Gumstrix Overo y Gumstix Verdex. Ambos son SCBs ( single computer boards ).



Dichos equipos ofrecen una amplia gama de funciones para procesar aplicaciones especificas de sistemas ubicuos, capacidad para almacenamiento externo en memorias microSD, implementacion de interfaces inalámbricas para Bluetooth y Wifi, comunicación por puerto de serie, puertos USB, puerto para ethernet. Dichas SCB estan implementadas con Linux para sistemas embebidos.



Básicamente son ordenadores completos en una tarjeta.





Cuando recien se fueron desarrollando estas SCBs las gumstix Verdex presentaban un microprocesador Marvel XScale PXA270 que funcionaba a 400 o 600 MHz, contenian 128MB de memoria RAM.

Las Overo tenian un procesador Texas Instruments OMAP 3505 que se ejecutaba a 750 MHz, contenia 256MB de RAM.




Ambas tarjetas usan sistemas Linux configuradas especificamente para sistemas embebidos, además se pueden agregar modulos adicionales a las SCBs.


Gumstix SDK


Gumstix utiliza un framework de desarrollo llamado OpenEmbedded para completar una compilación cruzada desde las builds del framework, al compilar dichas builds se transfieren el kernel y la imagen del root file system a la gumstix usando cualquier tipo de transferencia, ya sea por ethernet, tarjeta SD o por puerto Serie.




- OpenEmbedded -
 Este framework se utiliza para crear distribuciones (comunmente, pero no obligatoriamente) para sistemas embebidos. Este framework nace a partir de algunos builds de gentoo, y dicho framework se maneja desde git, ya que es open source.


Raspberry Pi




En Febrero del 2012 salio al mercado una placa SBC ( single board computer ) llamada raspberry Pi.




¿Qué es una SBC, qué es la raspberry pi?

Una Single Board Computer es una computadora completa en un sólo circuito, básicamente esta constituida por un microprocesador con memoria RAM, Entradas y Salidas y demás características de un pc cualquiera.
Una SBC no es óptima para el uso cotidiano, más se utiliza para entornos de la industria o para aprendizaje sobre sistemas embebidos en el area de ciencia, tecnológia y electrónica.



Raspberry Pi contiene un procesador ARM1176JZF-S que corre a 700Mhz, contiene 256MB de memoria RAM y tiene ranura para una tarjeta SD para el almacenamiento externo.
Comunmente se le incluye el sistema operativo GNU/Linux o RISC OS.

Dicha placa contiene gran potencial a bajo coste, estas son sus especificaciones.





El primer prototipo de la raspberry era muy pequeño y contenia solo 1 puerto USB y 1 puerto HDMI. En su fase de pruebas ya era capaz de ejecutar un entorno operativo demostrando que usar Debian con escritorio ligero era facil.
También se hicieron pruebas con el HDMI ejecutando un video full HD a traves de dicha salida.


Esta placa principalmente es promovida por sus desarrolladores para promover el aprendizaje en python, C, BASIC y perl principalmente.


CI 78xx

La familia de circuitos integrados 78xx son conocidos como reguladores de voltaje positivo de triple terminal.
Dichos reguladores son muy usados y comercializados por que su principal funcion es regular el voltaje para poder utilizar con mayor seguridad los componentes electronicos de los proyectos.

Su maximo amperaje de salida es de 1Ampere, dependiendo del modelo pueden manejar salidas de voltaje de 5,6,8,9,10,12,15,18,24V segun sea el caso.
Cuentan con un protector termico de emergencia, aunque aún asi llegan a calentarse demasiado.


Rangos de capacidad para la familia 78xx







Dichos CI tienen tres terminales, voltaje de entrada, tierra y voltaje de salida.
La tensión de salida depende del modelo, como por ejemplo el modeo 7805 logra regular voltaje a 5V de corriente directa, lo cual lo hace muy común para suplir los TTLs ya que es el voltaje requerido por la gran mayoria de ellos.

Esta tabla nos dice la entrada y salida de voltajes dependiendo el modelo de CI que usemos.


Una recomendación personal es tener cuidado cuando se usa este tipo de reguladores, ya que siguen la ley de la conservación de la energia.
Entran P volts , salen Q volts, y la diferencia P - Q = X, donde X es el calor que emite el Circuito.

Placas con microcontroladores embebidos.

Para revolucionar el uso de los microcontroladores a principios de los 70's se empezaron a fabricar placas con microcontroladores embebidos y que fueran accesibles y faciles de usar para dedicarle tareas relativamente pequeñas a comparación de las tareas de un computador.

 Dichas placas nos proporcionan de todos los circuitos necesarios para tareas de control comunes como entradas y salidas, generador de pulsos de reloj, acceso a la RAM, y obviamente para uso de un microprocesador.

La mayoria de estas placas se utilizan para hacer desarrollos mas eficientes y rapidos sin gastar tiempo ensamblando el hardware de control.

Como estas placas son relativamente baratas y no se necesita demasiado conocimiento para realizar desarrollos pues normalmente se utilizan para la rama academica. Ahora hablare sobre diferentes placas y sus especificaciones.




  Arduino


 Es una plataforma de desarrollo que contiene un microcontrolador embebido y un entorno para crear software para la placa. Dicha placa la puedes montar tu mismo o comprarla lista para usar.
Arduino está basado en los microcontroladores atmega, en mi caso estoy familiarizado con el chip atmega328 ya que esta incluido en el arduino UNO.



Las especificaciones de dicho controlador son:




Netduino


Esta placa de desarrollo es para desarrollo exclusivo de un framework de la plataforma .NET y se podría decir que es una copia mejorada ( según el punto de vista personal ) del arduino duemilanove.
Esta placa utiliza microcontroladores ATMEL de 32 bits con una potencia de 48MHZ, y cabe destacar que esta placa es compatible con el arduino y gracias al SDK de .NET es posible desarrollar para este tipo de placas muy facilmente.
Practicamente la magia del netduino reside en su capacidad para debuggear los codigos y su mayor capacidad de memoria y frecuencia. Eso si, es más costoso.

Verificando la optimización

Seré breve y solo les comentaré sobre una de las maneras de probar si el código realmente se está optimizando.

Utilizando el comando time que forma parte de los sistemas Unix-like podemos conseguir el tiempo que tarda en ejecutarse nuestro programa.
Esto incluye el tiempo real de computo( tiempo total de ejecucción ), el tiempo de usuario ( es el tiempo que tarda en los calculos y las llamadas al kernel ) y el tiempo de uso del sistema ( solo las llamadas al kernel ).
Podemos decir que cuando un programa esta haciendo iteraciones se esta acumulando tiempo de usuario solamente.

El resultado se nos despliega con

0m0.000s
minutos
segundos
milisegundos


El manual nos dice que el uso de este comando es de la siguiente forma:

time [options] command [arguments...]

para este caso solo nos interesan los tiempos así que no le daremos opciones.

Ejemplo:

int main(int argi,char *argv[]){                                                
  argi = 0;                                                                     
  puts("Inicio");                                                               
  while(!(argi == 1000000)){                                                    
      puts("Love,Love,Love");                                                   
      argi++;                                                                   
  }                                                                             
  puts("final");   
  return 0;                                                             
}


usaremos este codigo que imprime 1 millón de veces una cadena de caracteres.
Lo compararemos con este código que hace lo mismo, pero escrito en assembly con sintaxis de Intel.

section .data

hello:  db 'Inicio',10,13 
slong:  equ $-hello

notDone: db 'Love, Love, Love',10,13
notlong: equ $-notDone

done:  db 'final',10,13
donelong: equ $-done

 section .text
 global main 
main:
 mov eax,4
 mov ebx,1
 mov ecx,hello
 mov edx,slong
 int 0x80

 xor ecx,ecx

loop:
 push ecx
 mov eax,4
 mov ebx,1
 mov ecx,notDone
 mov edx,notlong
 int 0x80

 pop ecx
 add ecx,1
 cmp ecx,1000000  ;cantidad de ciclos
 jl loop

theend:
 mov eax,4
 mov ebx,1
 mov ecx,done
 mov edx,donelong
 int 0x80

Utilizamos el comando time de la siguiente manera:


*mande la salida de datos hacia /dev/null
 para evitar ver el millon de impresiones en pantalla*




time ./cicloAssembly > /dev/null  




time ./cicloC > /dev/null


Es obvio cual es mas eficiente, ¿no?.
Esto sucede porque el codigo en assembly hace una system call en cada ciclo, es decir realiza un millón de llamadas al kernel. Sumando ese millón de llamadas al kernel a las veces que ese proceso sufrio de un switch context, page faults o fue manipulado por el scheduler nos da un tiempo relativamente largo.

El ejecutable de C es mucho muy rapido por el simple hecho de no hacer llamadas al  kernel.

Ahora usare el comando gcc -S ciclo.c  y eliminare todas las lineas del GDB para despues compilarlo y apreciar si eliminando las lineas de debuggeo se logra optimizar un poco el ejecutable.

El codigo assembly quedo asi ( sin lineas de debuggeo ) 

.LC0:
 .string "Inicio"
.LC1:
 .string "Love,Love,Love"
.LC2:
 .string "final"
 .text
 .globl main
 .type main, @function
main:
.LFB0:
 pushl %ebp
 movl %esp, %ebp
 andl $-16, %esp
 subl $32, %esp
 movl $0, 28(%esp)
 movl $.LC0, (%esp)
 call puts
 jmp .L2
.L3:
 movl $.LC1, (%esp)
 call puts
 addl $1, 28(%esp)
.L2:
 cmpl $1000000, 28(%esp)
 jne .L3
 movl $.LC2, (%esp)
 call puts
 movl $0, %eax
 leave
 ret



time ./cicloCtoASM > /dev/null


Ahora vemos 2 cosas interesantes.

  1. El tiempo de usuario no cambio, es decir que para dicho programa queda claro que el tiempo que tarda en imprimir un millón de veces la cadena de caracteres es de 77 milisegundos y el tiempo real solo difiere de 1 milisegundo lo cual puede ser causa del scheduler.
  2. A pesar de ser un programa en assembly no se realizaron llamadas al kernel, es decir que como podemos ver en el codigo, solo se estan llamando las funciones del lenguaje C.

Con estas pruebas podemos darnos cuenta que el codigo assembly escrito desde scratch puede llegar a ser muy pesado y no tan eficiente en terminos de velocidad de ejecucción mas sin embargo es mas versatil porque puede utilizar alrededor de 190 system calls diferentes, ademas que se puede ver que el hecho de traducir el codigo de C hacia Assembly no quiere decir que este será reducido al nivel mas bajo de integración con el procesador.

Por mi parte mi tarea sobre lenguaje ensamblador no fue en pro de una optimización, fue dirigida hacia el uso de las system calls, pero para aquellos que buscaban optimización esta entrada puede ser útil.

Como recomendación: si quieren velocidad utilizen el puts() ya que es mucho mas rapido que el printf. Verifiquen el codigo.s si le llegan a poner mas de 1 millón de iteraciones en su codigo de C, por alguna extraña razón el codigo.s quedaba sin delimitantes haciendo un loop infinito, y también si llegan a usar un trillón de iteraciones no duden en irse por un café true story.

Referencia:
printf versus puts

Recursos adicionales de los microcontroladores

Independientemente de su arquitectura basica los microcontroladores incorporan recursos especificos a su modelo.

Algunos de ellos son:


  • Temporizadores.
  • Sensores guardianes.
  • Protectores contra fallo de alimentación.
  • Estado de reposo.
  • Conversor alterna a directa o directa hacia alterna.
  • Comparador analógico.
  • Modulador de anchura de pulsos (PWM)
  • Puertos de entrada y salida digitales.
  • Puertos de comunicación.

Temporizadores.

Timer 555 ejemplo de temporizador
Se utilizan para controlar periodos de tiempo y llevan por lo general un contador de las instrucciones que succeden mediante E/S. 
Para medir los tiempos, se carga un registro con el valor adecuado y a continuación dicho valor se va incrementando o decrementando al ritmo de los pulsos de reloj o algún múltiplo hasta que se desborde o llegue a 0, que es justo cuando se produce el aviso. Los contadores por lo general estan en alguna de las patitas del microcontrolador, y se va llenando un registro al igual que con el temporizador.


Sensores guardianes

Tambíen son llamados Watchdogs
En una computadora personal suele suceder que por un fallo del software se bloquea la computadora, y para que vuelva a funcionar tenemos que reiniciar el sistema. Un microcontrolador debe funcionar sin un supervisor y de forma continua mientras se le suministre corriente. El sensor guardián consiste en un temporizador que, cuando se desborda y para por 0, se provoca un reset automáticamente en el sistema. Los sistemas deben diseñar un programa que controle la tarea de forma que se refresque el sensor guardián antes de que provoque un reset, si el programa falla no se refresca el sensor guardiánm y al completar el ciclo, fallara hasta provocar un reset.




Protector contra fallo de alimentación

Es un circuito simple que resetea al microcontrolador cuando el voltaje de alimentacion ( comunmente el VDD ) es inferior al voltaje mínimo. Mientras el voltaje de alimentación sea inferior al minimo el dispositivo se mantiene reseteado, comenzando a funcionar hasta que se sobrepasa ese valor.

Estado de reposo.

En muchas ocasiones los microcontroladores estan diseñados para esperar sin hacer nada hasta que se produzca algún acontecimiento externo que lo pongo a funcionar. Para ahorrar energía, los microcontroladores disponen de una instrucción especial ( conocido como SLEEP ), que les pasa al estado de reposo o de bajo consumo, en el cual los requerimientos de potencia son mínimos. Dicho estado detiene el reloj principal y detiene sus circuitos asociados, quedando sumido en un sueño electronico. Al activarse una interrupción ocasionada por un acontecimiento el microcontrolador se despierta e inicia su trabajo.

Conversor A/D y D/A

Los microcontroladores pueden tener un conversor analógico a digital para procesar señales analógicas utilizando un multiplexor que permite aplicar a la entrada del conversor diversas señales desde las patitas analógicas de los circuitos integrados.
El conversor de datos digitales obtiene dichos datos del procesamiento de una computadora en su correspondiente señal analógica que saca al exterior por una de las patitas de la cápsula. La gran mayoria de los microcontroladores disponen de estos conversores para poder trabajar con la corriente electrica y señales.


Comparador analógico

Compración logica.
Por lo general los comparadores analógicos estan internamente agregados a los microcontroladores, los cuales disponen de un amplifícador operacional que actúa como comparador entre una señal fija de referencia y otra variable que se aplica por una de las patitas. La salida del comparador proporciona un nivel lógico 1 o 0 según una señal sea mayor o menor que la otra. También hay modelos de microcontroladores con un módulo de tensión de referencia que proporciona diversas tensiones de referencia que se pueden aplicar en los comparadores.



Modulador de anchura de pulso (PWM)

Ancho regulador con salida PWM
Estos circuitos permiten una salida de pulsos de anchura variable, es decir que se ofrecen al exterior a través de las patitas del microcontrolador una serie de salidas regulables analógicamente, para darle una cantidad especifíca de corriente.







Puertos de entrada y salida digitales

Basicamente es un interruptor
que decide si seran Entradas
o Salidas.
Estos puertos se agrupan por lo general en grupos de ocho en ocho formando puertos. Las líneas digitales de los puertos pueden configurarse como entrada o salida cargando un 1 o un 0 en el bit correspondiente de un registro destinado a la configuración.






Puertos de comunicación

Para poder comunicar el microcontrolador de la posibilidad de comunicarse con otros dispositivos, otros buses de microprocesadores, sistemas, redes y poder adaptarlos con otros elementos bajo protocolos especifícos, algunos modelos de microcontroladores le proporcionan recursos que permiten dichas tareas.
Algunos son:
  • UART ( adaptador de comunicación serie asíncrona ). El cual tiene como objetivo convertir los datos recibidos del bus del microcontrolador en formato paralelo, a un formato serie que será utilizado en la transmisión hacia el exterior.
  • USART ( adaptador de comunicación serie síncrona y asíncrona ). El cual es una puerta paralela esclava para poder conectarse con los buses de otros microprocesadores.
  • USB ( Universal serial bus ). El cual es el adaptador de comunicaciones síncronas y asíncronas mas moderno actualmente.
  • CAN ( Red de area del controlador ). El cual permite la adaptación con redes de conexionado multiplexado para el cableado de dispositivlos automóviles por ejemplo.

Referencias.

Lo basico de un microcontrolador


Un microcontrolador es un circuito integrado de alta escala de integracion
que incorpora la mayor parte de los elementos que configuran un controlador, dicho controlador el dispositivo que se emplea para el gobierno de uno o varios procesos.

Un microcontrolador dispone por lo general de lo siguiente:

  • Unidad central de procesamiento.
  • Memoria RAM para los datos que se contendran.
  • Memoria [ ROM | PROM | EPROM ] para el programa.
  • Linea de Entrada/Salida para comunicacion exterior.
  • Modulos de control de perifericos 
  • Generadores de pulsos de reloj para la sincronizacion del sistema.


Las ventajas de usar los microcontroladores son muchas, como por ejemplo el aumento de control sobre los elementos que lo utilizan, la mayor flexibilidad con sus modulos de memoria reprogramable, mayor eficiencia al tener un solo dispositivo para diversos trabajos y requerimento de menos ajustes al ser un simple circuito integrado, ademas que por el simple hecho de ser tan reducido se puede adherir al elemento que debe gobernar, al hacer eso recibe el nombre de controlador embebido.

Porque es diferente un microprocesador y un microcontrolador?.

El microprocesador es un circuito integrado que contiene una unidad central de procesamiento que intepreta las instrucciones en conjunto del camino de datos. Cada una de las patitas del microprocesador sacan lineas de buses de direcciones,datos y control para poder conectarle memoria, y los demas modulos de entrada y salida, para de estar forma poder configurar una computadora con el conjunto de varios circuitos integrados. Un microprocesador puede variar deacuerdo con los modulos que se le conecten.


El microcontrolador es un sistema invariable, ya que contiene sus modulos de memoria y E/S en su interior y solo sobresalen sus lineas de gobernacion ( de control ).



Arquitectura basica de un microcontrolador

La mayor parte de los microcontroladores estan basados en la arquitectura Harvard, dicha arquitectura dispone de dos memorias independientes, yna que contiene solo instrucciones y otra solo datos. Estas dos memorias disponen de sus respectivos sistemas de buses de acceso y es posible realizar operaciones de acceso simultaneamente en ambas memorias. Los microcontroladores PIC llevan una arquitectura Hardvard.

La unidad central de procesamiento de un microcontrolador

Es la encargada de direccionar la memoria de instrucciones, recibir el codigo de la instruccion, decodificarla y ejecutar la operacion, asi como el almacenamiento del resultado. Existen tres orientaciones en cuanto a la arquitectura de los microcontroladores.

- CISC ( Computadores de juego de Instrucciones Complejo ) Disponen de instrucciones maquina en su repertorio, son mucho muy potentes y requieren de muchos ciclos para su ejecuccion. Su ventaja es que ofrecen instrucciones coplejas que actuan como macros.
- RISC ( Computadores de juego de Instrucciones Reducido ) El repertorio de instrucciones maquina es muy reducido y las instrucciones son simples y, generalmente, se ejecutan en un ciclo. La sencillez permite optimizar el hardware y el software de dicho procesador.
SISC ( Computadores de juego de Instrucciones Especifico ) Estan hechos para aplicaciones especificas como su nombre lo dice y el sistema de instrucciones se adapta a la aplicacion prevista a crear.

Memoria de un microcontrolador

Como se menciono arriba, en los microcontroladores la memoria de instrucciones y la de datos estan integradas en el chip. Una parte de esta memoria es no volatil del tipo Read Only Memory y esta destinada a contener las instrucciones que goriernan la aplicacion, es decir el programa que le hemos desarrollado para su control. Cabe destacar que los microcontroladores no tienen sistemas de almacenamiento masico como discos duros, ya que para su ejecuccion solo necesita un unico programa. Por ultimo para la ROM normalmente se le dan de 512 bytes hasta 8 kb.
Otra parte es Random Access Memory y se utiliza para guardar datos durante la ejecuccion de las instucciones. Dicha memoria es reducida ya que solo necesita contener unas cuantas variables y cambios de informacion durante la ejecuccion del programa. A esta memoria se le otorgan alrededor de 512 bytes.

Los microcontroladores actuales solo pueden tener uno de cinco de los tipos de memoria no volatil, como son:

-ROM: una memoria no volatil que puede procesar cantidades de varios miles de unidades.
-OTP: una memoria no volatil que solo puee ser programada una sola vez por el usuario.
-EPROM: su nombre indica su funcion (Erasable programmable read only memory) solo cuenta con una particularidad ya que debe exponerse a rayos ultravioleta durante varios minutos para poder borrarle el contenido.
-EEPROM: es la version mejorada de la EPROM ya que este tipo de memorias se pueden borrar con electricidad, no son necesarios los rayos UV. Pero se deben usar con cuidado ya que su reprogramacion cumple un ciclo finito de veces, no son eternos.
-FLASH: cumple la funcion de una ROM y una RAM, porque se puede leer y escribir informacion en dicha memoria, haciendola una memoria mas veloz que la EEPROM pero cambiando el coste de tolerancia para los ciclos de escritura y borrado.

EPROM

Modulos de control y generador de pulsos 

Los microcontroladores estan diseñados para soportar lineas de E/S para comunicar el computador interno con los perifericos exteriores y asi proporcionar soporte a las señales de entrada, salida y control. Cada microcontrolador dispone de un circuito oscilador que genera un onda cuadrada de alta frecuencia ( es decir, una onda que envia valores entre dos rangos fijos ) que configura los pulsos de reloj usados en la sincronización de todas las operaciones del sistema.
Para estabilizar la frecuencia de trabajo suele usarse un cristal de cuarzo junto con otros elementos pasivos, en su defecto un resonador ceramico, o una red RC.
Aumentar la frequencia de reloj hace una ejecuccion de instrucciones mucho mas rapida, pero aumenta considerablemente el consumo de energía.


Referencia
website Dr. villafaña

Ever Medina. Con la tecnología de Blogger.