Páginas

Mostrando las entradas con la etiqueta computo integrado. Mostrar todas las entradas
Mostrando las entradas con la etiqueta computo integrado. Mostrar todas las entradas

miércoles, 23 de mayo de 2012

[CÓMPUTO INTEGRADO] Domótica

Ya que varios están presentando proyectos de este tipo, me he dado a al tarea de investigar sobre el tema.

Se entiende por domótica el conjunto de sistemas capaces de automatizar una vivienda, aportando servicios de gestión energética, seguridad, bienestar y comunicación, y que pueden estar integrados por medio de redes interiores y exteriores de comunicación, cableadas o inalámbricas, y cuyo control goza de cierta ubicuidad, desde dentro y fuera del hogar. Se podría definir como la integración de la tecnología en el diseño inteligente de un recinto cerrado.

Los servicios que ofrece la domótica se pueden agrupar según cinco aspectos o ámbitos principales:

Ahorro energético

El ahorro energético no es algo tangible, sino un concepto al que se puede llegar de muchas maneras. En muchos casos no es necesario sustituir los aparatos o sistemas del hogar por otros que consuman menos sino una gestión eficiente de los mismos.

Confort

El confort conlleva todas las actuaciones que se puedan llevar a cabo que mejoren el confort en una vivienda. Dichas actuaciones pueden ser de carácter tanto pasivo, como activo o mixtas.

Seguridad



Consiste en una red de seguridad encargada de proteger tanto los bienes patrimoniales como la seguridad personal.







Comunicaciones

Son los sistemas o infraestructuras de comunicaciones que posee el hogar.

Accesibilidad

Bajo este epigrafe se incluyen las aplicaciones o instalaciones de control remoto del entorno que favorecen la autonomía personal de personas con limitaciones funcionales, o discapacidad.
El concepto "diseño" para todos es un movimiento que pretende crear la sensibilidad necesaria para que al diseñar un producto o servicio se tengan en cuenta las necesidades de todos los posibles usuarios, incluyendo las personas con diferentes capacidades o discapacidades, es decir, favorecer un diseño accesible para la diversidad humana. El objetivo no es que las personas con discapacidad puedan acceder a estas tecnologías, porque las tecnologías en si no son un objetivo, sino un medio. El objetivo de estas tecnologías es favorecer la autonomía personal. Los destinatarios de estas tecnologías son todas las personas, ya que por enfermedad o envejecimiento, todos somos o seremos discapacitados, más pronto o más tarde.

La inteligencia es una medida:
  • De la satisfacción de las necesidades de los habitantes y su administración.
  • De la posibilidad de respetar y adaptarse al medio ambiente que lo rodea.
Los elementos que deben considerarse como parte del programa arquitectónico independientemente del género al que éste se refiera, son éstos:
  • La protección, contra contingencias contra accidentes caseros hasta problemas en edificios de varios niveles de oficinas desde la intrusión, el robo, el plagio, el clima, el incendio, entre otros. En todos estos casos existe la potencialidad de que cualquier falla desencadene un incendio destructor. El prever y superar tales sucesos es parte del programa del Edificio Inteligente.
  • Manejo preventivo de contingencias, es primordial dotar desde el diseño arquitectónico de aquellos elementos necesarios para superar las fallas en el control de humo y aire caliente, (efecto de chimenea) tanto en cubos de escaleras y de elevadores, ductos de instalaciones, vestíbulos y pasillos largos y falsos plafones. Para todo ello es necesario la compartimentación vertical para ductos de instalaciones. Sellos en los pasos de tubería de ventilación en muros y losas. Así como también el control automatizado en puestas de compartimentación, vestibulación y salidas de emergencia en las instalaciones y los ductos. 
  • Diseño Arquitectónico lógico, los edificios altos resuelven necesidades y problemas del programa arquitectónico, sin embargo crean nuevos problemas como su desalojo en un tiempo razonable, la falta de ventilación al no existir ventanas que puedan abrirse.
  • Acabados y decoración, básicamente habría que considerar el control de los materiales combustibles, empleando retardantes en los acabados del edificio, y dejando claramente indicadas la localización de rampas y escaleras.
El principal problema de los detectores es la falsa alarma que se ha tratado de resolver en la combinación de los diversos tipos de censores. Por otro lado existen los sistemas operados por detectores para compuertas de compartimentación, el control de la presión positiva en ductos de escaleras y elevadores, el control programado de sistemas de acondicionamiento de aire, la iniciación de las alarmas y el voceo a la par de los sistemas de supresión de fuego por agua, espuma, polvo químico y gas. Dando a su vez aviso a la estación de bomberos.

Grados de inteligencia

Existen tres grados de inteligencia, catalogados en función de la automatización de las instalaciones o desde el punto de vista tecnológico:
  • Inteligencia mínima o básica. Un sistema básico de automatización del edificio, el cual no está integrado.
    • Existe una automatización de la actividad y los servicios de telecomunicaciones, aunque no están integrados.
  • Inteligencia media. Tiene un sistema de automatización del edificio totalmente integrado.
    • Sistemas de automatización de la actividad, sin una completa integración de las telecomunicaciones.
  • Inteligencia máxima o total. Los sistemas de automatización del edificio, la actividad y las telecomunicaciones, se encuentran totalmente integrados. El sistema de automatización del edificio se divide en: sistema básico de control, sistema de seguridad y sistema de ahorro de energía.
    • El sistema básico de control es el que permite monitorear el estado de las instalaciones, como son: eléctricas, hidrosanitarias, elevadores y escaleras eléctricas, y suministros de gas y electricidad.
    • El sistema de seguridad protege a las personas, los bienes materiales y la información. En la seguridad de las personas, destacan los sistemas de detección de humo y fuego, fugas de gas, suministro de agua, monitoreo de equipo para la extinción de fuego, red de rociadores, extracción automática de humo, señalización de salidas de emergencia y el voceo de emergencia. Para la seguridad de bienes materiales o de información, tenemos el circuito cerrado de televisión, la vigilancia perimetral, el control de accesos, el control de rondas de vigilancia, la intercomunicación de emergencia, la seguridad informática, el detector de movimientos sísmicos y el de presencia.
    • El sistema de ahorro de energía es el encargado de la zonificación de la climatización, el intercambio de calor entre zonas, incluyendo el exterior, el uso activo y pasivo de la energía solar, la identificación del consumo, el control automático y centralizado de la iluminación, el control de horarios para el funcionamiento de equipos, el control de ascensores y el programa emergente en puntos críticos de demanda.

[CÓMPUTO INTEGRADO] Consejos y técnicas de optimización

Cuando realizé mi proyecto PIC, este trataba sobre calcular los primos de 0 a 255 y me vi en un gran lio con el algoritmo para calcular los primos, ya que, aunque no hay que subestimar el poder de uno de esos microcontroladores, la memoria es un factor importante para el correcto funcionamiento de una rutina en un PIC.

Existen algoritmos para calcular los primos, pero involucran un gran gasto de memoria, así que pondré las etapas por las que pasé para resolver el problema.

1. Memoria

La memoria es el factor importante como se mencionó antes, así que para hacer un proyecto con PICs siempre hay que tener en cuenta un estimado de la memoria que podría usar, para poder escoger el microcontrolador adecuado.

En caso de que tu proyecto dependa de un microcontrolador específico pero la memoria sea insuficiente, puedes utilizar memorias EEPROM mediante el protocolo I2C. Proporcionan memoria adicional y la comunicación es sencilla.

La plataforma Arduino tiene librerías para el manejo de memorias EEPROM y flash, por lo que es mucho más sencillo su uso.

En mi caso, no tuve problemas con la memoria ya que mi algoritmo fue simple al final.

