Mostrando las entradas con la etiqueta Microcontroladores PIC. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Microcontroladores PIC. Mostrar todas las entradas

jueves, 2 de enero de 2020

XiuaElectronics: Inteligencia artificial aplicada a microcontroladores Parte #03


Buenos días estimados lectores, hoy vamos a ver la tercera y última parte de un tema sumamente interesante, que no había podido continuar por falta de tiempo. Hablamos sobre la inteligencia artificial aplicada a los microcontroladores. En una anterior entrada, parte #02 de este tema, pudimos observar una serie de impedimentos para poder crear un algoritmo con I.A en un microcontrolador. También vimos  algunas medidas para poder acercarnos a un algoritmo de inteligencia artificial en estos, pero con algunas desventajas. Hoy vamos a ver como al final de cuentas es posible o no utilizar esta en microcontroladores. Para los que no estén actualizados con las entradas anteriores a través de este link podrán ver la Parte #01. Comencemos.


DNN ( Deep Neural Network) y ANN (Artificial Neural Network ).


En la entrada pasada nombramos un termino que se ve mucho en inteligencia artificial y es el DNN, traducido del ingles (red neural profunda), donde explicábamos que esta sería una posible solución a implementar en la programación de la I.A en los microcontroladores. El DNN es mayormente utilizado por los científicos de datos. Este tiene como característica que posee varias capas entre las entradas y salidas de un sistema o diseño al cual se le esta implementando dicho algoritmo. El DNN hace parte de una categoría más amplia, el ANN o traducido del ingles (Redes neurales artificiales). En esta categoría entran los algoritmos de capas profundas o aquellos que solo tienen una sola capa.

Hago mención de estos dos términos ya que estos son los causantes de que haya un posible solución a la programación de inteligencia artificial en los microcontroladores. Para ser optimo este tipo de programación tenían que haber cambios en los compiladores y en los microcontroladores. 

Antes de utilizar un algoritmos de inteligencia artificial, lo programadores lo que hacen es entrenar sus programas con una serie de requisitos. Para entender mejor esto del entrenamiento, les sugiero que lean acerca del funcionamiento del machine learning o aprendizaje maquina. En general, la solución que se estableció para esto fue entrenar previamente diferentes tipos de algoritmos de DNN y optimizarlos en el microcontrolador. Haciendo alusión que los datos serían leídos a través de sus periféricos, utilizaron el POO para poder enlazar diferentes periféricos para dichos fines.

La capacitación de ANN (NN) implica pasar los conjuntos de datos a través de la red neuronal de manera iterativa para que las salidas de la red puedan minimizar los criterios de error deseables.
La definición, la capacitación y las pruebas de ANN generalmente se realizan utilizando marcos de aprendizaje profundo listos para usar.
Esto generalmente se realiza en una potente plataforma informática, con memoria y potencia computacional prácticamente ilimitadas, para permitir muchas iteraciones en un corto período de tiempo.

El resultado de este entrenamiento es la red neuronal artificial pre-entrenada.

Una vez que se pre-entrena la red neuronal artificial lo que sigue es optimizar este nuevo algoritmo en uno optimo para los microcontroladores. Aquí es donde entra la innovación, y la solución de nuestros problemas. La empresa STMicroelectronics, fabricante de semiconductores, fabrica los microcontroladores de 8 bits STM8 y los de 32 bits STM32, cada arquitectura con una amplia familia llena de variaciones. --Hago alusión a esta empresa por que es la única que ha innovado en el campo de la I.A y los microcontroladores, no me están patrocinando 😢 (lastimosamente)-- Ha diseñado en los últimos años software que nos hace eso, optimizar el código para poder grabarlo en un microcontrolador. Este software se llama STM32Cube.AI, y como su nombre lo indica solo es para microcontroladores de 32 bits. Vamos ver de que trata esto.

STM32Cube.AI

La herramienta STM32Cube.AI ofrece una interoperabilidad simple y eficiente con las populares herramientas de capacitación de Deep Learning ampliamente utilizadas por la comunidad de desarrolladores de Inteligencia Artificial. La salida de estas herramientas se puede importar directamente al STM32Cube.AI.

El siguiente paso es incrustar el ANN pre-entrenado en una MCU (código optimizado que minimiza la complejidad y los requisitos de memoria).
Esta parte es muy fácil e intuitiva gracias a la herramienta de software STM32Cube.AI. El STM32Cube.AI está completamente integrado en el ecosistema de desarrollo de software STM32 como una extensión de la herramienta STM32CubeMX ampliamente utilizada.
Permite la conversión rápida y automática de ANN pre-entrenadas en código optimizado que puede ejecutarse en una MCU. La herramienta guía a los usuarios a través de la selección de la MCU correcta y proporciona información rápida sobre el rendimiento de la red neuronal en la MCU elegida, y la validación se ejecuta tanto en su PC como en la MCU STM32 de destino.

Vamos a ver el siguiente vídeo de la empresa donde podremos apreciar esto:


Y en general esta seria un enlace directo y sin muchas complicaciones al desarrollo de aplicaciones con inteligencia artificial y microcontroladores. Los dejo con un vídeo donde podrán apreciar una aplicación básica de la IA en el mundo exterior, donde se aplica IA con microcontroladores. No siendo más los dejo con el vídeo. No olvides seguirme y compartir mi contenido. 




