Rama de estudiantes del IEEE de la Universidad de Oviedo

4 04 2009

Como podéis ver en la pestaña Acerca de, soy estudiante de Ingeniería de Telecomunicación en la Universidad de Oviedo. El caso es que recientemente se fundó la rama de estudiantes del IEEE de dicha universidad. Para el que no lo sepa, el IEEE es el Instituto de Ingeniería Eléctrica y Electrónica, una organización sin ánimo de lucro que trabaja a nivel mundial. Es la asociación de este tipo más relevante; como ejemplo, indicar que, aproximadamente, el treinta por ciento de la literatura escrita sobre electricidad, electrónica, software… es suya.

Las ramas de estudiantes son asociaciones de, valga la redundancia, estudiantes, al frente de las cuales se encuentra un profesor de la universidad correspondiente miembro del IEEE. Al menos en la nuestra, cualquier estudiante de la Universidad de Oviedo, incluso posiblemente cualquier persona interesada en la materia, puede participar.

Por el momento, somos unos treinta y nos reunimos una media de una vez a la semana para tratar temas que nos interesan como son los citados anteriormente. Aunque cada uno puedo diseñar lo que quiera, ahora mismo, estamos construyendo un pequeño robot siguelíneas o velocista (a elección del consumidor).

Realmente se trata de una buena iniciativa. Yo mismo había estado informándome sobre estas ramas de estudiantes, pero no existía una aún en la Universidad de Oviedo (a decir verdad si existía, pero estaba completamente abandonada). Esperemos que dure.





Vuelta a la normalidad

4 04 2009

Por fin puedo decir que vuelvo a la rutina. Tras más de dos meses en los que se juntaron exámenes, entregas de prácticas y avería de ordenador, parece que tengo nuevamente algo de tiempo para poder actualizar el blog. Esperemos que siga así la cosa, porque tengo bastantes cosas que contar :D .





PICs: los microcontroladores de Microchip

21 03 2009

Hasta ahora hemos hecho una pequeña introducción a los microcontroladores. En este post empezaremos a centrarnos en los PIC, un tipo concreto de microcontroladores diseñado por la casa Microchip.

Sin embargo, además de estos micocontroladores, existen muchas otras marcas, cada una de ellas implementada generalmente por un fabricante distinto. Cabe preguntarse, por lo tanto, por qué escoger los PICs entre la gran variedad de microcontroladores existentes en el mercado. Aalgunos motivos son los siguientes:

  • Gran gama de microcontroladores
  • Rapidez de ejecución
  • Arquitectura Harvard
  • Eficiencia del código
  • Juego de instrucciones reducido (RISC) de fácil aprendizaje
  • Compatibilidad con dispositivos de la misma familia e incluso con los de otras distintas
  • Gran soporte, así como herramientas abundantes y de bajo coste
  • Protección de código frente a lecturas no deseadas

Podemos decir que estos son los motivos técnicos o más o menos objetivos. Sin embargo, existen otros motivos como son el estudio de estos microcontroladores en mucha universidades o la buena política de promoción de Microchip, que fomenta el uso de sus microcontroladores a través de, entre otras, el envío de muestras gratuitas o samples.

Acabamos de comentar que muchas casas fabrican diferentes microcontroladores y que, en concreto, Microchip diseña los PIC. Sin embargo, dentro de ellos existen, tal y como ya introdujimos previamente, una gran cantidad de modelos distintos que sigue aumentando día a día. Actualmente podemos clasificarlos en dos grandes grupos: los PICs clásicos y los dsPICs. Estos últimos incluyen características de DSP, lo que permite llevar a cabo tareas de procesamiento de audio o vídeo, entre otros.

Nosotros nos centraremos en los primeros. Los PICs clásicos se encuentran divididos en siete familias, de forma que los microcontroladores de una familia determinada comparten muchas características entre ellos y los diferencian de los de las demás. Haciendo una nueva división tenemos microcontroladores de 8, 16 y 32 bits.  Hablaremos en entregas posteriores de qué significa esto; de momento, basta saber que el PIC que será el eje de este curso, el 16F877, pertenece al primer grupo, exactamente a la familia PIC16. Así mismo, existen otras como son la PIC10, PIC12 o PIC32.

En una primera aproximación, podemos decir que, cuanto más alto sea el número identificativo de la familia, mayores prestaciones nos ofrecerán los PICs que pertenezcan a ella. Con el objetivo de ilustrar esto de una forma más aclara, abajo puede verse una gráfica comparativa extraída de la web de Microchip:

Comparativa entre las distintas familias de PICs

