miércoles, 15 de febrero de 2012

Dispositivos Móviles Vs PCs

Primero veremos las ventajas y desventajas de usar dispositivos móviles sobre otros dispositivos, para ello pensaremos en una forma neutral sin un contexto en específico. Más adelante veremos como afectan estas teniendo como contexto el uso de mi proyecto.

En particular, pensaremos en los dispositivos móviles como los celulares, tablets, plataformas móviles, PDA's etcétera.


Ventajas
Desventajas
Portabilidad:Los dispositivos móviles tienen la principal ventaja de ser de tamaño reducido, esto agregando su uso de batería los hace fácil de trasladar. Precios: Llegan ser muy altos, llegando a tener un mayor precio que algunas PCs y laptops.
Aplicaciones: Los dispositivos móviles más actuales cuentan con un sin número de aplicaciones de todo tipo, aunque no todas gratuitas.Compatibilidad: Nuevas versiones de sistemas operativos no llegan a ser compatibles con los celulares más viejos.
Versatilidad: Cuentan con muchas funciones diferentes en un solo aparato, como localización GPS, llamadas telefónicas, reconocimiento de voz, cámara, navegación web, etc.Accesibilidad: Algunos lugares no tienen acceso a este tipo de dispositivos por causas además del dinero.
Tecnología: Cuentan con la tecnología móvil más actual en cuanto a hardware y software. Resistencia: Los celulares actuales no resisten el uso rudo, y se desgastan facilmente, una caída puede significar el fin de una gran inversión.
Conectividad: Teniendo la mayoría de los dispositivos móviles actuales conexión a internet, es más fácil mantener contacto con las demás personas.Capacidad: En comparación con las PCs y laptops, los dispositivos móviles cuentan con menor capacidad de memoria, y procesador.
Servicios: En el caso de los smartphones, las compañias proporcionan a los usuarios diferentes servicios que se ajusten a sus necesidades.Seguridad: Con tantas aplicaciones en el mercado, es fácil subir aplicaciones peligrosas que cuenten con malware para afectar a los dispositivos de las personas.
Administración: Al contar con agendas y alarmas, y otras funciones facilita al administración del tiempo a la persona.Especificaciones: Algunos dispositivos no cuentan con funciones que siquiera justifiquen comprarlos.


Implicaciones en mi proyecto

Mi aplicación necesitará contar con llamadas telefónicas para ser usable en un 100%, esto es muy importante ya que es el punto de partida de la idea, realizar llamadas de emergencia, por lo tanto de aquí en adelante me referiré a los celulares como los dispositivos móviles en cuestion, en particular smartphones.

Ahora, las ventajas y desventajas vistas anteriormente tienen fuertes implicaciones hacia mi proyecto, es decir, algunas afectan o pueden afectar en como se desarrollará. Cosas como que tantas personas tendrán acceso a la aplicación, cuántos celulares serán compatibles con ella, y con que tecnologías es necesario que cuente son de las que se hablarán.

Ventajas
  • Portabilidad 
Ya que mi aplicación sería usada en momentos de pánico donde uno debe realizar los menos movimientos posibles en ella para poder hacer una llamada o enviar un mensaje de emergencia.
Es casi obvio que no podemos hacer uso de una PC, y en ciertos casos tampoco una laptop. Esto tomaría una gran cantidad de tiempo que sería vital para la persona.
  • Versatilidad
Que un mismo aparato sea capaz de realizar muchas tareas es algo bueno. Y en cuanto a su relación con mi proyecto me parece en sí favorable ya que en el mismo dispositivo móvil, podría tener un localizador GPS y llamadas telefónicas, lo segundo siendo requisito prácticamente para usar la aplicación.
  • Tecnologías
Igualmente, contar con lo más avanzado en tecnología móvil es un punto increíblemente a favor, ya que podría hacer uso de más funciones para mejorar la misma aplicación conforme van saliendo. Pero esto también podría ser una desventaja.