Escrito por: Breismam Alfonso Rueda Díaz



Fuentes
:

  • http://www.konradlorenz.edu.co/images/stories/suma_digital_matematicas/Programacion%20Dinamica.PDF
  • https://www.st.com/content/st_com/en/about/innovation---technology/artificial-intelligence.html
  • Xumari, G.L. Introduction to dynamic programming. Wilwy & Sons Inc., New York. 1967.






Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.



viernes, 25 de enero de 2019

XiuaElectronics: Inteligencia artificial aplicada a microcontroladores Parte #02

Inteligencia artificial aplicada a microcontroladores Parte #02


Buenos días estimados lectores. En el día de hoy continuaremos con la segunda parte se inteligencia artificial aplicada a microcontroladores. 

Para aquellos que aún no están en contexto, a través del siguiente link podrán ver la primera parte. Analizando la entrada anterior a este tema pudimos ver que de alguna forma un microcontrolador nos daba la posibilidad de poder integrar  una red neural artificial, o en general algún método de la inteligencia artificial para optimizar algún tipo de proceso. Quedamos a la espectativa de saber si es posible o no el implementar esto; para fortuna de todos si. Resulta que tras un tiempo de consultas y estudios, pude observar que hay algo llamado programación dinamica; y aquí se encuentra un aliciente pero no el unico de la solución de este contexto.


Mapa de problema sobre diligencias

¿Qué es la programación dinámica?



La programación dinámica es un método para reducir el tiempo de ejecución de un algoritmo mediante la utilización de subproblemas superpuestos y subestructuras óptimas. El matemático Richard Bellman inventó la programación dinámica en 1953 que se utiliza para optimizar problemas complejos que pueden ser discretizados y secuencializados.

Una subestructura óptima significa que se pueden usar soluciones óptimas de subproblemas para encontrar la solución óptima del problema en su conjunto. Por ejemplo, el camino más corto entre dos vértices de un grafo se puede encontrar calculando primero el camino más corto al objetivo desde todos los vértices adyacentes al de partida, y después usando estas soluciones para elegir el mejor camino de todos ellos. En general, se pueden resolver problemas con subestructuras óptimas siguiendo estos tres pasos:

  • Dividir el problema en subproblemas más pequeños.
  • Resolver estos problemas de manera óptima usando este proceso de tres pasos recursivamente.
  • Usar estas soluciones óptimas para construir una solución óptima al problema original.
  • Los subproblemas se resuelven a su vez dividiéndolos en subproblemas más pequeños hasta que se alcance el caso fácil, donde la solución al problema es trivial.


Decir que un problema tiene subproblemas superpuestos es decir que se usa un mismo subproblema para resolver diferentes problemas mayores. Por ejemplo, en la sucesión de Fibonacci (F3 = F1 + F2 y F4 = F2 + F3) calcular cada término supone calcular F2. Como para calcular F5 hacen falta tanto F3 como F4, una mala implementación para calcular F5 acabará calculando F2 dos o más veces. Esto sucede siempre que haya subproblemas superpuestos: una mala implementación puede acabar desperdiciando tiempo recalculando las soluciones óptimas a problemas que ya han sido resueltos anteriormente.

Esto se puede evitar guardando las soluciones que ya hemos calculado. Entonces, si necesitamos resolver el mismo problema más tarde, podemos obtener la solución de la lista de soluciones calculadas y reutilizarla. Este acercamiento al problema se llama memoización (no confundir con memorización; en inglés es llamado memoization). Si estamos seguros de que no volveremos a necesitar una solución en concreto, la podemos descartar para ahorrar espacio. En algunos casos, podemos calcular las soluciones a problemas que de antemano sabemos que vamos a necesitar.

Cuando hablamos de optimizar nos referimos a buscar alguna de las mejores soluciones de entre muchas alternativas posibles. Dicho proceso de optimización puede ser visto como una secuencia de decisiones que nos proporcionan la solución correcta. Si, dada una subsecuencia de decisiones, siempre se conoce cuál es la decisión que debe tomarse a continuación para obtener la secuencia óptima, el problema es elemental y se resuelve trivialmente tomando una decisión detrás de otra, lo que se conoce como estrategia voraz. En otros casos, aunque no sea posible aplicar la estrategia voraz, se cumple el principio de optimalidad de Bellman que dicta que «dada una secuencia óptima de decisiones, toda subsecuencia de ella es, a su vez, óptima». En este caso sigue siendo posible el ir tomando decisiones elementales, en la confianza de que la combinación de ellas seguirá siendo óptima, pero será entonces necesario explorar muchas secuencias de decisiones para dar con la correcta, siendo aquí donde interviene la programación dinámica.

Contemplar un problema como una secuencia de decisiones equivale a dividirlo en problemas más pequeños y por lo tanto más fáciles de resolver como hacemos en Divide y Vencerás, técnica similar a la de programación dinámica. La programación dinámica se aplica cuando la subdivisión de un problema conduce a:

Ejemplo sobre problema de diligencia-programación dinámica
  • Una enorme cantidad de problemas.
  • Problemas cuyas soluciones parciales se solapan.
  • Grupos de problemas de muy distinta complejidad.

Pero como vimos anteriormente en la definición de programación dinámica, podemos deducir que unos de los problemas fundamentales al momento de intentar programar un algoritmo de forma dinámica es la cantidad de memoria que se necesitaría para poder programar los distintos subproblemas que conllevaría la implementación. Pero bueno, para esto hay una solución y es la implementación de una memoria flash externa controlada por algún periférico SPI que posea el microcontrolador. Entonces, en la actualidad. ¿porqué no se implementan este tipo de programación?, por una sencilla razón, y es que los compiladores no estan optimizados para este tipo de programación. Entonces, ¿si no están optimizados para este tipo de programación, porqué no los optimizan?. Resulta que este tipo de programación no es muy eficiente para distintas situaciones, por tal razón, no es viable optimizar los microcontroladores para estos tipos de algoritmos; pero bueno, no todo son malas noticias, hay situaciones que poco a poco se van presentando en la industria de una manera exponencial y que sugiere la nesecidad de implementar algún tipo de algoritmo autónomo que dependiendo de las variables, pueda decidir la mejor solución sin necesidad de intervención humana. Es en este punto donde entra a jugar las DNN (Deep Neural Networks), que son algoritmos entrenados para para realizar tareas específicas. Anteriormente mencioné que si se puede implementar inteligencia artificial en los microcontroladores; básicamente se puede hacer algunos arreglos, crear compiladores que se ajusten a la necesidad de un algoritmo tan especializado como lo son como los de programación dinámica, pero como dije anteriormente el tiempo es un recurso que no podemos olvidar, y si es para un proyecto de baja escala, posiblemente no valga la pena ponerse a realizar este trabajoso proceso.

Una solución actual y que es muy viable es implementar una DNN, que en cuestión ya es posible. Veremos este apartado de implementación de redes neurales en microcontroladores en una tercera parte para poder tratar mejor el tema.

Aquí podrás ver la Parte #03.


Escrito por: Breismam Alfonso Rueda Díaz


Fuentes:

  • http://www.konradlorenz.edu.co/images/stories/suma_digital_matematicas/Programacion%20Dinamica.PDF
  • https://www.st.com/content/st_com/en/about/innovation---technology/artificial-intelligence.html
  • Xumari, G.L. Introduction to dynamic programming. Wilwy & Sons Inc., New York. 1967.




Bien muchachos, esto es todo por hoy. Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.




Cualquier duda, trabajo, tutoria personalizada por correo electrónico o pagina en facebook:




sábado, 10 de noviembre de 2018

XiuaElectronics: Inteligencia artificial aplicada a microcontroladores Parte #01

Inteligencia artificial aplicada a microcontroladores Parte #01

Buenos días estimados lectores. 

En el día de hoy veremos un tema de mucha importancia actualmente ya que nos proveerá el conocimiento necesario sobra las tecnologías emergentes como lo son la IA o inteligencia artificial y su implementación actual. Comencemos.

En la actualidad han aparecido diferentes tecnologías que han optimizado los procesos y la tareas de la cotidianidad, como lo son las tareas que requieren cierto grado de supervisión y toma de decisiones con base en señales proveniente de ellas. Un ejemplo claro de esto seria el buzón de voz de nuestros celulares. La tarea sería llamar; las posibles señales serían por ejemplo en caso en el que el usuario contestara, otra señal sería el caso de que no conteste y la otra señal sería el caso en el que el celular este apagado. cada una de estas señales requieren cierto tipo de respuesta, y para eso las tecnología nos ha provisto de procesadores los cuales cumplen la función de efectuar una decisión previamente programada. Por ejemplo cuando el usuario no contesta, el procesador esta programado para que nos redireccione al buzón de voz de nuestro servicio de telefonía. Ojo con esto último, no estamos hablando del procesador de nuestros celulares, sino de los servidores que nuestro proveedor de servicios utiliza para sistematizar las comunicaciones.

Acá es donde empezamos a ver lo complejo del asunto, ya que anteriormente dijimos que las decisiones son previamente programadas, pero ¿qué pasaría si hubieran nuevos parámetros desconocidos por el prestador de servicios y el programador de acciones del procesador?. En el caso hipotético donde necesitáramos de una nueva acción no programada, el procesador no sabría como actuar y por tal motivo nos arrojaría respuestas aleatorias o tal vez se quedaría dormido. Para solucionar este inconveniente se aplican técnicas como lo son el machine learning  o aprendizaje automático para la toma de decisiones con base en distintas señales y sin necesidad de efectuar una programación de respuestas sistemáticas. En este punto lo que hace el programa es utilizar distintas variables para poder ejecutar una respuesta con base en un ejemplo previamente programado. para entender mejor como funciona el learning machine vamos a utilizar un ejemplo de  un equipo biomédico para la predicción de tumores.


Figura 1: Predicción de tumores malignos con respecto al tamaño
Resulta que la implementación del aprendizaje automático para la predicción de tumores tiene como punto de referencia ejemplos de la vida real, y de esta forma se vuelve un método probabilístico muy confiable. vamos a desglosar mejor este asunto. 

