Category Archive Microcontroladores

León Ramos PorLeón Ramos

Problemas con un módulo DS1302

Hola amigos:

Quiero compartirles los problemas que tuve con un módulo DS1302 que pedí a China. Pues lo conecté y, aunque todo se veía bien, con un programita sencillo que imprimía la hora al monitor serial, tenía lecturas erróneas. Por ejemplo:

  1. 23:34:04 <- buena lectura
  2. 23:34:05 <- buena lectura
  3. 01:01:10 <- mala lectura
  4. 01:10:11 <- mala lectura
  5. 23:34:08 <- buena lectura

Pues pasé horas, ¡horas! revisando las bibliotecas que usé. Descargué varias, las revisé parte por parte, descarté las que no me gustaban. También cambié puertos, cables, y todo era en vano. Bien, pues les comparto una receta de cocina para que no sufran lo mismo que sufrí yo y se den de golpes contra la pared cuando prueben lo siguiente:

  1. Toma el módulo y revisa que tu integrado esté orientado como viene en la placa impresa. ¡Uno de mis módulos tenía el porta integrados volteado! Asegúrate de que sea como la placa lo dice.
  2. Con unas pinzas de punta, saca y endereza correctamente los pines del DS1302. Vuélvelo a conectar y asegúrate de que la panza del integrado toque el porta integrados. (Esto era lo que me causaba ruido).
  3. Coloca la pila CR-2032 en el porta pilas y asegúrate de que no tiene “juego”, es decir, que está floja. Si lo está, retírala y con unas pinzas baja un poco el seguro para que haga mayor fuerza y sostenga la pila.
  4. Cambia tus cables, yo estaba usando los cables para pines arduino, unos hembra-macho. Lo que hice fue encajar el módulo directamente en la protoboard y usar cable telefónico o el del cable ethernet.
  5. Usa una biblioteca robusta de interconexión y pon atención a los tiempos de lectura. La mejor biblioteca que encontré es la de Timur Maksimov 2014. Aquí la liga a la página.

Aquí adjunto una foto de stock en donde pueden ver que el integrado está meramente sobrepuesto en el porta integrado. Así vienen por lo general estos módulos, asegúrate de que corriges ese punto.

Aquí una foto de los cables que retiré. Repito, RETIRÉ.

Aquí una foto de los cables que usé:

Espero que estos tips les ayuden y en menos de quince minutos estén arriba con su reloj.

Hasta la próxima,

Porcreadores

Ingeniería inversa en Arduino Uno

Una de las grandes preguntas sobre Arduino que tenía desde hace tiempo, era la posibilidad de hacerle ingeniería inversa, específicamente, obtener el código de un Arduino programado. Les adelanto la sorpresa, la respuesta corta es que si, si es posible obtener código de un Arduino programado, sin embargo, no será lenguaje de alto nivel. Lo más cerca que tendremos será un paso intermedio entre lenguaje ensamblador e instrucciones en hexadecimal.

Lista de equipo

  • Arduino Uno (yo usé un Arduino Uno R3 con chip desmontable)
  • Tarjeta lectora/escritora de chips AVR. (Yo usé la conocida stk500 de Atmel)
  • Adaptador usb-serial
  • Cable usb con terminal tipo A
  • PC con la suite de Arduino instalada

Proceso de ingeniería inversa

Grabar el código original

Este paso ya lo has hecho una y otra vez, sólo carga el sketch al arduino. En mi caso voy a usar un sketch muy sencillo para efectos didácticos como el que podemos encontrar dentro de la carpeta de “Ejemplos”, el famoso Blink. Lo modifiqué un poco para que el led 13 parpareada cada 7 segundos en lugar de 1, esto para poder identificar fácilmente el resultado.

void setup() { 
 // initialize the digital pin as an output.
 pinMode(13, OUTPUT); 
}

// the loop routine runs over and over again forever:
void loop() {
 digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) 
 delay(7000);// wait for a second
 digitalWrite(13, LOW); // turn the LED off by making the voltage LOW 
 delay(7000);// wait for a second
}

mci-tdd-00756_arduino_uno_r3_2

Extraer el chip atmega328p

Este modelo nos permite extraer el chip atmega328p, para poderlo colocar en el lector stk500.

atmega328p-pustk500

Extraer el binario en hexadecimal

Para extraer el binaro en formato hexadecimal de Intel, usa el siguiente comando:

avrdude -F -v -pm328p -cstk500 -P/dev/ttyUSB0 -D -Uflash:r:reverse.hex:i

/dev/ttyUSB0 es el puerto que usa el convertidor usb-serial, en tu caso puede cambiar, revísalo con el comando dmesg inmediatamente después de conectar el usb-serial.

El resultado será un archivo con el nombre reverse.hex, si lo abres, encontrarás algo como lo siguiente:

:200000000C945C000C946E000C946E000C946E000C946E000C946E000C946E000C946E0082
:200020000C946E000C946E000C946E000C946E000C946E000C946E000C946E000C946E0050
:200040000C9488000C946E000C946E000C946E000C946E000C946E000C946E000C946E0016
:200060000C946E000C946E000000000700020100000304060000000000000000010204083E
:200080001020408001020408102001020408102004040404040404040202020202020303C0

Descompilar el hexadecimal

Para poder entender el código hexadecimal, lo pasaremos por un descompilador que convertirá los códigos en instrucciones legibles.

avr-objdump --no-show-raw-insn -m avr --prefix-addresses -D reverse.hex > reverse.assembler

El resultado de ese comando, nos entregará un pseudocódigo parecido al ensamblador, claro que habrá que hacer bastante trabajo estético para poderlo leer, pero el siguiente extracto muestra llamadas las funciones que prenden y pagan el pin 13.

0x000000e8 ldi r22, 0x01 ; 1
0x000000ea ldi r24, 0x0D ; 13
0x000000ec call 0x37a ; 0x0000037a Llama a la función que cambia el pin a alto
0x000000f0 ldi r22, 0x58 ; 88
0x000000f2 ldi r23, 0x1B ; 27
0x000000f4 ldi r24, 0x00 ; 0
0x000000f6 ldi r25, 0x00 ; 0
0x000000f8 call 0x1ee ; 0x000001ee Llama la función de delay
0x000000fc ldi r22, 0x00 ; 0
0x000000fe ldi r24, 0x0D ; 13
0x00000100 call 0x37a ; 0x0000037a LLama la función que cambia el pin a bajo
0x00000104 ldi r22, 0x58 ; 88
0x00000106 ldi r23, 0x1B ; 27
0x00000108 ldi r24, 0x00 ; 0
0x0000010a ldi r25, 0x00 ; 0

Claro que hay que hacer mucho trabajo para entender el funcionamiento correcto del equipo, sin embargo, es completamente viable realizarlo.

¿Cómo evitar que lean código de mi chip?

Existe una sección de fusibles o bits de cerrado que impedirán el proceso anterior. Sólo tienes que seguir correctamente la receta. Adjunto este sitio con información al respecto.

Happy reverse engnineering!!