Comparativa entre las distintas familias de PICs

Hasta aquí llega esta mínima introducción a los microcontroladores PIC. En la próxima entrega nos centraremos ya en el PIC1F877, explicando sus características particulares y qué seremos capaces de llegar a desarrollar con él.





Diff y Patch: parcheando aplicaciones

18 02 2009

Todo aquel que sea programador o se dedique de una u otra forma al noble arte de picar código sabrá  qué es un parche. Para los que no lo sepan, digamos que un parche es una sección de código que se añade a un programa con el objetivo de modificar su funcionalidad. Alguno quizá se esté preguntando por qué se crean parches en lugar de modificar directamente el código del programa. La respuesta a esta pregunta está directamente ligada con el peso de los ficheros.

Imaginemos que estamos trabajando en el desarrollo de un procesador de texto con miles de líneas de código, en el que resulta que la opción de centrar texto no funciona correctamente. Así que nos ponemos manos a la obra y solucionamos el problema. Llegados a este punto, querremos hacer pública esta mejora y para ello tendremos dos opciones: volver a distribuir todo el código del programa o limitarnos a enviar un simple fichero que indique los cambios que han llevado a cabo sobre el programa original. Obviamente, elegiremos esta última opción pues reduciremos considerablemente la cantidad de información a transmitir.

Vista la ventaja de los parches la siguiente pregunta que cabe formularse es si existe alguna forma de automatizar este proceso, ya que sería realmente tedioso generar a mano un fichero en el que se listen las diferencias entre dos archivos para luego llevar a cabo las modificaciones pertinentes. Es aquí donde entran en juego las aplicaciones diff y patch, las cuales pueden instalarse en un sistema Debian, si es que no lo están ya, mediante aptitude:

aptitude install diff patch

La primera de ellas se encarga de generar el fichero de diferencias entre los dos archivos y la segunda de aplicarlas. Veamos esto con un ejemplo: supongamos que nuestro proyecto consta de un único fichero llamado main.cpp, el cual se muestra a continuación:

#include <iostream>

using namespace std;

int main() {

    int i=0;

    while (i<10) {
        cout << i << " ";
        i++;
    }

    return 0;
}

Como puede verse, el programa se limita a mostrar por pantalla los números del 0 al 9 separados por un espacio. Resulta que ahora decidimos que esta funcionalidad (si es que puede llamarse así) estaría mejor implementada de otra forma, por lo que creamos otro fichero llamado patch.cpp a partir del anterior:

#include <iostream>

using namespace std;

int main() {

    for (int i=0; i<10; i++0) {
        cout << i << endl;
    }

    return 0;
}

En esta ocasión, mostramos cada número en cada línea en lugar de todos seguidos. Ya tenemos, además del código original, el modificado. Así que llega el momento de ejecutar el comando diff, que hallará las diferencias entre ambos ficheros. Para poder trabajar con ellas más tarde, las volcaremos en el fichero main.diff:

diff main.cpp patch.cpp > main.diff

Ahora sólo resta aplicar los cambios, empleando para ello el comando patch:

patch -o main2.cpp main.cpp main.diff

que creará el fichero main2.cpp, que será el resultado de aplicar las modificaciones indicadas en el fichero main.diff sobre el archivo main.cpp.





Teclado numérico en Vim

14 02 2009

Estaba programando en C++ con Vim cuando de repente me doy cuenta de que el teclado numérico no funciona y muestra letras en lugar de números. Me sorprendió bastante porque ayer funcionaba perfectamente. Además los demás programas que he probado no presentan este problema.

La solución pasó por buscar en Google. Así llegué a un foro en el que comentaban que se debía a un problema con la variable de entorno $TERM, que indica el tipo de terminal que estamos utilizando en ese momento. Si esta variable de entorno no está bien configurada, los diferentes programas con los que trabajemos no reconocerán bien todos los caracteres que tecleemos.

Supongo que mi problema en concreto se debía a que, por un motivo que aún desconozco, $TERM cambió de valor, provocando los ya citados problemas con el teclado numérico. Para arreglarlo, basta con ejecutar el siguiente comando:

export $TERM=linux

De esta forma, establecemos linux como valor de $TERM.

Actualización: tras escribir este post me di cuenta de que esta solución no es eficaz, pues a pesar de conseguir que funcionara el teclado numérico hacía fallas las teclas especiales, como inicio o fin. Seguí buscando en Google pero no encontré nada. Sin embargo, al final lo solucioné de casualidad cambiando la configuración de Konsole. Exactamente a través de la opción Editar perfil… del menú Preferencias. En la ventana que nos aparecerá basta con eligir, dentro de la pestaña Entrada, la opción Consola Linux.