En la figura 1 podemos observar una gráfica que nos muestra un eje horizontal que representa el tamaño de un tumor y el eje vertical nos representa si efectivamente el tumor el benigno o maligno. Los cuadros azules nos representan los casos en los que el tumor fue benigno, y los hexágonos nos van a representar los casos en los que el tumor fue maligno. Según la gráfico podemos ver que entre el tumor fue más grande hubo más casos en los que fue maligno, pero en cambio para los casos que el tumor fue benigno, era de menor tamaño. Los casos anteriormente mostrados los podemos tomar como ejemplo para crear un programa que obtenga el tamaño de un tumor y con base en este podamos saber que probabilidades tiene de que sea un tumor benigno o maligno. Imaginemosnos el escenario donde a través de una resonancia magnética un equipo biomédico nos mida le tamaño de un tumor y con base en ejemplos de la vida real se pueda predecir si es o no maligno. Pues bien, funcionaría de la forma en la que lo describimos anteriormente en la gráfica, y es aquí donde empieza a jugar el aprendizaje automático, ya que un tumor es probablemente maligno no lo por su tamaño sino que también por la edad del paciente, y otras características que posea el portador del tumor; en estos casos lo que se utiliza es una gran base de datos en una nube para tomar miles de ejemplos de diagnósticos positivos y negativos y así decidir si es o no maligno.

Pero cuando no tenemos grande cantidades de datos solo podemos tener en cuenta cierta cantidad de ejemplos. Recordemos que una nube es simplemente un servidor conectado a la red de Internet, así que en los casos que no haya Internet necesitaremos otras maneras, o simplemente estaremos limitados. Pero bueno dijimos que esto solo es aplicado a los servidores, que funcionan con microprocesadores, pero, ¿no podemos implementarlo en microcontroladores?. La respuesta de la anterior pregunta reside en cual es la diferencia de un procesador y un microcontrolador.


¿Qué son los microprocesadores?


Son los encargados de ejecutar los programas, desde el sistema operativo hasta las aplicaciones de usuario; sólo ejecuta instrucciones programadas en lenguaje de bajo nivel, realizando operaciones aritméticas y lógicas simples, tales como sumar, restar, multiplicar, dividir, las lógicas binarias y accesos a memoria.
Puede contener una o más unidades centrales de procesamiento (CPU) constituidas, esencialmente, por registros, una unidad de control, una unidad aritmético lógica (ALU) y una unidad de cálculo en coma flotante (conocida antiguamente como «coprocesador matemático»).



¿Qué son los microcontroladores?


Un microcontrolador (abreviado μC, UC o MCU) es un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria. Está compuesto de varios bloques funcionales, los cuales cumplen una tarea específica. Un microcontrolador incluye en su interior las tres principales unidades funcionales de una computadora: unidad central de procesamiento, memoria y periféricos de entrada/salida.

Según lo anterior dentro de un microcontrolador hay un microprocesador, y es aquí donde entramos a la pregunta clave de este tema, ¿podemos utilizar el aprendizaje automático con los microcontroladores ya que poseen un microprocesador en su interior?; esto lo veremos en la siguiente entrada amigos.






Esperemos en la próxima entrada la continuación de este tema tan interesante y de suma importancia.

Aquí podrás ver la Parte #02.

Escrito por: Breismam Alfonso Rueda Díaz


Fuente:
  • https://www.cancer.net/cancer-types/31366/view-all
  • https://jaimetorresy.blogspot.com/p/unidad-central-de-proceso-ucp-cpu.html
  • https://tallerelectronica.com/2014/11/30/microcontroladores/






Bien muchachos, esto es todo por hoy. Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.




Cualquier duda, trabajo, tutoria personalizada por correo electrónico o pagina en facebook:
Facebook: https://www.facebook.com/electronicalibrexc/






sábado, 30 de septiembre de 2017

XiuaElectronics: Módulo de voltaje de referencia PIC16F628A.

Módulo de voltaje de referencia PIC16F628A.


Que tal amigos?

En el día de hoy vamos a ver qué es y como funciona el módulo de voltaje de referencia de un PIC16F628A; vamos a ver unas pequeñas aplicaciones y también observaremos como se comporta en la vida real este módulo.

¿Qué es el módulo de voltaje de referencia del PIC16F628A?


El módulo de referencia de voltaje es aquel que nos permite tomar un voltaje fijo con respecto al voltaje VCC que se le esta aplicando al PIC16F628A; consiste en una red de escaleras de resistores seleccionables de 16 clavijas en las cuales seleccionaremos los voltajes deseados, es decir, podemos seleccionar hasta 16 niveles de voltajes para cada rango. Esta escalera de resistores nos proporciona dos rangos de voltajes VREF y posee una función de desconexión para minimizar el consumo de energía en el microcontrolador cuando no se este utilizando el voltaje de referencia.

Para poder controlar este módulo poseemos un registro llamado VRCON con 8 bits de control como se ve en la figura 1.

Figura 1: Registro VRCON PIC16F628A.
Bit 7      VREN: Bit que habilita en módulo VREF para su ejecución.
             1= Enciende el circuito VREF.
             0= Apaga el circuito VREF, no hay drenaje DD