Desventajas

  • Compatibilidad:  
Dependiendo de la plataforma de Android en la que programe, la compatibilidad puede afectar directamente al proyecto. Al parecer la o donde uno debe realizar los menos movimientos posibles en ella para poder hacer una llamada o enviar un mensaje de emergencia.
  • Tecnologías
Dependiendo de la elección de la plataforma en la cual programar Android, se perderían algunos aspectos importantes.

La plataforma 4.0 de Android es la más actualizada, con funciones como navegación por voz, NFC(near-field-communication), entre otras. Su desventaja sería que no es compatible con una gran cantidad de celulares que ya tienen tiempo en el mercado. En cambio la plataforma 2.1, es compatible con el 97% de los celulares, una gran ventaja, pero no contaría con las funciones más actualizadas.
  • Accesibilidad   
Ya sea por el precio, o por que solo este disponible para Android, no mucha gente tendrá acceso a la aplicación, lo cual sería practicamente igual en iOS si no es que peor. 
  • Especificaciones
Algunos dispositivos móviles que no cuenten con GPS, llamadas telefónicas u otras funcionalidades no podrán hacer uso de la aplicación lo cual es lamentable ya que me gustaría que fuera lo más abierta posible en cuanto a su uso dentro de aparatos compatibles con Android.

Comparación de especificaciones

Para ejemplificar las diferencias entre PC y dispositivos móviles en cuanto a hardware usaré una Alienware PC X51(con las máximas especificaciones) y dos smartphones, Samsung Galaxy Nexus lanzado en Noviembre del año pasado con Android actualizado en su versión 4.0  y Samsung Galaxy i9000 s, lanzado en el 2010 con la versión 2.1. Esta triple comparación tiene dos objetivos:

  1. Ver que tan cerca está la tecnología de los dispositivos móviles con las más avanzadas computadoras de escritorio del mercado.
  2. Comparar versiones de Android para ver el avance de los dispositivos móviles en tan poco tiempo.
Es de esperarse que la PC ganará en cuanto a capacidad de disco duro, memoria ,procesador y demás, pero el objetivo de esto, es ver que tan cerca se acerca la tecnología móvil a otras como las PCs de escritorio y laptops y las implicaciones.



Samsung Galaxy i9000 S(2010)                           Samsung Galaxy Nexus(2011) 

 Alienware X51(2012)                    


Especificación
Samsung Galaxy Nexus
Alienware X51
Samsung Galaxy i9000 S 
Procesador
Dual-core 1.2 GHz Cortex-A9
Intel® Core™ i7-2600 (8MB Caché, 3.40GHz, con tecnología Hyper-Threading y Turbo Boost 2.0)
1 GHz Cortex-A8
Memoria
(Almacenamiento)
16/32GB(interna)
1000 GB de Disco Duro
8/16GB(Interna)
RAM
1 GB
8 GB
512 MB
Sistema Operativo
Android OS, v4.0 (Ice Cream Sandwich)
Windows 7 Home Premium 64-bits
Android OS, v2.1 (Eclair)
Chipset
TI OMAP 4460Intel®H61 ExpressHummingbird
Extra
(Cosas no en común)
-GPS: A-GPS
-GPU: PowerVR SGX540
-Cámara:5 MP, 2592x1944 pixels, autofocus, LED flash