Partes del microcontrolador

13 02 2009

En el post anterior hicimos una pequeña introducción al concepto de microcontrolador. En esta ocasión, profundizaremos en él haciendo especial hincapié en los componentes fundamentales que componen uno: la CPU o unidad central de proceso, la memoria y las unidades de entrada salida.

La CPU

Podemos decir que la CPU, siglas en inglés de unidad central de proceso, es el núcleo del microcontrolador. Se encarga de ejecutar las instrucciones almacenadas en la memoria, de la que hablaremos más adelante. Es lo que habitualmente llamamos procesador o microprocesador, término que a menudo se confunde con el de microcontrolador. En esta línea cabe aclarar que, tal y como estamos viendo, ambos términos no son lo mismo: el microprocesador es una parte de un microcontrolador y sin él no sería útil; un microcontrolador, en cambio, es un sistema completo que puede llevar a cabo de forma autónoma una labor.

Podemos ver al microprocesador como el cerebro de una persona y al microcontrolador como el cuerpo: el cerebro se encarga de procesar toda la información, pero necesita a los demás órganos para funcionar. De la misma forma, el microprocesador, que únicamente se encarga de ejecutar las instrucciones, necesita, por un lado, un lugar donde almacenarlas, es decir, la memoria, y por otro, un medio para interactuar con el exterior, es decir, los dispositivos de entrada/salida.

Memoria

Entendemos por memoria los diferentes componentes del microcontrolador que se emplean para almacenar información durante un periodo determinado de tiempo. La información que necesitaremos durante la ejecución del programa será, por un lado, el propio código, y por otro, los diferentes datos que usemos durante la ejecución del mismo. Hablaremos por tanto de memoria de programa y de memoria de datos, respectivamente.

La diferente naturaleza de la información que hay que almacenar hace necesario el uso de diferentes tipos memorias. Sin hacer especial énfasis en este apartado, sí habrá que tener en cuenta una clasificación básica, que distingue entre memoria volátil y no volátil. La primera es aquella que pierde la información que almacena al desconectarla de la alimentación; la segunda, como resulta obvio, no. Por lo tanto, se hace evidente que al menos la memoria de programa deberá ser no volátil: no sería práctico que el programa grabado en el microcontrolador se borrara cada vez que apagáramos el dispositivo. Con respecto a la memoria de datos, diremos por el momento según la situación puede interesarnos una u otra.

La existencia de dos tipos de información a almacenar, nos lleva también al concepto de arquitectura. Entendemos por arquitectura el conjunto de componentes del microcontrolador y la forma en la que éstos se relacionan. Las más conocidas son la arquitectura Harvard y la arquitectura Von Neumann. En la primera, datos y programa estas almacenados en dos memorias físicamente separadas, cada una de ellas con un bus de comunicaciones propio. En la segunda, datos y programa se encuentran en el mismo dispositivo de memoria, por lo que comparten un mismo.

Arquitectura Harvard

Arquitectura Harvard

Arquitectura Von Neumann

Arquitectura Von Neumann

Unidades de entrada/salida

Ya hemos visto qué parte del microcontrolador ejecuta las instrucciones de nuestro programa y de dónde las lee. Ahora sólo nos falta ver qué son las unidades de entrada/salida. Las unidades de entrada/salida son los sistemas que emplea el microcontrolador para comunicarse con el exterior. Imaginemos una televisión: por un lado tiene un dispositivo de salida, como es la pantalla, y por otro lado, de entrada, como son los botones de subir o bajar volumen y de cambio de canal. Así, los dispositivos de entrada nos permitirán introducir información en el microcontrolador y los de salida nos servirán para que éste la saque al exterior.

En el futuro haremos mucho más hincapié en estos dispositivos, pues son fundamentales a la hora de desarrollar una aplicación: ¿qué sentido tendría diseñar un programa que hiciera ciertas operaciones para al final no mostrar ningún resultado al usuario final?

El post de hoy ha sido una pequeña introducción teórica a los conceptos básicos que rodean al funcionamiento interno del microcontrolador. Es posiblemente uno de los temas más aburridos, por tratarse únicamente de teoría. Era de todas formas una lección necesaria y que nos ayudará en el futuro a comprender el comportamiento de un microcontrolador.





Introducción a los microcontroladores: qué son y para qué sirven

11 02 2009