Bit 6      VROE: Bit que habilita la salida del VREF
             1= VREF se emite por el pin RA2
             0= VREF se desconecta del pin RA2
Bit 5      VRR: Bit que selecciona el rango de VREF
             1= Rango bajo
             0= Rango alto
Bit 4      No se implementa, se lee como "0"
             1= No se implementa
             0= No se implementa
Bit 3-0  VR<3:0>: Selecciona el valor de VREF en los niveles de 0 a 15
            Cuando VRR= 1: VREF = (VR<3:0>/ 24) * VDD
            Cuando VRR= 0: VREF = 1/4 * VDD + (VR<3:0>/ 32) * VDD



Figura 2: Formulas para hallar VREF en rango alto y bajo.

Bien muchachos como vimos anteriormente esto es lo que concierne al registro VRCON; aquí hay una particularidad y es que en los bits 3-0 nos proporcionan unas formulas dependiendo si seleccionamos un rango alto o un rango bajo. Las ecuaciones utilizadas para obtener el VREF son las que se aprecian en la figura 2.

Pero bueno en la figura 2 nos dice que dependemos de un valor VR<3:0>, este valor representa uno de los 16 niveles comprendidos de "0000" a "1111" que nosotros le demos a los últimos 4 bits del registro VRCON, En general ese valor depende de la selección del nivel que se quiera hacer. Vamos a ver la figura 3 que nos representa la escalera de resistores de 16 niveles con respecto a los bits 3-0.

Figura 3: Diagramas de bloques del módulo de voltaje de referencia.
El tiempo de ajuste del módulo de referencia de tensión debe tenerse en cuenta al cambiar la salida VREF (Tabla 1). 

Tabla 1: Especificaciones del voltaje de referencia.
1. Tiempo de estabilización medido mientras VRR = 1 y VR <3:0>  transiciones de '0000' a '1111'.
2. Cuando VDD está entre 2,0V y 3,0V, los niveles de tensión de salida VREF en RA2 descritos por la ecuación: [VDD / 2 ± (3 - VDD) / 2] pueden causar la Precisión Absoluta (VRAA) La señal de salida VREF en RA2 debe ser mayor que la señal máx.


Bueno ya que vimos todo lo necesario vamos a ver nuestro primer ejemplo. 
Pasos para configurar el módulo VREF:

1. Habilitamos módulo VREF a través de bit 7.
2. Habilitamos salida por el pin RA2 a través del bit 6.
3. Seleccionamos rango bajo con el bit 5
4. Dejamos el bit 4 como 0
5. Seleccionamos el el valor deseado <3:0> en binario sería un valor desde "0000" a "1111" y en decimal sería un valor de 0 a 15.

En Assembler O Ensamblador: 

* Aquí vamos a habilitar el VREF, luego desactivamos la salida por el pin RA2, luego seleccionamos rango bajo, y por último seleccionamos un valor de 6 en decimal o en binario 0110 para obtener un voltaje de 1.25V según la formula vista en la figura 2. 

MOVLW D'10000000'      ; Comparador 2 C2V IN + > C2V IN -
MOVWF CMCON           ; Configuramos CMCON
BSF STATUS,RP0         ; Entramos al banco 1
MOVLW B'11110000'       ; RA0 a RA3= entradas || RA4 a RA8= Salidas
MOVWF TRISA             ; Configuramos PORTA
MOVLW B'10100110'      ; VREF=1 || Output RA2=0 || VRR=1 || VR=6
MOVWF VRCON           ; Configuramos VRCON
BCF STATUS,RP0         ; Salimos del banco 1
CALL RETARDO10US   ; Llamamos un retardo de 10us

Precisión / error de la referencia de voltaje.

La gama completa de  VSS a VDD no se puede realizar debido a la construcción del módulo. Los transistores en la parte superior e inferior de la red de escalera de resistencia (Figura 3) mantienen VREF acercándose a VSS o VDD. El módulo de Referencia de Tensión es VDD derivado y por lo tanto, la salida VREF cambia con fluctuaciones en VDD. La precisión absoluta del módulo de referencia de voltaje se puede encontrar en la Tabla 1.

Operación durante el modo sueño del microcontrolador, modo suspensión.

Cuando el dispositivo se activa desde el modo de suspensión a través de una interrupción o un tiempo de espera del temporizador de vigilancia, el contenido del registro VRCON no se ve afectado. Para minimizar el consumo de corriente en el modo de reposo, el módulo de referencia de voltaje debe desactivarse.

Efectos de un reset.

Un dispositivo Reset deshabilita el módulo de Referencia de Tensión mediante el borrado del bit VREN (VRCON <7>).
Este Reset también desconecta la referencia del pin RA2 borrando el bit VROE (VRCON <6>) y selecciona el rango de alta tensión borrando el bit VRR (VRCON <5>). Los bits de selección de valor VREF, VRCON <3:0>, también se borran.