-Sensores:
Acelerómetro, proximidad, gyro, brújula, barómetro
-Batería Standard, Li-Ion 1500 mAh
-Tarjeta de video 1GB GDDR5 NVIDIA® GeForce® GT 545
-Tarjeta de Sonido Mini-Tarjeta Dell Inalámbrica DW1502 (Wireless-N
-Refrigeración del aire de alto rendimiento Alienware™
-Lectora de Blu-ray de doble capa con ranura de carga (BR-ROM, DVD+-RW, CD-RW


-GPS: A-GPS
-GPU PowerVR SGX540
-Camara 5 MP, 2592 x 1944 pixels, autofocus
Sensores:
Acelerómetro, proximidad, brújula
Batería:
Standard, Li-Ion 1500 mAh

Entre los smartphones podemos ver que cuentan con algunas características similares, pero con una clara superioridad en velocidad de CPU y RAM por el Galaxy Nexus, obviamente por ser más reciente. 
Pero lo que más quisiera  hacer referencia es a la función GPS. Si un celular de 2010 compatible con Android 2.1 tiene GPS no tengo por que preocuparme al programar mi aplicación para esa versión, ya que al hacerlo me dará la ventaja de que será compatible con una gran cantidad de celulares.

Ahora en la comparación con la PC no hay mucho que decir, la PC obviamente tiene las mejores características en cuanto a procesamiento y capacidad de memoria, pero pierde ante los celulares en la capacidad de ser trasladado, además de que no cuenta con tanta versatilidad como estos. Pero se puede notar 

Conclusiones:

Los dispositivos móviles son el futuro. Cada año salen nuevos modelos al mercado, y estos ofrecen mejores capacidades de memoria, y procesamiento, tanto así que llegan a superar computadoras de los años 2000 en todo sentido, y con las exigencias actuales esto seguirá aumentando hasta llegar a un punto en el que se le pueda comparar a una computadora en algunos aspectos.
Pero algo es seguro, siguen y siempre tendrán la ventaja de ser portables, lo cual las computadoras con todo su poder de procesamiento y memoria no tendrán por un tiempo, aunque quien sabe, quizás lo hagan.

Referencias:

Lenguajes de Bajo Nivel

Lenguajes de bajo nivel. ¿ Qué son?


(Imágen tomada de: http://upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Codigo_de_maquina.png/400px-Codigo_de_maquina.png)

En computo integrado, trabajaremos con Assembly, o lenguaje ensamblador para conocer un poco más como funcionan en sí las instrucciones sin muchas abstracciones y debido a que muchos sistemas embebidos lo usan.
(Nota: Hablaré del concepto de sistemas embebidos en algún post más adelante, mientras tanto aquí)

El hecho de ser un lenguaje de alto nivel o de bajo nivel es relativo, ya que anteriormente lenguajes como C eran considerados de alto nivel porque eran más recientes. Entonces esto no significa que uno sea mejor que lo otro, es más, podemos pensar en estos lenguajes basandonos en sus propósitos.

Assembly nos serviría bastante para realizar manipulaciones directas de hardware para optimizar recursos, en cambio uno no usaría esto directamente para crear aplicaciones para reproducir música.

Los códigos de lenguajes de bajo nivel pueden ser convertidos a código máquina sin siquiera usar un compilador, y el código resultante corre directamente en el procesador. Ésto es por lo cual los programas en lenguajes de bajo nivel son más eficientes y corren más rápido con una menor cantidad de recursos, a diferencia de los lenguajes de alto nivel que para hacer lo mismo son más pesados.

Los lenguajes de bajo nivel hacen uso de registros, pilas, y direcciones de memoria para realizar las operaciones necesarias para correr un programa.

Ejemplos:
  • Lenguaje máquina

El lenguaje máquina es el que los microprocesadores ejecutan directamente sin una compilación previa. Es bastante difícil de usar ya que requiere memorizar o buscar códigos de números para realizar alguna funcion en específico, y hoy en día son muy pocos los que lo usan.

Cada procesador tiene su propio set de instrucciones para código máquina, estas instrucciones son patrones de bits que corresponden a diferentes funciones en la máquina de dicho procesador. Es por esto que cada set de instrucciones es específico para cada procesador determinado de la misma arquitectura.

Para correr un programa usando este lenguaje, el CPU utiliza una secuencia de estos patrones de bits(instrucciones). En los procesadores más simples se ejecuta una instrucción después de otra, mientras que en otros más avanzados se ejecutan más de una al mismo tiempo. Igual que en Assembly el flujo del programa puede ser controlado usando funciones como jump para transferir dicho flujo de una instrucción a otra que no este directamente después. Esto se puede hacerse también con una condición (conditional jump)para saber si cambiar el flujo del programa o no dependiendo en dicha condición.

Este es un ejemplo de código máquina que calcula el n-ésimo número de la serie de Fibonacci

8B542408 83FA0077 06B80000 0000C383
FA027706 B8010000 00C353BB 01000000
B9010000 008D0419 83FA0376 078BD98B
C84AEBF1 5BC3
  • Lenguaje Ensamblador(Assembly)
El lenguaje ensamblador es otro de los lenguajes de bajo nivel, usado en computadoras, procesadores controladores y además en circuitos integrados. La sintaxis de este lenguaje es una representación simbólica de código máquina necesarias para programar dependiendo también de la arquitectura del CPU. Entonces, existen diferentes sintaxis específicos para cada arquitectura de computadora física o virtual, ya que en algunos casos es posible emularlas(SPIM es un emulador de MIPS).

Assembler es el encargado de convertir el lenguaje ensamblador en instrucciones de código máquina del CPU dado. Actualmente existen formas de hacer debug a los códigos de ensamblador lo que facilita un poco su entendimiento.

Un programa en lenguaje ensamblador consiste en una serie de instrucciones y meta-instrucciones a los que se les llaman directivas, comentarios y datos. Esto es lo que la computadora traduce en un flujo de instrucciones ejecutables por el procesador.

Lo que un lenguaje de alto nivel realiza con ciclos, condiciones y otras operaciones sencillas de comprender, el lenguaje ensamblador lo hace utilizando movimientos en stack, registros y direcciones de memoria, lo cual hacen un tanto difícil su compresión.
 
Este es un ejemplo de lenguaje ensamblador de un simple Hola Mundo, usando la sintaxis GAS:


 

Alto nivel vs Bajo nivel. Pros y Contras

Como mencioné previamente, no podemos pensar en los lenguajes de bajo nivel y alto nivel como iguales y compararlos basándose en que tan eficientes son para realizar la misma tarea. 

Sus propósitos son diferentes, por lo cual hay que ver que Pros y que Contras tienen en favor de lo que hacen. Para esto hay que pensar que usaremos los lenguajes de alto nivel para desarrollar aplicaciones y programas, y los de bajo nivel para manipular hardware o crear drivers para diferentes tipos de hardware.

Lenguajes Pros Contras
Alto 
Nivel
-Más comprensibles, ya que proveen una mayor abstracción.

-Fácil de escribir y arreglar errores ya que la mayoría de los compiladores son muy eficientes al decirte los errores.

-Una gran cantidad de funciones ya están programadas en alguna librería.

-Portabilidad, en su mayoría pueden ser usados en sistema o arquitectura.

-Se enfoca más en la usabilidad sobre la eficiencia.
-Menor velocidad ya que dejan el trabajo de bajo nivel a la computadora.

-En programas complejos el tiempo de compilación puede ser enorme.

-No es posible manipular hardware directamente.

-Hacen un mayor uso de recursos y por lo tanto ocupan mayor memoria.
Bajo Nivel -Aprovechamiento de recursos ya que tienen acceso directo a ellos.

-Producen código más eficiente.

-Mayor velocidad, al trabajar directamente con los recursos.

-Útil cuando solo un ejecutable binario es necesario.

-Interacción directa con hardware

-Cuenta con algunas acciones que no pueden realizar compiladores de lenguajes de alto nivel.

-Programación de drivers de computadoras.
-Poca portabilidad ya que dependen de la arquitectura de la computadora.

-Abstracción mínima, ya que la sintáxis es más cercana a lenguaje máquina.

-Complejidad. Son difíciles de usar ya que sin el uso de abstracciones es más difícil desarrollar programas complejos.

-El programador necesita entender bien la arquitectura donde esta usándolos.

-Muy tendiente a bugs difíciles de arreglar.

-Por lo mismo de la complejidad, puede ser difícil de dar mantenimiento a software en estos lenguajes.

-Un pequeño cambio en el diseño del programa puede dejar inútil todo lo demás.

Referencias



Parallel Programming in Perl Scripts

-I don't promote piracy and this post should be understood from a programming point of view-

So, recently I read an article about a certain person who copied every magnet link in The Pirate Bay into one single compressed file. Obviously it's just the magnet links, and not the files itself, and apparently he did it in case The Pirate Bay was shut down or something of that nature(we probably know about what happened to Megaupload, if not you can read this paper).

I've never heard of magnet links before, but it appears that the whole Pirate Bay magnet links fits in a simple USB, in 164MB or 90MB compressed, which is really small. An example of a magnet link is the following:

7015954|Ubuntu 11.10 Alternate 64-bit|707047424|2|5|5316391aed813d4283178dce2b95c8ad56c5be72


  • 7015954 is the ID that pirate bay uses for the torrent
  • Ubuntu 11.10 Alternate 64-bit The name of the file or something like that
  • 707047424 The size of the file in bytes
  • 2 Is the number of seeders at the time of the snapshot
  • 5 Is the number of leechers
  • 5316391aed813d4283178dce2b95c8ad56c5be72 is the magnet link hash
  • Now that wasn't exactly what I wanted to talk but it was neccessary to understand what is next.
  • An user named "allisfine" made a Perl script to copy all the information of the magnet links in The Pirate Bay(or almost all), into one single file, which had around 1,643,194 torrents in just 90MB.
  • Later it was updated to 7 million links, with 560MB weight.

That is what I want to talk about, the Perl  script, which got my attention after I saw some lines in it regarding parallel programming. And this was somewhat obvious, if that "allisfine" guy made a script to copy all the magnet links, it would take a big load of time to do it normally because it would copy the links one by one, but using parallel programming several links could be copied almost simultaneously.

The script is the following:

(Code taken from: http://pastebin.com/8RXXthXB)

As we can see it contains some lines about parallel programming, I'm not going to try to explain it all because I don't have any experience in Perl , but I will explain it superficially, and hope to understand it a little bit deeper in order to someday program my own Perl  scripts.

  1. use warnings;
  2. use strict;
  3. use Parallel::ForkManager;
  4. use 5.010;
To import functions from modules.I would think of it as an import.
my $pm=new Parallel::ForkManager(50);
This line defines a fork manager used to perform parallel task in a single Perl script.It is especially well-suited to performing a number of repetitive operations on a relatively powerful machine, especially when working on a multiprocessor machine. The parameter 50, it's the maximum number of processes to fork.

  1. $pm->run_on_finish(sub{
  2.     my (undef, undef, undef, undef, undef, $res_ref) = @_;
  3.     my ($res, $line) = @$res_ref;
  4.     if ($res == 1) {
  5.             open my $outf, ">>", "outf";
  6.             flock($outf, LOCK_EX) or next;
  7.             seek($outf, 0, SEEK_END);
  8.             say $outf $line;
  9.             say $line;
  10.             flock($outf, LOCK_UN);
  11.     }
  12. });
 I found that the run_on_finish method will make this block of code to be called at the point in the execution when each process is finished, but I don't particularly understand much of any of the lines. 

  1. my $i = 1;
  2. while (1) {
  3.     $i++;
  4.     $pm->start and next;
  5.     my $res;
  6.     my $page="";
  7.     $page = `curl -s http://thepiratebay.se/torrent/$i -m 120`
  8.         while ($page !~ /<!DOCTYPE html/);
  9.     my $line = "";
  10.     if ($page =~ m{<title>Not Found}) {
  11.         $res = 0;
  12.     } else {
  13.         $res = 1;
  14.         my ($title) = $page =~ /<div id="title">\s*(.*?)\s*<\/div>/s;
  15.         my ($size) = $page =~ /<dt>Size:<\/dt>\s*<dd>.*?\((\d*)&nbsp;Bytes\)<\/dd>/s;
  16.         my ($seeders) = $page =~ /<dt>Seeders:<\/dt>\s*<dd>(\d*)<\/dd>/;
  17.         my ($leechers) = $page =~ /<dt>Leechers:<\/dt>\s*<dd>(\d*)<\/dd>/;
  18.         my ($magnet) = $page =~ /magnet:\?xt=urn:btih:(.*?)(&|")/;
  19.         $line =
  20.         $i."|".$title."|".$size."|".$seeders."|".$leechers."|".$magnet;
  21.     }
  22.     $pm->finish(0,[$res, $line]);
  23. }
    This would be the main part of the code, it defines a simple counter "i", used to move from page to page starting from page 1, using curl to read the html from the page. Then it checks if the page is found or not, if it is found, it copies the title, size, seeders, leechers, and magnet link from the html, and saves it on a single variable "line", then it finishes the process and returning two values, "res", which tells if the page was found or not, and "line", the line with the information.


References:


https://thepiratebay.se/torrent/7016365
http://www.urgente24.com/195225-la-ciberguerra-en-la-web-hace-mutar-a-pirate-bay?pagination=1
http://www.perlmonks.org/?node_id=291446

jueves, 9 de febrero de 2012

Sistemas Embebidos y Ejemplos

Actualmente los sistemas embebidos están en todos lados, en las casas, oficinas, automóviles, fabricas, hospitales y electrónicos. Físicamente los sistemas embebidos pueden ser desde dispositivos portátiles como teléfonos, relojes digitales y reproductores mp3, hasta luces de tráfico, controladores de fabricas o los sistemas que controlan las plantas nucleares.

Un sistema embebido es cualquier computadora que es un componente de un gran sistema que depende de su propio microprocesador. Es embebido al ser parte de un dispositivo completo, que frecuentemente incluye otro hardware o partes mecánicas.

Características de los sistemas embebidos

Los sistemas embebidos estan diseñados para hacer una tarea en específico y cumplir con ella en vez de ser más versátiles. Pero esto no significa que sean dispositivos independientes. Muchos de los sistemas embebidos consisten en pequeñas partes computalizadas dentro de un gran dispositivo que sirve un propósito en general. Por ejemplo un automóvil:

En el automóvil cada sistema embebido dentro del automóvil proporciona una función específica como un subsistema del automóvil propio.

Los programas escritos para los sistemas embebidos son llamados firmware, y son guardados en memoria de solo lectura o memorias flash. Estos programas corren con recursos limitados, poca memoria y con pantallas y teclados pequeños o no existentes(sin forma de entrada o salida).

Seguridad

Por lo general los sistemas embebidos pertenecen a máquinas que se espera que funcionen por años, y en algunos casos se programan para que se recuperen de dichos errores. Por esto el software es usualmente desarrollado y probado mucho más cuidadosamente que el software desarrollado para computadoras.

Los satélites son sistemas que se esperan que funcionen por años, ya que son inaccesibles para repararlos mientras están en funcionamiento.

Algunos problemas de seguridad específicos serían:
  • El sistema no se puede apagar de forma segura para reparar, o es inaccesible para repararlo. Estos pueden ser sistemas espaciales(satélites, sondas), cables bajo el mar, y automóviles accidentados.
  • El sistema debe seguir encendido por seguridad. Navegación aérea, sistemas de control de reactores nucleares, señales de tren, motores en aviones de un solo motor.
  • La empresa perderá grandes cantidades de dinero cuando el sistema se apague. Controles de fabrica, sistemas de telefonía, sistemas de juego en línea(PSN).
Diversas técnicas son usadas para recuperarse de estos errores, tanto bugs de software como errores en el hardware.
  • Subsistemas con piezas de repuesto a las cuales cambiar.
  • Un modo de software parcial
  • Timer que reinicia el sistema amenos que el sistema le notifique.
Procesadores en los sistemas embebidos

Un microprocesador es una implementación en forma de circuito integrado de la Unidad Central de Proceso CPU de una computadora.

Los subsistemas de entrada/salida y memoria pueden ser combinados con un subsistema de CPU para formar una computadora o sistema embebido completo. Estos subsistemas se interconectan mediante los buses de sistema (formados a su vez por el bus de control, el bus de direcciones y el bus de datos).
El subsistema de entrada acepta datos del exterior para ser procesados mientras que el subsistema de salida transfiere los resultados hacia el exterior. Lo más habitual es que haya varios subsistemas de entrada y varios de salida. A estos subsistemas se les reconoce habitualmente como periféricos de E/S.

Un microcontrolador es un circuito integrado que incluye una CPU, memoria y circuitos de E/S. Entre los subsistemas de E/S que incluyen los microcontroladores se encuentran los temporizadores, losconvertidores analógico a digital (ADC) y digital a analógico (DAC) y los canales de comunicaciones serie. Estos subsistemas de E/S se suelen optimizar para aplicaciones específicas (por ejemplo audio, video, procesos industriales, comunicaciones, etc.)
PIC


El PIC(Programmable Intelligent Computer) es un microcontrolador popular entre ingenieros. Existen diferentes dispositivos PIC con diversos componentes y capacidades.
Los PIC cuentan con una arquitectura Harvard(donde el área de código y almacenamiento de datos están separados uno del otro)

Muchos tipos de proyectos electrónicos pueden ser construidos fácilmente usando algún PIC, entre ellos relojes, videojuegos simples, robots, y más. El PIC es un mictrocontrolador de propósito general que puede tener diferentes componentes por precios razonables.

En la siguiente página se pueden ver algunas recomendaciones de PICS hechas por gente que trabaja con ellos: http://en.wikibooks.org/wiki/Embedded_Systems/PIC_Microcontroller

Programación del PIC

Para transferir el código de la computadora al PIC normalmente se usa un programador. La mayoría de PICs que se distribuyen hoy en día incorporan ICSP (In Circuit Serial Programming, programación serie incorporada) o LVP (Low Voltage Programming, programación a bajo voltaje), lo que permite programar el PIC directamente en el circuito destino.

Existen muchos programadores de PICs, desde los más simples que dejan al software los detalles de comunicaciones, a los más complejos, que pueden verificar el dispositivo a diversas tensiones de alimentación e implementan en hardware casi todas las funcionalidades

Fuente de alimentación


La parte más importante de un circuito es la fuente de alimentación. El PIC requiere +5Volts y +13Volts regulados de fuente de alimentación. La razón por la cual se necesitan dos fuentes de alimentación es por la diferente programación de algoritmos:
  • High Power Programming Mode(+13V)
  • Low Power Programming Mode(+5V)
Referencias:


miércoles, 8 de febrero de 2012

Wiki Contributions - Week 2

My contributions to the wiki the second week were the following:

-Entry about GPUs and GPU computing in general here.
-Added a C and CUDA C code comparison here.

I'll upload the image here to link it in the wiki:
















Image taken from the following pdf:

Modelo Determinista: Rutas de Trenes

Como sistema determinista escogí un sistema que se conforma de rutas de trenes. Lo considero determinista ya que al seguir una ruta predeterminada, y solo detenerse en lugares dados, no da opción a que al azar afecte el funcionamiento del sistema. 

Sistema Determinista

Un sistema determinista es un sistema cuyos estados no se ven afectados por el azar. Osea si conocemos el estado actual del sistema, y las variables de entrada, el comportamiento de salida siempre será el mismo.

Mi elección:

Como sistema determinista escogí el comportamiento de los trenes-metro en una ruta.


¿Por qué es determinista?

Las rutas de trenes son estáticas, ya que los trenes se ven obligados a seguirlas, y su comportamiento es el mismo durante todo el recorrido, acelerando entre estaciones, y deteniendose en ellas, para luego repetir, lo único que cambia de esto, y también se repite dentro de todo el recorrido, es cuando llega al final donde da vuelta para repetir el viaje.

¿Cómo lo represento?

Para representarlo gráficamente es necesario pensar en las entradas y salidas para saber como se comportará el sistema conforme a estas. Podemos saber que si la estación está cerca, el tren disminuirá su velocidad hasta detenerse por completo, entonces cuando ya se encuentra en la estación, este comportamiento será similar cerca del final, ya que debe frenar para dar vuelta y continuar el recorrido en reversa. De esta forma podemos pensar en una línea de estados tan grande como estaciones existan en dicha ruta y agregándole el "inicio" y el "fin".

Entradas                              Acción                                       Salida

-Estación cerca                    Frenar                                 -Tren disminuyendo velocidad
-Estacion, tipo de vuelta       Abrir puerta determinada      -Esperar 
-Final de Ruta cerca             Frenar                                 -Tren disminuyendo velocidad
-Final de Ruta                      Dar vuelta                           -Tren dando vuelta

Explicación del "diagrama":

En el diagrama podemos ver el recorrido, usando dos estaciones como ejemplo y un Inicio del sistema(la ruta) y un fin. El sistema iniciaría la ruta del tren por la izquierda, aceleraría, y presionaría el freno antes de llegar a la estación 1 para disminuir la velocidad hasta detenerse al llegar a la estación, aquí dependiendo del tipo de vuelta que sea, tomando como 0 la vuelta inicial y 1 la vuelta de regreso se abriría una puerta determinada al estar en la estación y se esperaría un determinado tiempo. 

Ahora se aceleraría de nuevo, se frena antes de llegar a la estación 2 hasta detenerse en ella, y se repite el proceso de la estación 1. El tren vuelve a acelerar, y ahora frenará antes de llegar a la vuelta, para poder dar la vuelta y repetir el recorrido pero en orden inverso, a lo cual ahora se abrirá la puerta contraria.

Pseudocódigo:

#Variables globales
#Lista con la ruta a recorrer
ruta = [Inicio, E1, E2, ..., En, Fin]
#Estado de vuelta, si es de Inicio-Fin o de Fin-Inicio, para saber que puertas se abren
estado_vuelta = 0
#Velocidad del tren, inicialmente 0
velocidad = 0
#Posicion actual, inicialmente 0
actual = 0

#Funcion que acelera hasta llegar a un limite de velocidad mientras no este cerca de la estación
funcion acelerar(estacion):   
     while(ruta[actual] != cerca_estacion):
           if velocidad != velocidad_limite:
                  velocidad++
           else:
               frenar()

#Función que disminuye la velocidad hasta que sea 0, y manda llamar a la función de abrir puerta
funcion frenar(estacion):
      while(velocidad != 0):
           velocidad--
      abrir_puerta()

#Abre la puerta determinada por el estado en el que se encuentre
funcion abrir_puerta():
      if estado_vuelta = 0:
           abrir_izquierda()
      else:
           abrir_derecha()

#Función que voltea la ruta mágicamente
funcion vuelta(ruta):
     voltear_ruta(ruta)

#Funcion que se encarga de simular la ruta, corriendo infinitamente.
#Se aumenta una posicion desde el inicio para moverse a la siguiente, y si la siguiente llega a ser el fin o el inicio, da la vuelta para volver a iniciar, colocando actual = 0 para recorrer la ruta de nuevo.

funcion ruta():
     while(true):
          actual++
          acelerar(ruta[actual ])
          if ruta[actual] == Fin or ruta[actual] == Inicio:
               vuelta(ruta)
               actual = 0