Estamos rodeados de microchips; o al menos eso oímos continuamente en los medios: que si el móvil que llevamos con nosotros lleva uno, que si los coches los usarán para conducir solos y que incluso la lavadora hace uso de uno para saber cuanto detergente es necesario para lavar la ropa. Mucha gente emplea estos términos, pero no tanta sabe realmente qué un microchip y en qué se diferencia de otros términos similares.

Así que, empezando por el principio, un microchip o circuito integrado es una pastilla de silicio en la que se implementan ciertos componentes electrónicos para que juntos puedan llevar a cabo una función determinada. Este trozo de silicio se encuentra recubierto generalmente por una cápsula de plástico para protegerlo del exterior. La conexión con el exterior se lleva a cabo mediante unas patillas metálicas denominadas pines.

Circuitos integrados

Circuitos integrados con ventana que permite ver su interior

El microchip supone una gran ventaja de cara a la miniaturización,

de un dispositivo, sino a su encapsulado, es decir, la forma en la que se presenta. El gran avance que supuso el microchip radica en que se redujo drásticamente el tamaño necesario para montar un circuito, pues todo lo necesario venía integrado y miniaturizado.

Existen circuitos integrados que desempeñan multitud de funciones: amplificación, regulación de tensión, conversión analógico/digital y digital/analógico, temporización… Y es que, el término microchip no hace referencia a la función del dispositivo, sino que simplemente engloba a todos aquellos dispositivos electrónicos encapsulados de una forma similar a la de los que vemos en la imagen.

El disponer en el mercado de circuitos integrados que realizan una labor completa de forma autónoma es una gran ventaja y ayuda enormemente en el diseño de un proyecto más complejo. Sin embargo, la situación podría ser más favorable  aún si en lugar de tener muchos dispositivos que llevan a cabo una función concreta, tuviéramos sólo uno, pero que pudiera llevar a cabo distintas funciones según nuestros intereses. Eso es lo que conocemos como microcontrolador.

Un microcontrolador es un dispositivo programable que ejecuta las instrucciones grabadas en su memoria. De esta forma, el microcontrolador se convierte en un pequeño ordenador y es el desarrollador el encargado de programarlo según sus necesidades. Además de la flexibilidad que esto aporta, los microcontroladores suelen contar con otros módulos  que añaden nuevas funcionalidades que analizaremos más adelante, como temporizadores, conversores analógico digital, módulos CCP…

Todas estas características convierten a los microcontroladores en dispositivos todoterreno con un sin fin de aplicaciones: desde un reloj despertador como el que todos tenemos en la mesilla de noche hasta el control de tracción de un coche.





Lentitud al resolver direcciones web en Debian

1 12 2008

Desde que instalé Debian había notado que IceWeasel tardaba alrededor de treinta segundos en resolver las direcciones. Exceptuando este hecho, Internet funcionaba bien. Busqué un poco en Google y como era previsible no soy el único que se encuentra en esta situación.

Al parecer, el problema radica en que en las instalaciones de las últimas versiones de Debian, se activa la carga por defecto del módulo relativo al protocolo IPv6, que aún no funciona correctamente. Esto provocaba un retraso considerable al resolver las direcciones, el cual se solucionaba cuando, al no obtener respuesta mediante el protocolo citado, se recurría a la versión anterior, IPv4.

Para resolver el problema, hay que, en primer lugar, editar el fichero /etc/modprobe.d/aliases, localizar una línea similar a alias net-pf-10 ipv6 y deshabilitarla. Para ello, podemos dejarla de la siguiente forma:

alias net-pf-10 ipv6 off

Luego hacemos un cambio similar en la configuración de IceWeasel. Para ello, abrimos el navegador y escribimos about:config en la barra de direcciones. Nos aparecerá una lista de opciones, buscamos mediante el filtro que tenemos a nuestra disposición la opción network.dns.disableIPv6 y la ponemos a true, haciendo doble clic sobre ella.

De esta forma desactivamos el uso de IPv6 en la red en general y nuestro navegador en particular. Cabe destacar el hecho de que en la mayoría de páginas que he encontrado en Google no se menciona el segundo paso aquí dado, por lo que la navegación seguirá siendo lenta.

Por otro lado, aunque no sea parte de la solución a este problema, mencionaré otra modificación que realicé en el sistema con la que también mejoré la velocidad de resolución de direcciones. Consiste en editar el fichero /etc/resolv.conf y añadir la siguiente línea al principio del mismo:

nameserver 192.168.1.1

siendo en este caso 192.168.1.1 la dirección de mi router.





Sonido en GNU/Linux

11 09 2008