Consideraciones sobre la conexión.

  • El módulo de referencia de voltaje funciona independientemente del módulo comparador. 
  • La salida del generador de referencia puede conectarse al pin RA2 si el bit TRISA <2> está ajustado y el bit VROE, VRCON <6>, está ajustado. 
  • Habilitar la salida del módulo de referencia de voltaje en el pin RA2 con una señal de entrada presente aumentará el consumo de corriente. 
  • La conexión de RA2 como salida digital con VREF habilitado también aumentará el consumo de corriente. 
  • El pin RA2 se puede utilizar como una simple salida D/A con capacidad de accionamiento limitada. 
  • Debido a la limitada capacidad de accionamiento, debe utilizarse un buffer junto con la salida del módulo de referencia de tensión para conexiones externas a VREF. 
  • La Figura 4 muestra un ejemplo de técnica de almacenamiento en búfer.

Figura 4: Ejemplo de buffer de salida de la referencia del voltaje.


Aplicaciones del módulo de referencia de voltaje...


Las aplicaciones que se le pueden dar a este módulo con ilimitadas, por ejemplo, supongamos que tenemos un circuito que nos este enviando cada cierto tiempo una señal con datos recolectados de un horno de fundición. Este horno posee un PIC16F628A el cual me esta midiendo constantemente la temperatura del horno a través de un sensor LM35 (No lo intenten en casa, no les funcionará con un LM35 jajaja). La alimentación de este sensor es la misma que la del microcontrolador. En dado caso que la alimentación caiga, es decir, haya una caída de tensión en el circuito, automáticamente el sensor nos arrojará datos desfasados con lo real y por tal motivo se puede producir un accidente. Según las ecuaciones utilizadas para los rangos alto y bajo, si en dado caso hay una caída de tensión en el microcontrolador, automáticamente cambiará la salida del VREF; podemos aprovechar esto y utilizarlo para generar una alarma cuando el voltaje de referencia cambie y así alertarnos de que hay una falla en el sistema.

El anterior ejemplo es un caso hipotético que me acabe de inventar, Sería ilógico utilizar un LM35  para tal tarea a no ser que sea un horno de joyería; tal vez hallan muchos circuitos que corrijan esto sin necesidad del módulo VREF, tal vez no. El caso es mostrar como este módulo puede ayudarnos en diferentes situaciones que se nos presentan a diario.



Bien muchachos, esto es todo por hoy. Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.

Esto es todo por hoy, Sigue mi blog y visita mi próxima entrada!

Cualquier duda, trabajo, tutoria personalizada por correo electrónico o pagina en facebook:



Salu2...









miércoles, 30 de agosto de 2017

XiuaElectronics: Detección de voltaje Alto/Bajo (HLVD) PIC18XXXX

Detección de voltaje Alto/Bajo (HLVD) PIC18XXXX.


Que tal amigos?

En el día de hoy les traigo un muy interesante y poco conocido tema. En este caso voy a hablar sobre el modulo de detección de caída o subida de tensiones para la familia de PIC18FXXXX. Como tal voy a mostrar como funciona internamente, como se debe configurar y sus posibles aplicaciones.



HIGH/LOW-VOLTAGE DETECT (HLVD) || DETECCIÓN DE VOLTAJE ALTO/BAJO(HLVD).


Los dispositivos PIC18F2455/2550/4455/4550 disponen de un módulo de Detección de Alta/Baja Tensión (HLVD). Este es un circuito programable que permite al usuario especificar un punto de disparo del voltaje del dispositivo y la dirección de cambio desde ese punto. Si el dispositivo experimenta una excursión más allá del punto de disparo en esa dirección, se establece un indicador de interrupción. Si la interrupción está habilitada, la ejecución del programa se ramificará a la dirección del vector de interrupción y el software podrá entonces responder a la interrupción.

El registro de Control de Detección de Alta / Baja Tensión (Registro 24-1) controla completamente el funcionamiento del módulo HLVD. Esto permite que el circuito sea "apagado" por el usuario bajo control de software que minimiza el consumo de corriente para el dispositivo. El diagrama de bloques para el módulo HLVD se muestra en la Figura 24-1.

Registro HLVDCON:



Bit 7: VDIRMAG: Bit de selección de magnitud de dirección de voltaje.
         1 = El evento ocurre cuando el voltaje es igual o excede el punto de disparo (HLVDL3: HLDVL0).
         0 = El evento ocurre cuando el voltaje es igual o inferior al punto de disparo (HLVDL3: HLVDL0).

Bit 6: No implementado: Leer como '0'.

Bit 5: IRVST: Voltaje de referencia interno.
         1 = Indica que la lógica de detección de voltaje generará el indicador de interrupción en el rango de voltaje especificado.
         0 = Indica que la lógica de detección de voltaje no generará el indicador de interrupción en el rango de voltaje especificado y no se habilitará la interrupción HLVD.

Bit 4: HLVDEN: Bit de habilitación de potencia de detección de alta / baja tensión.
         1 = HLVDEN activado
         0 = HLVDEN desactivado

Bit 3-0: HLVDL3:HLVDL0: Bits límite de detección de tensión (1).
         1111 = Se utiliza una entrada analógica externa (la entrada proviene del pin HLVDIN).
         1110 = Ajuste máximo.
         ... Mirar tabla 28-6
         ... Mirar tabla 28-6
         ... Mirar tabla 28-6
         0000 = Ajuste mínimo.