2. Código

Lo siguiente en la lista es el código que ejecuta. Quizá el problema no sea la memoria insuficiente, quizá sea que el código simplemente no esté bien optimizado, este fue el primer problema que tuve, ya que el primer algoritmo que utilizé no era del todo óptimo.

Al principio utilizé MPASM, pero luego me cambié a MikroBasic, luego hablaremos de los lenguajes. Debido a que en MPASM no existen operadores matemáticos más grandes que la suma y la resta mi algoritmo se basó en restas:

Si por ejemplo tengo un 9, le digo a mi programa que a 9 le reste 9-1

  • 9 - (9 - 1) = 1
Si el resultado es menor a 9 - 1 se resta 1 a 9 - 1 y ahora es 9 - 2, se repite el proceso hasta que el resultado sea mayor que 9 - el número que le toque. De ser así sucede lo siguiente:
  • 9 - (9 - 5) = 5 ---> 5 - (9 - 5) = 1
Se sigue hasta que el número que se resta sea un número 2 unidades menor que 9, en este caso 7, después de eso, se acaba y sigue con el siguiente número a saber si es primo o no.

De encontrar un 0 de resultado en este proceso, se sale del ciclo y le dice al programa que el número NO es primo, de llegar al final sin 0 entonces e programa sabe que el número es primo

Al pasarme a MikroBasic, encontré las multiplicaciones y divisiones, inclusive encontré la función para sacar el módulo sin la necesidad de hacer una división.

Mi algoritmo cambió de hacer largas restas a buscar un módulo y saber si es 0 o no:
  • Se pasan directamente los números 0, 1, 2, 3, 5 y 7
  • Se saca el módulo del número dividido entre  2
    • Es 0?; SI, se sale y anuncia que no es primo; NO, continua
  • Se saca el módulo del número dividido entre 3
    • Es 0?; SI, se sale y anuncia que no es primo; NO, continua
  • Se saca el módulo del número dividido entre 5
    • Es 0?; SI, se sale y anuncia que no es primo; NO, continua
  • Se saca el módulo del número dividido entre 7
    • Es 0?; SI, se sale y anuncia que no es primo; NO, el número es primo
De ambos, el segundo parece más óptimo, ya que solo usa unas cuantas condiciones, en cambio el primero  parece que llenará la memoria con restas y más restas.

La verdad, MikroBasic al traducir el código a un .hex realizará lo mismo que hice al principio, solo que agregará cosas que no se habían contemplado, ya que después de todo, los microcontroladores funcionan con puras sumas y restas. Se puede decir que la primera idea pudo ser mejor que la segunda de haberla escrito en forma más organizada y mejor planteada.

Como recomendación, siempre hay que utilizar lo que nos ofrezca  una mayor optimización aunque esto requiera de escribir y pensar un poco más.

3. Lenguaje

La tercera cosa más importante que yo considero es la selección del lenguaje. En mi proyecto yo utilicé el lenguaje MikroBasic, ya que es muy practico para pequeños proyectos, pero si nuestro poryecto consiste en ahorrar memoria y realizar operaciones matemáticas muy largas, recomendaría, desde mi punto de vista, utilizar MPASM.

Con MPASM tenemos control total de la memoria y es cosa de nosotros como la utilizaremos. Podemos utilizar y reutilizar registros, etc.

Los lenguajes de más alto nivel son útiles si no tenemos experiencia con assembler (como yo), pero incluso el mismo lenguaje nos permite escribir parte del código en assembler.

Las ventajas de MPASM:
  • Set de instrucciones fácil de comprender.
  • Control total de los recursos.
  • Más óptimo.
Las desventajas de MPASM:
  • El código se vuelve difícil de comprender al escribir varias lineas.
  • Solo hay 2 operandos, suma y resta.
  • Hay que portar el código de un microcontrolador a otro.
Las ventajas de lenguajes de alto nivel:
  • Fácil uso.
  • Disponemos de todos los operandos.
  • Portabilidad entre microcontroladores muy practica.
  • Detección y solución de errores más práctica.
Las desventajas de lenguajes de alto nivel:
  • El .hex resultante no es del todo optimizado.
  • No sabemos como queda distribuido el uso de la memoria.
Estos 3 temas son importantes a la hora de hacer nuestro proyecto PIC, Arduino o inclusive algun programa de computadora que requiera de optimización de memoria.

martes, 22 de mayo de 2012

[CÓMPUTO INTEGRADO] Multiplexación

En mi proyecto utilicé 3 displays y un solo decodificador, sin embargo un decodificador solo tiene 7 salidas para los 7 pines del display, y comprar un decodificador por display es algo no muy óptimo tanto en cuestión de energía como en cuestión económica.

La forma correcta de utilizar estos es utilizando una técnica llamada multiplexación. La multiplexación es la combinación de dos o más canales de información en un solo medio de transmisión usando un dispositivo llamado multiplexor.

La multiplexación permite utilizar un decodificador para una cantidad de displays dada, esta cantidad depende del total de microsegundos que asignes entre cada display.

Una vez que ya tengas tu programa que haga algo relacionado con contar números puedes proceder a multiplexar. La técnica funciona de esta manera:
  1. Se enciende el pin del display a utilizar.
  2. Se llama a la parte del programa que muestra el primer dígito.
  3. Se encienden los pines del decodificador.
  4. Se hace un delay de unos cuantos microsegundos.
  5. Se apaga el pin del display.
  6. Se repite el proceso.
Algo importante a tomar en cuenta es que el delay que se hace entre displays afecta la forma en que se muestran los dígitos. Para 3 displays, un delay de 10 ms funciona perfecto, pero al aumentarlo a 15, se puede ver como parpadean los leds de los displays.

Para una cantidad mayor de displays se requiere un delay menor, 6 displays se verían bien con 5 ms. para cantidades mayores de displays, podría haber problemas de visualización, por lo que se puede agregar un segundo decodificador y hacer una doble multiplexación, o bien mediante el mismo método multiplexar los decodificadores, ya que sirve para cualquier componente, no solo displays.

Existen multiplexores TTL que ya hacen el trabajo por nosotros, pero bien se pueden programar multiplexores en cualquier microcontrolador.

Desde el mismo arduino se puede hacer este proceso, y de una manera más sencilla.

En el siguiente sketch de arduino se muestra la forma en que se multiplexa 3 displays para un contador, está basado en mi proyecto que es precisamente un contador de correos pero modificado para que solo sea un contador por tiempo, cabe destacar que entre mayor sea el delay entre displays, el contador se vuelve más lento y se nota el parpadeo.

// Pines del decodificador
int A = 13;
int B = 12;
int C = 11;
int D = 10;

int x = 0, y = 0, z = 0; // Cifras del valor serial individuales
int time1 = millis();
int time2= time1;
void setup()
{
  pinMode(A, OUTPUT); // Pines del decodificador como salidas
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
  
}

void loop() {
    display_values();
    multiplex();
}

void display_values() {
    x++;
    if (x == 10){
      x = 0;
      y++;
    }
    if (y == 10){
      y=0;
      z++;
    }
    if (z == 10){
      x=0;
      y=0;
      z=0;
    }
}