Como ya comentaba en la entrada anterior estos días reinstalé Debian Etch en mi PC. Así que, como es lógico, es fase de configurar algunas cosas. En este ocasión, os hablaré del sonido.

Nada más iniciar KDE me aparecía un mensaje que ya me resultaba familiar de instalaciones anteriores:

Mensaje de error de aRts

Mensaje de error de aRts

Para solucionarlo basta con instalar el paquete alsa-base y ejecutar alsaconf:

debian:/# aptitude install alsa-base
debian:/# alsaconf

Durante el proceso de instalación el asistente nos mostrará una lista con los dispositivos de sonido encontrados en el sistema, así que únicamente tendremos que seleccionar el correspondiente a nuestra tarjeta de sonido para que funcione correctamente.





Recuperar contraseña de superusuario en Debian

10 09 2008

Hace poco más de un mes hice una limpieza general en el ordenador: formateé todo el disco duro, lo volví a particionar distribuyendo mejor el espacio e instalé Windows XP. El caso es que entre una cosa y otra llegaron los exámenes y no tuve tiempo de instalar Debian hasta ayer a última hora de la tarde

Había dejado bajando la versión estable en DVD desde el mediodía y ya la había grabado, así que lo instalé de la forma habitual. El problema llegó cuando, al hacer un su para ser root y poder instalar los diferentes paquetes, el sistema me decía que la contraseña que introducía no era la correcta, algo realmente extraño pues la acababa de teclear dos veces hacía unos minutos.

El caso es que necesitaba la contraseña de root, así que tuve que buscar la forma de conseguirla. Una era volviendo a reinstalar Debian. Sin embargo, la idea de volver a instalar todo, aunque no tuviera que hacer copia de seguridad no era muy divertida. Además eso era matar moscas a cañonazos y yo quería hilar más fino.

Así que busqué en Google y encontré dos opciones: la primera era emplear una distribución live, para arrancar directamente desde ella y cambiar la contraseña desde allí, y la segunda emplear GRUB para conseguir el acceso. Como no tenía a mano ninguna distribución live, opté por la segunda opción.

Ésta consiste en, una vez delante del menú de arranque de GRUB, situarse sobre la línea referente a Debian y pulsar la tecla e para editar el arranque relativo a ese SO. En mi caso tenía esto:

root (hd0,4)
kernel /boot/vmlinuz-2.6.18-6-k7 root=/dev/hda5 bootkbd=es
initrd /boot/initrd.img-2.6.18-6-k7
savedefault

Ahora nos situamos en la línea que comienza con kernel y añadimos init=/bin/sh, de forma que quede así:

root (hd0,4)
kernel /boot/vmlinuz-2.6.18-6-k7 root=/dev/hda5 bootkbd=es init=/bin/sh
initrd /boot/initrd.img-2.6.18-6-k7
savedefault

A continuación, pulsamos enter para aceptar los cambios y pulsamos b para arrancar el sistema con los nuevos parámetros. Esto nos llevará directamente a una shell de superusuario. Por tanto, ahora simplemente hay que reiniciar la constraseña de root. Para ello, editaremomos el fichero /etc/shadow, para lo cual a su vez necesitamos montar el sistema de ficheros. Empleamos para ello el siguiente comando, que monta el sistema raíz con permisos de lectura y escritura:

mount -o remount,rw /

Ahora podemos editar el fichero con nuestro editor preferido:

vi /etc/shadow

En este fichero se encuentran las contraseñas codificadas y otra información de cada usuario. Así pues, sólo debemos buscar la línea correspondiente al root y modificarla convenientemente:

root:$1$IVM/sKgl$4ljhDuuHmx2Y8CYKasgbQ/:14131:0:99999:7:::

Como se puede ver, en cada línea se separan los diferentes campos por dos puntos. El correspondiente a la contraseña es el segundo, así que la línea relativa al superusuario quedaría así:

root::14131:0:99999:7:::

Hecho esto, sólo queda reiniciar y loguearse como root. Evidentemente, esta vez no nos pedirá contraseña, así que una vez conseguido el acceso de superusuario, simplemente tenemos que cambiar la contraseña mediante el comando passwd:

passwd

De esta forma habremos recuperado nuestra contraseña de superusuario. Cabe destacar el hecho de que antes de ésta, encontré otra solución consistente en, en lugar de añadir init=/bin/sh, añadir single en el menú de edición de GRUB. Sin embargo, este método en Debian no funciona, pues el arranque nos acaba pidiendo la contraseña igualmente mediante este mensaje:

Give root password for maintenance
(or type Control-D to continue):

En cualquier caso, como habéis comprobado, el método es prácticamente el mismo.