En la siguiente tabla (Table 28-6) podremos observar como configurar los Bits 3-0 para el limite de detección del voltaje.


El módulo se habilita estableciendo el bit HLVDEN, es decir enviando un "1 lógico" al registro de configuración HLVDCON. Cada vez que el módulo HLVD está habilitado, los circuitos requieren algún tiempo para estabilizarse. El bit IRVST es un bit de sólo lectura y se utiliza para indicar cuándo el circuito es estable. El módulo sólo puede generar una interrupción después de que el circuito sea estable e IRVST esté ajustado.

El bit VDIRMAG determina el funcionamiento general del módulo. Cuando se borra VDIRMAG, el módulo supervisa las caídas en VDD por debajo de un punto de consigna predeterminado. Cuando el bit está ajustado, el módulo supervisa para subir en VDD por encima del punto de ajuste.

Cuando el módulo HLVD está habilitado, un comparador utiliza una tensión de referencia generada internamente como punto de consigna. El punto de ajuste se compara con el punto de disparo, donde cada nodo en el divisor de resistencia representa un voltaje de punto de disparo. El voltaje de "punto de disparo" es el nivel de tensión al que el dispositivo detecta un evento de alta o baja tensión, dependiendo de la configuración del módulo. Cuando la tensión de alimentación es igual al punto de disparo, la tensión extraída de la matriz de resistencia es igual a la tensión de referencia interna generada por el módulo de referencia de tensión. El comparador genera entonces una señal de interrupción ajustando el bit HLVDIF.

El voltaje de punto de disparo es programable por software para cualquiera de los 16 valores. El punto de disparo se selecciona mediante la programación de los bits HLVDL3: HLVDL0 (HLVDCON <3: 0="">).

El módulo HLVD tiene una característica adicional que permite al usuario suministrar el voltaje de disparo al módulo desde una fuente externa. Este modo se habilita cuando los bits, HLVDL3: HLVDL0, se establecen en '1111'. En este estado, la entrada del comparador se multiplexa desde el pin de entrada externo HLVDIN. Esto da a los usuarios flexibilidad porque les permite configurar la interrupción de Detección de Alta / Baja Tensión para que se produzca a cualquier voltaje en el rango de operación válido.

En la siguiente figura (Figure 24-1) veremos un bosquejo de como funciona internamente el modulo de detección de voltaje "HLVD" de la familia de PIC18FXXXX:



Bueno para resumir un poco lo anterior y tener un mejor entendimiento y también para aquellos que le es un poco difícil entender todo esto lo resumiré de la forma más simple posible. Este módulo lo que hace es detectarnos un voltaje, dependiendo de su configuración detectaremos cuando un voltaje disminuya o aumente, luego de detectar esta caída o aumento se activará una interrupción y  través de código lo que haremos es ejecutar una cierta orden. 
Este módulo tiene de interesante que puede ser utilizado en muchas aplicaciones. Afortunadamente podemos configurar el voltaje de disparo externamente, es decir, alimentando una entrada con "X" voltaje o internamente con la ayuda del voltaje de referencia interno. Anteriormente vimos los diferentes voltajes a los que podemos configurarlo (Table 28-6).

Pasos para su configuración:

Los siguientes pasos son necesarios para configurar el HLVD
módulo:

1) Desactive el módulo borrando el bit HLVDEN (HLVDCON <4>).
2) Escriba el valor en los bits HLVDL3: HLVDL0 que selecciona el punto de disparo HLVD deseado.
3) Ajuste el bit VDIRMAG para detectar alta tensión (VDIRMAG = 1) o baja tensión (VDIRMAG = 0).
4) Active el módulo HLVD estableciendo el bit HLVDEN.
5) Borre la bandera de interrupción HLVD, HLVDIF (PIR2 <2>), que puede haber sido establecida desde una interrupción anterior.
6) Habilite la interrupción HLVD, si se desean interrupciones, estableciendo los bits HLVDIE y GIE / GIEH (PIE2 <2> e INTCON <7>). No se generará una interrupción hasta que se establezca el bit IRVST.




Aplicaciones:



En muchas aplicaciones, es deseable la capacidad de detectar una caída por debajo o por encima de un umbral particular. Por ejemplo, el módulo HLVD podría habilitarse periódicamente para detectar la conexión o desacoplamiento de USB (Universal Serial Bus). Esto supone que el dispositivo está alimentado por una fuente de voltaje más baja que el USB cuando está desarmado. Una conexión indicaría una detección de alto voltaje de, por ejemplo, 3.3V a 5V (el voltaje en USB) y viceversa para una separación. Esta característica podría ahorrar un diseño algunos componentes adicionales y una señal de la conexión (perno de la entrada).


Para las aplicaciones generales de las baterías, la Figura 24-4 muestra una posible curva de voltaje. Con el tiempo, el voltaje del dispositivo disminuye. Cuando la tensión del dispositivo alcanza la tensión, VA, la lógica HLVD genera una interrupción en el tiempo, TA. La interrupción podría provocar la ejecución de un ISR, lo que permitiría a la aplicación llevar a cabo tareas de mantenimiento y realizar un apagado controlado antes de que el voltaje del dispositivo salga del rango de funcionamiento válido en TB. El HLVD, por lo tanto, daría a la aplicación una ventana de tiempo, representada por la diferencia entre TA y TB, para salir con seguridad.