void dec_bin(int value){
  if (value == 0){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 1){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 2){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 3){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 4){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 5){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 6){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 7){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 8){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
    else if (value == 9){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
}

void multiplex(){
        dec_bin(x);
        digitalWrite(3, HIGH);
        delay(10);
        dec_bin(y);
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        delay(10);
        dec_bin(z);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        delay(10);
        digitalWrite(5, LOW);
      }

jueves, 17 de mayo de 2012

[CÓMPUTO INTEGRADO] Osciladores (PIC16F84A)

Para mi proyecto había comprado un pic16f84a debido a que fue el que me recomendó el que me atendía. Según el era de los que más se vendía y de los más eficientes. Lo compré por que me convenció, sin embargo había un detalle que se le olvidó comentar; el pic16f84a es un microcontrolador que no tiene un oscilador interno como la mayoría de los pics que han presentado.

Al principio pensé que no representaba un gran problema, sin embargo, el oscilador es la parte que hace funcionar el pic.

Oscilador para el 16f84A

Todo microprocesador o microcontrolador requiere de un circuito que le indique a que velocidad debe trabajar. Este circuito es conocido por todos como un oscilador de frecuencia. Este oscilador es como el motor del microcontrolador por lo tanto, este pequeño circuito no debe faltar. En el caso del microcontrolador PIC16F84 el pin 15 y el pin 16 son utilizados para introducir la frecuencia de reloj.

El microcontrolador PIC16F84 requiere de un circuito externo de oscilación o generador de pulsos de reloj. La frecuencia de reloj máxima es de 20 Mhz.


El PIC16F84 puede utilizar cuatro tipo diferentes de reloj oscilador externos. El tipo de oscilador dependerá de la precisión, velocidad y potencia que requiramos; por otro lado, el coste también es una aspecto a tener en cuenta a la hora de elegir un oscilador u otro.

En el momento de programar el microcontrolador se deberá especificar en los parámetros el tipo de oscilador que utilizamos en nuestro proyecto electrónico. Por ejemplo si su frecuencia de trabajo es de 10 MHz entonces la configuración del microcontrolador deberá estar en "HS"; pero si su frecuencia de trabajo es de 4 Mhz entonces la configuración del microcontrolador deberá estar en "XT".

Tipos de oscilador

Podemos hacer uso de 4 tipos diferentes de osciladores:
  • Oscilador tipo "XT" (XTal) para frecuencias no mayores de 4 Mhz.
  • Oscilador tipo "LP" (Low Power) para frecuencias entre 32 y 200 Khz.
  • Oscilador tipo "HS" (High Speed) para frecuencias comprendidas entre 4 y 20 MHz.
  • Oscilador tipo "RC" (Resistor/Capacitor) para frecuencias no mayores de 5.5 Mhz. 
Oscilador de tipo XT



La condición básica importante para que este oscilador funcione es que los condensadores C1 y C2 deberán ser iguales.

A continuación se detallan algunos valores:


Oscilador de tipo LS (Low Power) para frecuencias entre 32 y 200 Khz

Este oscilador es igual que el anterior, con la diferencia de que el PIC trabaja de una manera distinta. Este modo está destinado para trabajar con un cristal de menor frecuencia, que, como consecuencia, hará que el PIC consuma menos corriente.

Oscilador de tipo HS (High Speed) para frecuencias comprendidas entre 4 y 20 MHz

Habremos de usar esta configuración cuando usemos cristales mayores de 4 MHz. La conexión es la misma que la de un cristal normal.

Oscilador de tipo RC

Si no se requiere mucha precisión en el oscilador, se puede utilizar una resistencia y un condensador.


Oscilador TTL

Este tipo de oscilador está basado en un Cristal que contiene toda la circuitería para generar una onda cuadrada. Este ha de ser conectado como si de un generador de señal externa se tratase. Al incluir toda la circuitería esto lo convierte en la opción más costosa; pero representa la forma más práctica por la cantidad de conexiones y por la precisión en la señal de reloj emitida. En la imagen de la siguiente figura se muestra como debe conectarse al microcontrolador y las características del cristal.

Estos tipos de cristales están diseñados especialmente para tecnologías TTL. La frecuencias disponibles para esta versión de cristal son muy amplias y las mas usuales son 1 - 1.8432 - 2 - 4 - 8 - 10 - 11.059 - 12 - 14.31818 - 16 - 20 - 25 - 32 - 33 - 40 - 50 - 80 y 100 Mhz. 




[CÓMPUTO INTEGRADO] Proyecto PIC

Para mi proyecto, hice un contador de números de 0 a 999 que ademas dice si el número mostrado es par o si es primo. Por problemas con el algoritmo mostrare el funcionamiento en el simulador y en el pic aparte, ya que por alguna razón no funciona la parte donde decide que el número es o no primo.

El material que utilizé:

  • 2 leds
  • 2 resistencias de 330 ohms
  • 3 displays 7 segmentos anodo común
  • 1 decodificador 7447
  • 1 pic16f628a
  • muchos cables
  • 1 protoboard

El circuito esta de la siguiente manera:


El código utilizado para el pic:

program reloj
  symbol display1 = PORTB.4
  symbol display2 = PORTB.5
  symbol display3 = PORTB.6
  symbol led_par = PORTA.1
  symbol led_prim = PORTA.0

  const numeros as byte[10] = (%00000000, %00000001, %00000010,
  %00000011, %00000100, %00000101, %00000110, %00000111, %00001000,
  %00001001)
  dim centenas as byte
  dim decenas as byte
  dim unidad as byte
  dim i as integer
  dim j as integer
  dim auxi as integer
  dim prim2 as integer
  dim prim3 as integer
  dim prim5 as integer
  dim prim7 as integer
  dim par as integer

 sub procedure parprim
     if auxi = 0 then
        goto final
     end if
     if auxi = 1 then
        goto final
     end if
     if auxi = 2 then
        led_prim = 1
        goto salto
     end if
     if auxi = 3 then
        led_prim = 1
        goto salto
     end if
     if auxi = 5 then
        led_prim = 1
        goto salto
     end if
     if auxi = 7 then
        led_prim = 1
        goto salto
     end if
     led_prim = 0
     led_par = 0
     prim2 = auxi mod 2
     prim3 = auxi mod 3
     prim5 = auxi mod 5
     prim7 = auxi mod 7
     if prim2 <> 0 then
        if prim3 <> 0 then
           if prim5 <> 0 then
              if prim7 <> 0 then
                 led_prim = 1
              end if
           end if
        end if
     end if
     'auxi2 = auxi-1
     'while auxi2 > 1
     '    prim = auxi mod auxi2
     '    if prim <> 0 then
     '       auxi2 = auxi2-1
     '    end if
     '    if prim = 0 then
     '       goto salto
     '    end if
     '    led_prim = 1
     'wend
     salto:
     par = auxi mod 2
     if par = 0 then
        led_par = 1
     end if
     final:
 end sub

 sub procedure multiplexar
     PORTB = numeros[centenas]
     display1 = 1
     delay_ms(2)
     PORTB = numeros[decenas]
     display1 = 0
     display2 = 1
     delay_ms(2)
     PORTB = numeros[unidad]
     display2 = 0
     display3 = 1
     delay_ms(2)
     INC(i)
     parprim
  end sub

main:
  'entrada
  CMCON = 0x07
  TRISB = %00000000
  TRISA = %00000000
  centenas = 0
  decenas = 0
  unidad = 0
  display1 = 0
  display2 = 0
  display3 = 0
  i = 0
  while True
        multiplexar
        if i = 200 then
        i=0
          unidad = unidad + 1
          auxi = auxi + 1
          if unidad > 9 then
             unidad = 0
             decenas = decenas + 1
             if decenas > 9 then
                   decenas = 0
                   centenas = centenas + 1
                   if centenas > 9 then
                      auxi = 0
                      unidad = 0
                      decenas = 0
                      centenas = 0
                   end if
             end if
          end if
        end if

  wend

end.

martes, 8 de mayo de 2012

[CÓMPUTO INTEGRADO] Sistemas operativos específicos (integrados)

Un sistema operativo es un programa que se ejecuta continuamente en un dispositivo, brindando una capa de abstracción para los usuarios facilitándole el uso del dispositivo; además de ocultar el hardware del sistema y encargarse de la administración de sus recursos.

En este caso, un sistema operativo integrado es aquel que está integrado en los circuitos de los dispositivos electrónicos, a diferencia de un sistema operativo para PC, el cual reside en un disco magnético. Los sistemas operativos integrados se encuentran actual­mente en una amplia variedad de dispositivos, incluyendo aparatos domésticos, automóviles, lectores de código de barras, teléfonos celulares, equipos médicos y asistentes digitales personales (PDA), como el Palm Pilot o el iPaq de Compaq.



Algunos ejemplos de estos son:

OS/2 (eComstation)

Ahora mismo está en desuso, pero en su momento podías hacerlo en cualquier cajero automático.

Desarrollado a medias entre Microsoft e IBM como posible sucesor de PC DOS, el OS/2 sufrió un batacazo comercial en favor de la versión 3.0 de Windows. No obstante, su orientación a sistemas integrados fue muy popular durante los 90 y hoy en día aún sigue implementado en expendedores públicos en su versión original o en la derivada, de nombre eComStation.

Windows CE

Cajeros automáticos (en desuso),  sistemas de navegación para el coche o videoconsolas como Dreamcast.

Windows CE fue diseñado con un núcleo totalmente nuevo, distinto al del resto de sus sistemas y optimizado para dispositivos con evidentes limitaciones técnicas. Aspectos como la interfaz gráfica quedaban en un segundo plano y podían ser modificados por las empresas que hacían uso de él. Como desarrollo interno, dio lugar a sistemas operativos para Pocket PC y fue el precursor del de Zune y de Windows Phone. Actualmente ha quedado en desuso en favor de Windows XP Embedded y de Windows Embedded Standard, usados en la mayoría de cajeros y terminales públicos hoy en día.

Windows Embedded Automotive

En varios coches de marcas como FIAT, Nissan o Ford.

Pensar en sistemas operativos para automóviles es cada vez más frecuente, pero a Microsoft ya le vino esta idea a mediados de los noventa, cuando comenzó a idear un sistema derivado de Windows CE que funcionaría en los paneles de navegación de todo tipo de vehículos. Hoy en día, muchos sistemas de comunicación por Bluetooth integrados (manos libres, GPS, reproducción de música...) llevan detrás esta tecnología. Su última versión se basa Windows 7.

OSEK

En los automóviles de las constructoras que forman parte de este consorcio, como BMW, Chrysler, Opel o Renault.

Las siglas de OSEK hacen referencia tanto a un consorcio de empresas como a un estándar abierto de sistema operativo e interfaz de comunicaciones básicos que rige más de la mitad de la industria del automóvil. La portabilidad de OSEK hace posible que pueda ser llevado incluso a sistemas con un microprocesador de 8 bits.

vxWorks

En una gran variedad de dispositivos: desde aviones a fotocopiadoras; desde navegadores GPS a routers.

Desarrollado por la empresa Wind River Systems, este sistema operativo en tiempo real (RTOS) ha sido llevado a infinidad de dispositivos. Incluso ha controlado el cerebro de varios vehículos espaciales como el Sojourner, el rastreador enviado a Marte, convirtiéndose en el SO que más lejos ha viajado en la historia de la Informática.

FreeBSD

Televisores, routers y sistemas de seguridad entre otros.

Aunque FreeBSD es un sistema operativo completo, son varios los proyectos que han derivado para portarse a sistemas integrados. Como curiosidad, cabe destacar que es la base sobre la que se apoya CellOS, el sistema que rige Playstation 3 y su Cross Media Bar (XMB)

ThreadX

En impresoras, cámaras digitales, módems y sondas espaciales.

Como vxWorks, es un sistema operativo en tiempo real, es decir, que ha sido diseñado específicamente para trabajar en condiciones de rápida respuesta. Una de las empresas que ha apostado recientemente por su uso es HP, que lo incluye para gestionar la mayoría de modelos de sus impresoras de tinta y láser.

Android

Además de en los móviles, en microondas y lavadoras.

Por extraño que parezca, la aparición de Android en dispositivos poco comunes es un paso natural en su evolución como sistema operativo libre. La empresa Touch Revolution desarrolló hace unos meses el panel Nimble NIM1000, que puede incrustarse en todo tipo de electrodomésticos: desde teléfonos fijos a microondas y lavadoras. Así podrás saber qué tiempo hace antes de poner la colada.

[CÓMPUTO INTEGRADO] Interrupciones


Interrupción (también conocida como interrupción de hardware o petición de interrupción) es una señal recibida por el procesador, indicando que debe "interrumpir" el curso de ejecución actual y pasar a ejecutar código específico para tratar esta situación.

Una interrupción es una suspensión temporal de la ejecución de un programa, para pasar a ejecutar una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del programa (generalmente perteneciente al sistema operativo, o al BIOS). Luego de finalizada dicha subrutina, se reanuda la ejecución del programa.

Las interrupciones constituyen quizá el mecanismo más importante para la conexión del microcontrolador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos.

    El funcionamiento de las interrupciones es similar al de las subrutinas de las cuales se diferencian principalmente en los procedimientos que las ponen en marcha. Así como las subrutinas se ejecutan cada vez que en el programa aparece una instrucción CALL, las interrupciones se ponen en marcha al aparecer en cualquier instante un evento externo al programa, es decir por un mecanismo hardware.

El PIC16C84/PIC16F84 dispone de 4 posibles fuentes de interrupción:

  • Activación del pin RB0/INT
  • Desbordamiento del temporizador TMR0
  • Cambio de estado en uno de los 4 pines de más peso (RB7:RB4) del PORTB
  • Finalización de la escritura en la EEPROM de datos.
Cuando se produce cualquiera de los sucesos indicados anteriormente, se origina una petición de interrupción, que si se acepta, guarda el valor del PC actual en la Pila, pone a cero el bit GIE (Global Interrupt Enable), lo que prohibe cualquier otra interrupción y se carga el PC con el valor 0004H , que es la posición del vector de interrupción, y comienza a ejecutarse el programa de atención a la interrupción que se encuentra a partir de esta dirección.

Cada causa de interrupción está controlada mediante dos bit. Uno de ellos actúa como señalizador o flag que indica si se ha producido o no la interrupción, y la otra funciona como bit de permiso o prohibición de la interrupción en sí, tal y como se muestra en la siguiente  figura.
Los bits de control que se encuentran en el registro INTCON (0Bh ó 8Bh) habilitan y configuran las interrupciones. Para que se pueda producir interrupción por alguna de estas fuentes, el bit correspondiente debe estar a 1, mientras que los bits señalizadores o flags que están en los registros INTCON y EEDATA (08h) informan si se ha producido la interrupción cuando se ponen a 1. Cualquiera de las interrupciones también puede sacar al procesador del modo de reposo.


    El bit GIE (Global Interrupt Enable) es el de activación global del permiso de interrupción, y se borra automáticamente cuando se reconoce una interrupción para evitar que se produzca ninguna otra mientras se está atendiendo a la primera. Al retornar de la interrupción con una instrucción RETFIE, el bit GIE se vuelve a activar poniéndose a 1. Para el resto de los bit de indicación de interrupción (es decir, el resto de los flags) no se ha previsto mecanismo de puesta a cero, por lo que es el programa de atención a la interrupción el que debe realizar el tratamiento de la correspondiente interrupción y además, el que debe poner el o los flags de indicación de interrupción a 0. De no ser así, no se podrá salir de la rutina de atención a la interrupción.

Detalles de cada bit del registro INTCON:


    El microcontrolador solo dispone de un vector de interrupción en la dirección 0004h; esto quiere decir que, sea cual sea la fuente de la interrupción, el PC se carga con 0004h. Por lo tanto, el programa de atención a la interrupción debe encargarse de comprobar el estado de cada uno de los flags para saber cual es el dispositivo que produce la interrupción y actuar según el caso.

    Como ya hemos dicho el único registro que se salva en la PILA es PC, luego si se necesita preservar algún otro registro debe ser el propio programa de atención a la interrupción el que se encargue de salvar su estado al inicio de la rutina y de devolverlos al final del mismo, de igual modo que se hacía en las subrutinas.

Resumiendo, las acciones que se realizan automáticamente el microcontrolador y las que el programador debe tener en cuenta en sus programas son las siguientes:
  • Cuando se activa una posible causa de interrupción, el flag correspondiente se activa. Si el bit de permiso correspondiente está a 1 y el bit de habilitación de todas las interrupciones (GIE) está a 1, se produce la interrupción.
  • Para evitar que se produzca otra interrupción mientras se está atendiendo a otra anterior, el bit GIE se pone a 0.
  • El valor del PC se guarda en la PILA
  • El PC se carga con el valor 0004h, que es el vector de interrupciones
  • El programador, debe comenzar la rutina de atención a la interrupción con un salto a la posición de memoria donde se encuentra el programa, seguidamente se guardan todos los registros que puedan ser modificados por esta, seguidamente si están habilitadas varias vías de interrupción, se debe explorar el valor de los flag para determinar la causa de la interrupción.
  • Dependiendo de la causa de la interrupción, la rutina de interrupción se bifurca a la subrutina correspondiente.
  • Se deben devolver los valores que tenían los registros antes de producirse la interrupción y se deben borrar por software los flags que indican las fuentes de las interrupciones, antes del retorno al programa principal.
  • Cuando se llega a la última instrucción de la rutina de interrupción, RETURN, se carga el PC con el valor que se guardó inicialmente en la PILA y el bit GIE se pone automáticamente a 1.
Interrupción externa INT

La fuente de interrupciones INT es sumamente importante para atender eventos externos en tiempo real.
Cuando en la línea RB0/INT se hace una petición de interrupción, entonces, de forma automática, el bit INTF del registro INTCON se pone a 1 y si el bit GIE=1, se pone en marcha el mecanismo que ya hemos comentado de la interrupción. Mediante el bit INTDEG del registro OPTION, se puede seleccionar el flanco activo de RBO/INT, ya que con este puesto 1 el flanco activo es el de subida y cuando está a 0 el flanco activo es el de bajada.

 El programa de atención a la interrupción antes de regresar al programa principal debe borrar el flag INTF, puesto que en caso contrario al ejecutar la instrucción de retorno de interrupción RETFIE se volverá a desarrollar el mismo proceso de interrupción.

Interrupción por desbordamiento del TMR0

Para activar la interrupción del TMR0, los bit T0IE y GIE del registro INTCON deben de estar a 1; bajo estas condiciones cuando el temporizador TMR0 se desborda al pasar de FFh a 00h, se activa el flag TOIF del registro INTCON.

Si no se carga de nuevo TMR0 cuando se desborda, éste sigue contando desde 00h hasta FFh. Este registro puede escribirse o leerse en cualquier momento, pero hay que tener en cuenta que al escribir sobre él, se pierden dos ciclos de reloj para la sincronización.

Cuando se carga el registro TMR0 con un valor XXh, éste cuenta FFh-XXh impulsos y el tiempo que tarda en hacerlo viene dado por la expresión:

Temporización = 4 . Tosc . (256 –N10). Rango del Divisor de Frecuencia

Interrupción por cambio de estado en los pines RB7:RB4.

Para activar la interrupción por cambio de nivel en los pines <RB7:RB4>, los bits RBIE y GIE del registro INTCON deben de estar a 1, bajo estas condiciones cuando se produce un cambio de nivel en cualquiera de los pines RB7:RB0 se activa el flag RBIF del registro INTCON.

Este tipo de interrupciones, están especialmente pensadas para el control de un teclado matricial de 4 x 4, es decir de 16 teclas.

Interrupción por finalización de escritura en la EEPROM de datos.

El área de EEPROM dispone de 64 bytes donde opcionalmente, se pueden almacenar datos que no se pierden al desconectar la alimentación. El PIC 16C84 y el 16F84 soportan un millón de ciclos de escritura/borrado y son capaz de guardar la información sin alteración durante más de 40 años.

La memoria EEPROM no está mapeada en la zona de memoria de datos donde se encuentran los registros SFR y GPR. Para poder leerla y escribirla durante el funcionamiento normal del microcontrolador hay que utilizar los registros especiales EEDATA, EEADR, EECON1 y EECON2.

El Registro EEADR, se encuentra en la posición de memoria 09h del banco 0, en el se carga directamente la dirección a la que acceder de la EEPROM de datos. Las 64 posiciones de un byte ocupan las direcciones de un mapa que comienza en la posición 00h y termina en la 3Fh, por eso los 2 bits de más peso del registro EEADR siempre valen 0.

Los bit RD y WR indican respectivamente lectura o escritura. No hay que ponerlos a 0 solo a 1. Se borran automáticamente cuando la operación de lectura ha sido completada.

El registro EECON2 no está implementado físicamente, por lo que es imposible leerlo (si se intenta leer, todos sus bits se ponen a 0). Se emplea como dispositivo de seguridad durante el proceso de escritura de la EEPROM, para evitar las interferencias en el largo intervalo de tiempo que precisa su desarrollo. La seguridad se consigue escribiendo los valores concretos 55h y AAh. Un ciclo de escritura en una posición EEPROM de datos tiene una duración de 10 ms, que es un tiempo muy grande para la velocidad del procesador.

Proceso de lectura de una posición de memoria de la EEPROM: Comprende los siguientes pasos:
  • Escritura de la dirección que hay que leer en el registro EEADR.
  • Poner a 1 el bit RD del registro EECON1.
  • Lectura del dato diseccionado de esta forma en el registro EEDATA.
El dato está disponible en EEDATA después de colocar RD a 1, por lo que es posible leerlo. El dato leído estará disponible el registro EEDATA en el siguiente ciclo y permanecerá en él hasta que se realice una nueva lectura o escritura en la EEPROM.

Microchip recomienda que se deshabiliten las interrupciones durante la secuencia de, añadiendo las siguientes instrucciones al principio y final de la secuencia.

    BCF INTCON,GIE ;Deshabilita interrupción

    BSF INTCON,GIE ;Habilita interrupción

Proceso de verificación de la escritura. Dependiendo de la aplicación, es aconsejable que se compruebe que los datos se están escribiendo correctamente; aunque esto no suele ser necesario en la mayoría de las ocasiones, para las posiciones de memoria EEPROM es aconsejable.

jueves, 3 de mayo de 2012

[CÓMPUTO INTEGRADO] Ampliar memoria PIC

La 24LC256A de Microchip es una memoria que tiene un tamaño de 32 Kbytes, su estructura está organizada en palabras de 1 byte (8 bits) de longitud, por lo tanto dispondremos en total de 32x8=256 kbits para almacenar información.

La característica principal de esta memoria es que implementa el interfaz I2C para su comunicación serie con otros dispositivos electrónicos.

Características básicas del protocolo I2C
  • El bus de comunicación utiliza dos cables. Uno para transmitir los datos (SDA) y otro para la señal de reloj (SCL). Ambas líneas se tienen que conectar a la alimentación (Vcc) a través de resistencias Pull-UP.
  • El protocolo de comunicación es del tipo Maestro-Esclavo, aunque el protocolo permite que haya varios maestros, lo normal es que solo haya uno, el dispositivo que hace de maestro es el que gobierna la comunicación y es el que controla la señal de reloj (SCL). Los dispositivos que hacen de esclavos responden a las peticiones del maestro.
  • Cada dispositivo conectado al bus se identifica por una única dirección, el protocolo admite utilizar 7 ó 10 bits para el direccionamiento, aunque lo normal es que sean siete.

Los cuatro primeros bits están asignados al fabricante del dispositivo y los tres últimos son configurables por hardware.

La trama de un mensaje simple donde el dispositivo que hace de maestro envía datos para ser escritos en la EEPROM sería el siguiente:

  • Se envía el bit de inicio (S)
  • Se envía la dirección del esclavo, en este caso la memoria EEPROM
  • Se envía un bit más junto con la dirección del esclavo (R/W) para indicar que lo que se quiere es leer o escribir. Si este bit es cero el proceso será de escritura.
  • Después el maestro manda un pulso de la señal de reloj, durante el cual el esclavo debe contestar con un ACK (señal de reconocimiento), si el maestro no recibe esta señal interrumpe la comunicación.
  • Después se envían los bytes de dirección necesarios para identificar el registro de la EEPROM donde queremos realizar el proceso de escritura.
  • Mandamos el dato que se almacenará en la EEPROM
  • Y por último se manda el bit de parada para finalizar la comunicación.

CCS dispone de librerías específicas para gestionar la comunicación I2C de determinados componentes, entre ellos algunas memorias EEPROM. Basta con incluir la librería correspondiente por medio de la directiva #include y utilizar sin más las funciones de la librería. Pero si el componente que queremos utilizar no dispone del driver pertinente en CCS, tenemos otra opción, que es desarrollar nuestro propio driver, para ello disponemos como ayuda de una directiva homologa a #use rs232 (options), se trata de #use i2c (options).

Al incluir esta directiva el compilador nos permite utilizar las siguientes funciones para controlar la comunicación serie I2C entre varios dispositivos: 
  • i2c_isr_state()
  • i2c_poll()
  • i2c_read()
  • i2c_slaveaddr()
  • i2c_start()
  • i2c_stop()
  • i2c_write()

Además los pics que soportan este tipo de comunicación disponen de modulos y registros específicos para facilitar la comunicación I2C por hardware, lo mismo que teníamos con la comunicación serie RS232. 

Esto da pie a muchos ejemplos, ya que hay bastantes dispositivos (Relojes en tiempo real, convertidores A/D, expansión de puertos de E/S, LCDs, etc) que implementan esta interfaz, también tenemos la posibilidad de comunicar varios PICs entre si, uno haciendo de maestro y los otros de esclavos.



En la imagen anterior as patillas A0, A1 y A2 de la memoria están a masa, por lo que la dirección física del componente en la red será: 1010000. Los pines SDA y SCL son los que se conectan al bus IC2, a través de las resistencias pullup.

Puede que alguien se pregunte que valor hay que poner a estas resistencias (pullup) en un circuito real, pues la verdad es que no existe un valor ideal para todos los casos, dependerá de factores como la velocidad a la que hagamos trabajar el bus (100-400 kbps) y de la carga capacitiva que tenga el circuito (max. 400 pF), un valor que se aconseja como estándar es de 4k7. Pero para que el circuito simule bien en Proteus se deben poner las genéricas pullup.  

El pin 7 de la memoria (WP) es para proteger ó no los datos guardados en la memoria, si está a masa los datos no están protegidos y se puede escribir o sobreescribir los datos ya guardados. Si está a uno (Vcc), no es posible escribir en la EEPROM. 

Otro componente de Proteus incluido en el circuito es el I2C Debugger con el cual podemos ver la trama de datos en tiempo de ejecución. En la figura de abajo se detallan los bits de la trama en un proceso de escritura en la EEPROM.


Un ejemplo de código para la comunicación entre el PIC y la memoria EEPROM 24LC256A mediante el protocolo I2C.

#include <16F877.h>   
//Configuración de los fusibles.   
#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG   
#use delay(clock=4000000) //Frecuencia de reloj 4MHz   
#byte  puerto_D = 0x08    // Identificador para el puerto C.    
#include "24256.c" //Incluimos librería 24256 
 
 #int_EXT 
 
 void EXT_isr( void )  
 {  
 
 if ((read_ext_eeprom(0)==0x99)||(read_ext_eeprom(0)==0xFF))  
 {  
 write_ext_eeprom(0,0);  
 puerto_D=read_ext_eeprom(0);  
 }  
 else if ((read_ext_eeprom(0) & 0x0F)<0x09)  
 {      
 write_ext_eeprom(0,(read_ext_eeprom(0))+1);  
 puerto_D=read_ext_eeprom(0);  
 }        
 else if ((read_ext_eeprom(0) & 0x0F)>=0x09)  
 {         
 write_ext_eeprom(0,(read_ext_eeprom(0))+7);  
 puerto_D=read_ext_eeprom(0);  
 }     
 
 }  
 
 void main()  
 {  
 set_tris_b(0xFF); //Puerto B como entrada   
 set_tris_d(0x00);//Puerto D como salida  
 enable_interrupts(GLOBAL);  // Se habilita la interrupción global  
 enable_interrupts(INT_EXT); // Se habilita la  interrupción externa  
 puerto_D =0xFF; //inicializo puerto D  
 
 init_ext_eeprom();//inicializamos memoria EEPROM externa 
 //write_ext_eeprom(0,0xFF);//Resetear registro 00 EEPROM  
 
 while(true)  
 {  
 //Resto del programa    
 
 }  
 }  
 
Proteus nos permite también ver el estado de los registros de está memoria en el proceso de simulación.


jueves, 19 de abril de 2012

[CÓMPUTO INTEGRADO] Taller de programación de Arduino

Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares.

El hardware consiste en una placa con un microcontrolador Atmel AVR y puertos de entrada/salida. Los microcontroladores más usados son el Atmega168, Atmega328, Atmega1280, ATmega8 por su sencillez y bajo coste que permiten el desarrollo de múltiples diseños. Por otro lado el software consiste en un entorno de desarrollo que implementa el lenguaje de programación Processing/Wiring y el cargador de arranque (boot loader) que corre en la placa.

Arduino puede tomar información del entorno a través de sus pines de entrada de toda una gama de sensores y puede afectar aquello que le rodea controlando luces, motores y otros actuadores. El microcontrolador en la placa Arduino se programa mediante el lenguaje de programación Arduino (basasdo en Wiring) y el entorno de desarrollo Arduino (basado en Processing). Los proyectos hechos con Arduino pueden ejecutarse sin necesidad de conectar a un ordenador, si bien tienen la posibilidad de hacerlo y comunicar con diferentes tipos de software (p.ej. Flash, Processing, MaxMSP).
Librerias

Las Librerías proveen funcionalidad extra a nuestro sketch, por ejemplo: al trabajar con hardware o al manipular datos. 

Librerías Estándar:
  • EEPROM - Para leer y escribir en memorias "permanentes".
  • Ethernet - Para conectar a internet usando el Ethernet Shield?.
  • Firmata - Para comunicarse con aplicaciones en la computadora usando un protocolo estándar Serial.
  • LiquidCrystal - Para controlar Displays de cristal líquido (LCD)
  • Servo - Para controlar servomotores
  • SoftwareSerial - Para la comunicación serial de cualquier pin digital.
  • Stepper - Para controlar motores paso a paso (Stepper motors)
  • Wire - Interfaz de dos cables, ó Two Wire Interface (TWI/I2C), para enviar y recibir datos a través de una red de dispositivos y sensores.



Estas librerías son compatibles con versiones de Wiring. Los siguientes enlaces apuntan a la (excelente) documentación de Wiring:

  • Matrix - Librería para manipular displays de matrices de LED básicas.
  • Sprite - Librería básica para manipulacion de sprites para usar en animaciones con matrices de LEDs.
Librerías Contribuídas

Comunicación (networking y protocolos):
  • Messenger - Para procesar mensajes de texto desde la computadora.
  • NewSoftSerial - Versión mejorada de la librería SoftwareSerial.
  • OneWire - Controla dispositivos (de Dallas Semiconductor) que usan el protocolo One Wire.
  • PS2Keyboard - Lee caracteres de un teclado PS2.
  • Simple Message System - Envía mensajes entre Arduino y la computadora.
  • SSerial2Mobile - Envía mensajes de texto o emails usando un teléfono móvil (via comandos AT a través de software serial)
  • Webduino - Librería de web server extendible (para usar con Arduino Ethernet Shield)
  • X10 - Para enviar señales X10 a trav{es de lineas de corriente AC.
  • XBee - Para comunicaciones entre XBees en modo API.
  • SerialControl - Para controlar remotamente otras Arduino a través de una conexión serial.
IDE

Arduino cuenta con su propio lenguaje de programación y un IDE. El entorno de Desarrollo Arduino está constituido por un editor de texto para escribir el código, un área de mensajes, una consola de texto, una barra de herramientas con botones para las funciones comunes, y una serie de menús. Permite la conexión con el hardware de Arduino para cargar los programas y comunicarse con ellos.
Lenguajes

Existen distintos lenguajes diseñados para arduino, sin embargo es posible programarlo con otros lenguajes ya existentes mediante el uso de librerias.

Ardublock: Es un lenguaje de programación para arduino basado en gráficos, diseñado para los que no tienen conocimientos de programación, pero quieren iniciarse en ese mundo.


Python: Es posible utilizar python con arduino mediante la libreria pySerial.

Python Arduino Prototyping API: Es otra libreria especial para arduino basada en python.

Placas

La plataforma arduino cuenta con distintas placas de acuerdo con las necesidades de la persona.

Arduino Mega: Es con mucha diferencia el más potente y el que más i/o tiene, apto para trabajos ya algo más complejos aunque tengamos que sacrificar un poco el espacio, cuenta con el microcontrolador Atmega1280 con más memoria para el programa, más RAM y más pines que el resto de los modelos.
Arduino Bluetooth: incorpora un módulo para la transmisión de datos de hasta 100 metros, con esta placa podras programar sin cables asi como también realizar comunicaciones serie con cualquier dispositivo bluetooth.

Arduino Pro: Más robusto y mejor acabado final; incorpora funcionalidades interesantes tales como un conector especial para conectar una batería LiPo y realizar un montaje portatil.

Arduino Nano: Su principal ventaja es que puede ser pinchado directamente sobre una protoboard haciendo muy cómodo el prototipado al igual que el Arduino mini.

Arduino Duemilanove:  Es la placa estándar.

Arduino Diecimila: A pesar de ser el mismo modelo que el duemilanove pero en su versión anterior lo cito porque aún hay algunas tiendas con él en stock; la principal desventaja es que trae el chip atmega168 frente al atmega328 del duemilanove que es más potente aunque perfectamene compatibles respecto a patillaje y programación.

Arduino Mini: Versión miniaturizada de la placa Arduino. Mide tan sólo 30x18mm y permite ahorrar espacio en los proyectos que lo requieran. Las funcionalidades son las misma que Arduino Duemilanove.
Arduino UNO: Es la denominación para la última placa de la serie con usb integrado. Es equivalente a Duemilanove.

Clones

Como arduino es hardware libre, es completamente valido crear nuestro propio modelo a nuestro gusto, de ahí salen distintos clones que ofrecen cosas como mayor cantidad de pines o microcontroladores más potentes.

BeeBoard: Un clon de arduino con Atmel ATMEGA328 pero de tan solo 40x40 mm.

Oak Micros om328p: Basado en el Atmel ATMEGA328p, un clon compatible con arduino, tiene 28 pines.

Solo son algunos ejemplos de los muchos que se encuenran en esta página.

[CÓMPUTO INTEGRADO] Manejo de memoria


El microcontrolador está diseñado para que en su memoria de programa se almacenen todas las instrucciones del programa de control. Como éste siempre es el mismo, debe estar grabado de forma permanente.

En los microcontroladores la memoria no es abundante. Típicamente la memoria de programas no excederá de 16 K-localizaciones de memoria no volátil (flash o eprom) para contener los programas.

La memoria RAM está destinada al almacenamiento de información temporal que será utilizada por el procesador para realizar cálculos u otro tipo de operaciones lógicas. En el espacio de direcciones de memoria RAM se ubican además los registros de trabajo del procesador y los de configuración y trabajo de los distintos periféricos del microcontrolador.

Tipos de memoria

Algunos tipos de memoria son:


  • ROM con máscara: se graba mediante el uso de máscaras. Sólo es recomendable para series muy grandes debido a su elevado coste.
  • EPROM: se graba eléctricamente con un programador controlador por un PC. Disponen de una ventana en la parte superior para someterla a luz ultravioleta, lo que permite su borrado. Puede usarse en fase de diseño, aunque su coste unitario es elevado.
  • OTP: su proceso de grabación es similiar al anterior, pero éstas no pueden borrarse. Su bajo coste las hacen idóneas para productos finales.
  • EEPROM: también se graba eléctricamente, pero su borrado es mucho más sencillo, ya que también es eléctrico. No se pueden conseguir grandes capacidades y su tiempo de de escritura y su consumo es elevado. Los microcontroladores dotados de memoria EEPROM una vez instalados en el circuito, pueden grabarse y borrarse cuantas veces se quiera sin ser retirados de dicho circuito. Para ello se usan "grabadores en circuito" que confieren una gran flexibilidad y rapidez a la hora de realizar modificaciones en el programa de trabajo. El número de veces que puede grabarse y borrarse una memoria EEPROM es finito, por lo que no es recomendable una reprogramación continua. Son muy idóneos para la enseñanza y la Ingeniería de diseño. Se va extendiendo en los fabricantes la tendencia de incluir una pequeña zona de memoria EEPROM en los circuitos programables para guardar y modificar cómodamente una serie de parámetros que adecuan el dispositivo a las condiciones del entorno. Este tipo de memoria es relativamente lenta.
  • FLASH: se trata de una memoria no volátil, de bajo consumo, que se puede escribir y borrar en circuito al igual que las EEPROM, pero que suelen disponer de mayor capacidad que estas últimas. A diferencia de la ROM, la memoria FLASH es programable en el circuito. Es más rápida y de mayor densidad que la EEPROM. La alternativa FLASH está recomendada frente a la EEPROM cuando se precisa gran cantidad de memoria de programa no volátil. Es más veloz y tolera más ciclos de escritura/borrado.
Estas ultimas son recomendables aplicaciones en las que es necesario modificar el programa a lo largo de la vida del producto. Por sus mejores prestaciones, está sustituyendo a la memoria EEPROM para contener instrucciones.

De esta forma Microchip comercializa dos microcontroladores prácticamente iguales que sólo se diferencian en que la memoria de programa de uno de ellos es tipo EEPROM y la del otro tipo Flash. Se trata del PIC16C84 y el PIC16F84, respectivamente.

Estructura de la memoria

La memoria de programa se divide en páginas de 2,048 posiciones. El PIC16F84A sólo tiene implementadas 1K posiciones es decir de 0000h a 03FFh y el resto no está implementado. (es aquello que se ve en gris)

Cuando ocurre un Reset, el contador de programa (PC) apunta a la dirección 0000h, y el micro se inicia nuevamente. Por esta razón , en la primera dirección del programa se debe escribir todo lo relacionado con la iniciación del mismo (por ejemplo, la configuración de los puertos...).

Ahora, si ocurre una interrupción el contador de programa (PC) apunta a la dirección 0004h, entonces ahí escribiremos la programación necesaria para atender dicha interrupción.

Algo que se debe tener en cuenta es la pila o Stack, que consta de 8 posiciones (o niveles), esto es como una pila de 8 platos el último en poner es el primero en sacar, si seguimos con este ejemplo, cada plato contiene la dirección y los datos de la instrucción que se está ejecutando, así cuando se efectúa una llamada (CALL) o una interrupción, el PC sabe donde debe regresar (mediante la instrucción RETURN, RETLW o RETFIE, según el caso) para continuar con la ejecución del programa.

Memoria de datos

Hay dos zonas diferentes; la RAM estatica o SRAM y la EEPROM.

  • SRAM: donde residen los Registros Específicos (SFR) con 24 posiciones de tamaño byte, aunque dos de ellas no son operativas y los Registros de Propósito General (GPR) con 68 posiciones. La RAM del PIC16F84A se halla dividida en dos bancos (banco 0 y banco 1) de 128 bytes cada uno (7Fh).


  • EEPROM: de 64 bytes donde, opcionalmente, se pueden almacenar datos que no se pierden al desconectar la alimentación.

martes, 28 de febrero de 2012

[CÓMPUTO INTEGRADO] Arquitectura MIPS y simulador SPIM

Aquí van algunas cosas sobre la arquitectura MIPS:

Primero que nada, los diseños del MIPS son utilizados en la línea de productos informáticos de SGI; en muchos sistemas embebidos; en dispositivos para Windows CE; routers Cisco; y videoconsolas como la Nintendo 64 o las Sony PlayStation, PlayStation 2 y PlayStation Portable.

Existe un simulador MIPS R2000/R3000 totalmente libre llamado SPIM compatible con varios sistemas operativos ideado para el aprendizaje de la programación en ensamblador MIPS y de los conceptos generales del ensamblador.

Un emulador MIPS más completo pertenece al proyecto GXemul, el cual no sólo emula las diferentes versiones de los microprocesadores MIPS III y superiores, sino también sistemas enteros que utilicen esos procesadores.

Por ejemplo, GXemul puede emular tanto una DECstation con un procesador MIPS R4400 como un SGI O2 con CPU MIPS R10000, entre otros, así como también diferentes framebuffers y controladoras SCSI.

El software QEMU es capaz de emular también, entre muchas otras, la arquitectura MIPS y MIPSel, así como ejecutar GNU/Linux en la máquina emulada.

Hablando de MIPS, este posee ciertas características:
  • Los procesadores MIPS generalmente fueron de 32 bits, a excepción de los más actuales.
  • Su arquitectura es RISC (Reduced Instruction Set Computer)
  • Tiene 32 registros de 32 bits.
Juegos de registros:
  • $zero tiene cableado el valor numérico cero.
  • Los registros $a0, $a1, $a2 y $a3 se utilizan para pasar parámetros a subrutinas.
  • $v0 y $v1 se utilizan para devolver valores de subrutinas.
  • El registro $ra contiene la dirección de retorno y se utiliza para volver después de una llamada a subrutina.
  • Los registros $s0, $s1, $s2, $s3, $s4, $s5, $s6 y $s7 son registros salvados. 
  • Los registros $t0, $t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8 y $t9 son registros temporales.
  • El registro $gp contiene el puntero global.
  • El registro $sp contiene el puntero de pila.
  • El registro $fp contiene el puntero de marco de pila.
  • El registro $at está reservado para el uso por el ensamblador y no debe ser usado por los programadores.
  • Los registros $k0 y $k1 están reservados para su uso por el núcleo del sistema operativo
Existen 3 registros especiales de 32 bits:
  • pc es el registro contador de programa que almacena la dirección de la siguiente instrucción a ejecutar.
  • hi y lo almacenan el resultado de operaciones de multiplicación o división que generan resultados de 64 bits:
    • hi almacena la parte alta del registro
    • lo almacena la parte baja del registro
Directivas MIPS:

.data Los elementos siguientes se almacenan en segmento de datos.
.text Los elementos siguientes se almacenan en segmento de código (texto).
.ascii "tira de caracteres" Almacena cadena de caracteres NO terminada en caractér nulo.
.asciiz "tira de caracteres" Almacena cadena de caracteres terminada en caracter nulo.
.byte 1, 2, 3 Almacena bytes en memoria, consecutivamente.
.half 300, 301, 302 Almacena medias palabras en memoria, consecutivamente.
.word 80000, 80001 Almacena palabras en memoria, consecutivamente.
. float 1.23, 2.23 Almacena valores flotantes en memoria, consecutivamente.
.double 3.0e21 Almacena dobles en memoria, consecutivamente.
.space 10 Reserva un espacio de 10 bytes e el segmento actual.
.extern etiqueta n Declara que etiqueta es global de tamaño n
.globl etiqueta Declara etiqueta como global
.align n Alínea el siguiente dato en un límite de 2^n

Tipos de instrucciones: 
  • Aritméticas y lógicas
    • addRd,R1,R2 #add,addi,addu,addiu – Comparación
    • seq Rd, R1, R2 # seq, sge, sgt, sle, slt, slti, ...
  • Carga y almacenamiento
    • la Rd label # la, lb, lbu, lh, lw (Carga)
    • swRolabel #sb,sh,sw(Almacenamiento)
  • Salto condicional e incondicional
    • beqR1,R2,label #beqz,bge,bgt,ble,...
  • Manejo excepciones / interrupciones
    • rfe,nop,breakn,syscall.
Codigos de llamadas a sistema:



    jueves, 23 de febrero de 2012

    [CÓMPUTO INTEGRADO] Programa MIPS

    En esta parte mostraré y explicare el código de un programa en ensamblador de MIPS explicando cada sección del código:

    Primero que nada el código:

    .data
    prompt:     .asciiz "Enter in an integer: "
    str1:  .asciiz "the answer is: "
    newline:  .asciiz "\n"
    bye:  .asciiz "Goodbye!\n"
     .globl main
    
     .text
    main:
    
     # Inicializando
     li $s0, 10
    
     # Imprime la linea para captura de datos
     li $v0, 4       # Carga $v0 para imprimir un string 
     la $a0, prompt  # Carga en $a0 la dirección de prompt
     syscall              # Se hace la llamada al sistema
    
     # Lee el valor
     li $v0, 5       # Carga $v0 para leer un entero
     syscall              # Se hace la llamada al sistema
     move  $s0, $v0     # Mueve el valor de $v0 a $s0
    
    
    loop:
     # Imprime str1
     li $v0, 4       # Carga $v0 para imprimir un string
     la $a0, str1    # Carga en $a0 la dirección de str1
     syscall           # Se hace la llamada al sistema
    
     # Imprime el valor del loop
     li $v0, 1  # Carga $v0 para imprimir un entero
     move $a0, $s0 # Mueve $s0 a $a0
     syscall   # Se hace llamada al sistema
    
     # Imprime el nuevo valor
     li $v0, 4  # Carga $v0 para imprimir un string
     la $a0, newline  # Carga en $a0 la direción de newline
     syscall   # Se hace llamada al sistema
    
     # Decrementa la variable
     sub $s0, $s0, 1     # Iguala $s0 a $s0 -1
     bgez $s0, loop    # Si $s0 >= 0 regresa a loop, si no, continua.
    
     # Imprime mensaje de adios
     li $v0, 4  # Carga $v0 para imprimir un string
     la $a0, bye # Carga en $a0 la dirección de bye
     jr  $ra  # Se guardan registros en $ra y sale del programa