Bien muchachos, esto es todo por hoy. Estén pendientes de mi canal, de mi blog y de mi pagina de Facebook para más contenido.

Facebook: https://www.facebook.com/electronicalibrexc/
Youtube:  http://www.youtube.com/c/breismanrueda
Google +: https://plus.google.com/u/0/+breismanrueda
Twitter: https://twitter.com/BreismamR

Esto es todo por hoy, Sigue mi blog y visita mi próxima entrada!

Cualquier duda, trabajo, tutoria personalizada por correo electrónico o pagina en facebook:
Correo: ElectronicaLibreXC@outlook.com
Facebook: https://www.facebook.com/electronicalibrexc/



Salu2...

Bien muchachos, esto es todo por hoy; estén pendiente en mi canal, o de mi blog o de mi pagina de 

sábado, 26 de agosto de 2017

XiuaElectronics: Memoria STACK en Microcontroladores PIC16F628A.

Memoria STACK en Microcontroladores PIC16F628A.


Que tal amigos?

En el día de hoy vamos a hablar de algo muy importante a la hora de programar microcontroladores PIC, en este caso me refiero a su memoria STACK. ¿Pero que es su memoria STACK? ¿Porqué es importante la memoria STACK?


Memoria STACK:

En los microcontroladores pic la memoria STACK, es una memoria interna dedicada, de un tamaño limitado dependiendo el microcontrolador, de diferentes niveles y distinta de las memorias dedicadas para el almacenamiento de datos y como tal del programa del microcontrolador. Esta memoria es inaccesible para el programador y esta organizada en forma de pila, y usualmente se utiliza de forma automática por el microcontrolador para guardar las direcciones de retorno de subrutinas e interrupciones. Cada posición es de 13 bits para el caso del pic16f628a, microcontrolador PIC utilizado en el curso Curso Proteus 8.5 + MPASM y PIC16F628A y permite guardar una copia completa del PC. Como en toda memoria tipo pila, los datos son accedidos de manera tal que el primero que entra es el ultimo que sale.


STACK PIC16F628A:


La familia PIC16F627A / 628A / 648A tiene una pila de hardware de 8 niveles de profundidad x 13 bits (Figura 4-1). El espacio de pila no forma parte del espacio de programa o de datos y el puntero de pila no es legible ni puede escribirse. El PC es PUSHed en la pila cuando se ejecuta una instrucción CALL o una interrupción causa una rama. La pila es POPed en el caso de una ejecución de la instrucción RETURN, RETLW o RETFIE. PCLATH no se ve afectado por una operación PUSH o POP.


Como ya se menciono anteriormente, el stack y el puntero interno que lo direcciona, son invisibles para el programador, solo se los accede automáticamente para guardar o rescatar las direcciones de programa cuando se ejecutan las instrucciones de llamada o retorno de subrutinas, o cuando se produce una interrupción o se ejecuta una instrucción de retorno de ella

La pila funciona como un amortiguador circular. Esto significa que después de que la pila ha sido PUSHed ocho veces, la novena PUSH sobrescribe el valor que fue almacenado desde el primer PUSH. El décimo PUSH sobrescribe el segundo PUSH (y así sucesivamente). 




Nota 1: No hay bits de estado para indicar el desbordamiento de la pila o las condiciones de desbordamiento de la pila.

Nota 2: No hay instrucciones / mnemónicos llamados PUSH o POP. Estas son acciones que ocurren desde la ejecución de las instrucciones CALL, RETURN, RETLW y RETFIE, o la vectorización a una dirección de interrupción.










Para tener en cuenta lo que hacen los niveles de profundidad del STACK es el permitir el anidamiento de subrutinas; por ejemplo para el PIC16f628A le es posible realizar 8 niveles de anidamiento de subrutinas que serían llamadas desde el programa principal.



Acá vemos como el programa principal llama a la primera subrutina "Subrutina1" y esta llama a "Subrutina2", así sucesivamente hasta las "Subrutina8". Pero si en la subrutina "Subrutina8" se intentara llamar a otra subrutina se desbordaría la capacidad del STACK, que solo puede almacenar ocho direcciones de retorno.

Esto de hecho representa una traba para el programador y además parece impedir o dificultar la programación estructurada, sin embargo es una buena solución de compromiso ya que estos microcontroladores están diseñados para aplicaciones de alta velocidad en tiempo real, en las que el overhead (demoras adicionales) que ocasiona un excesivo anidamiento de subrutinas es inaceptable. Por otra parte existen técnicas de organización del programa que permiten mantener la claridad de la programación estructurada, sin necesidad de utilizar tantas subrutinas anidadas.







Bien muchachos, esto es todo por hoy; estén pendiente en mi canal, o de mi blog o de mi pagina de Facebook.

Esto es todo por hoy, Sigue mi blog y visita mi próxima entrada!

Cualquier duda, trabajo, tutoria personalizada por correo electronico o pagina en facebook:



Salu2...

.