{"id":3099,"date":"2022-08-21T18:01:03","date_gmt":"2022-08-21T18:01:03","guid":{"rendered":"https:\/\/blog.rastersoft.com\/?p=3099"},"modified":"2023-12-25T19:46:15","modified_gmt":"2023-12-25T19:46:15","slug":"problemas-tecladiles-2","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=3099","title":{"rendered":"Problemas tecladiles (2)"},"content":{"rendered":"\n<p>Acabo de subir la revisi\u00f3n 1.7 de la placa del teclado. Uno de los cambios m\u00e1s importantes ha sido conectar una de las columnas del teclado desde el puerto PE2 al PB7. Para entender el motivo, primero necesitamos entender c\u00f3mo es el proceso de arranque del <a href=\"https:\/\/content.arduino.cc\/assets\/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Atmega32Ux<\/a>.<\/p>\n\n\n\n<p>El procesador Atmega32Ux permite a\u00f1adir un <em>bootloader<\/em> y arrancarlo en determinadas circunstancias. Hay varias posibilidades:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Llamarlo manualmente desde el programa principal (\u00fatil para cambiar a <em>modo programaci\u00f3n<\/em> de manera \u00abmanual\u00bb)<\/li><li>Llamarlo siempre que se resetee el procesador<\/li><li>Llamarlo tras un <em>reset<\/em> si se da <em>cierta condici\u00f3n externa<\/em><\/li><\/ul>\n\n\n\n<p>Y esta \u00faltima es la clave: esa <em>condici\u00f3n externa<\/em> es que el pin <em>PE2<\/em> est\u00e9 a nivel bajo en el momento de ocurrir el <em>reset<\/em>. Esto permite que, por defecto, se arranque el c\u00f3digo principal, pero si se desea arrancar el <em>bootloader<\/em>, s\u00f3lo haya que conectar dicho pin a masa y pulsar <em>reset<\/em>.<\/p>\n\n\n\n<p>Pues bien, hasta ahora yo utilizaba dicho pin para una de las columnas del teclado simplemente por comodidad de dise\u00f1o: al hacer el <em>enrutado<\/em> de las pistas, era m\u00e1s sencillo utilizar ese pin que otro.<\/p>\n\n\n\n<p>El problema es que la placa<a href=\"https:\/\/www.pjrc.com\/store\/teensy.html\" target=\"_blank\" rel=\"noreferrer noopener\"> Teensy 2.0<\/a>, que es la que lleva el mismo procesador, tiene ese pin permanentemente conectado a masa a trav\u00e9s de un <em>pull-down<\/em> y, adem\u00e1s, no est\u00e1 conectado al exterior. Eso significa que en las bibliotecas de <em>teensyduino<\/em> no est\u00e1 disponible la opci\u00f3n de utilizar dicho pin.<\/p>\n\n\n\n<p>Por simplicidad, yo quer\u00eda mantener la compatibilidad con la <em>Teensy 2.0<\/em> porque me da un entorno de programaci\u00f3n y bibliotecas listas para utilizar, lo que simplifica mucho el trabajo, pero este problema me obligaba a redise\u00f1ar la placa, algo que no me apetec\u00eda mucho porque ya mand\u00e9 fabricarlas y, aunque la versi\u00f3n actual es mucho m\u00e1s avanzada que la que tengo f\u00edsicamente, los cambios hechos hasta ahora eran <em>cosm\u00e9ticos<\/em> y no afectaban a la l\u00f3gica en s\u00ed, mientras que \u00e9ste s\u00ed implicaba un cambio en la l\u00f3gica de funcionamiento.<\/p>\n\n\n\n<figure class=\"wp-block-video meme\"><video height=\"162\" style=\"aspect-ratio: 288 \/ 162;\" width=\"288\" controls src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2020\/06\/mecagoenmiputavida.mp4\"><\/video><\/figure>\n\n\n\n<p>Decid\u00ed ver qu\u00e9 alternativas ten\u00eda, y descubr\u00ed que las placas <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.arduino.cc\/hardware\/leonardo\" target=\"_blank\">Arduino Leonardo<\/a> y <a href=\"https:\/\/docs.arduino.cc\/hardware\/micro\">Arduino Micro<\/a> tambi\u00e9n utilizaban el mismo micro, as\u00ed que decid\u00ed echar un vistazo a ver si pod\u00eda utilizarlas. Al principio ten\u00eda buena pinta porque el <em>bootloader<\/em> estaba disponible, por lo que pod\u00eda convertir mi teclado en un Arduino \u00abcon todas las de la ley\u00bb. Por desgracia, la alegr\u00eda no dur\u00f3 mucho: en el caso del Micro, el pin PE2 tampoco estaba conectado al exterior, con lo que estaba en las mismas. A\u00fan peor: otros dos de los pines que utilizo en el teclado est\u00e1n asignados a LEDs, con lo que probablemente no tendr\u00eda mucha libertad a la hora de utilizarlos. En el caso del Leonardo, tres cuartos de lo mismo.<\/p>\n\n\n\n<p>Al final no me qued\u00f3 otra que cortar la pista que conectaba PE2, y a\u00f1adir dos puentes: uno entre PB7 y la pista original, y otra entre masa y una resistencia conectada a PE2.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/08\/puente.jpg\" rel=\"lightbox-0\"><img loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"536\" src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/08\/puente.jpg\" alt=\"\" class=\"wp-image-3100\" srcset=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/08\/puente.jpg 720w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/08\/puente-300x223.jpg 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Probando otros bootloaders<\/h2>\n\n\n\n<p>A pesar de todo, decid\u00ed probar el <em>bootloader<\/em> de Arduino, por si era m\u00e1s c\u00f3modo que el <em>ubaboot<\/em> que estaba utilizando hasta ese momento. Arranqu\u00e9 el editor <em>Arduino IDE<\/em>, configur\u00e9 una placa <em>Leonardo<\/em>, le indiqu\u00e9 que ten\u00eda un programador <a rel=\"noreferrer noopener\" href=\"http:\/\/dangerousprototypes.com\/docs\/Bus_Pirate\" target=\"_blank\">Bus Pirate<\/a>, y le di a <em>Quemar bootloader<\/em>. Varios minutos (s\u00ed, s\u00ed&#8230; tarda un muy buen rato y no muestra nada en pantalla que indique progreso) finaliz\u00f3 la grabaci\u00f3n. Lo primero que descubr\u00ed es que me hab\u00eda cambiado los <em>fuses<\/em> del Atmega, algo que no me gust\u00f3 mucho porque algunos <em>flags<\/em> eran&#8230; raros. Por ejemplo, me activaba el divisor entre ocho del cuarzo, lo que supone que la CPU va m\u00e1s lenta. Pero lo m\u00e1s raro es que pone a cero los bits 4 y 5 del byte <em>extendido<\/em>, los cuales se supone que <em>no se deben escribir<\/em>, y deben estar siempre a 1. Lo peor es que no soy capaz de devolverlos a su estado normal.<\/p>\n\n\n\n<p>Tras varias pruebas, no me acab\u00f3 de convencer el bootloader, as\u00ed que volv\u00ed al <a href=\"https:\/\/github.com\/rrevans\/ubaboot\" target=\"_blank\" rel=\"noreferrer noopener\">ubaboot<\/a> de nuevo, pero esta vez quer\u00eda asegurarme de corregir un par de problemas que ten\u00eda, y es que al pulsar el bot\u00f3n de <em>reset<\/em> para entrar en modo <em>programaci\u00f3n<\/em>, no siempre funcionaba, sino que normalmente ten\u00eda que darle dos o tres veces antes de que el identificador USB fuese el de <em>OpenMoko<\/em> en lugar del de <em>Teensy<\/em>. Por otro lado, al darle la orden de <em>reiniciar<\/em> desde el programador <em>ubaboot<\/em>, el USB dejaba de funcionar.<\/p>\n\n\n\n<p>Al final, tras echar un vistazo al c\u00f3digo fuente, me di cuenta de que este <em>bootloader<\/em> espera ser llamado siempre durante el arranque, lo que significa que hay que poner a cero el bit 0 del <em>Fuse High Byte<\/em>, el flag <em>BOOTRST<\/em>. De esta manera, siempre arrancar\u00e1 desde el bootloader, y si \u00e9ste detecta que el procesador est\u00e1 arrancando por haber sido conectado a la corriente, saltar\u00e1 directamente al c\u00f3digo principal, y s\u00f3lo entrar\u00e1 en modo <em>bootloader<\/em> si se puls\u00f3 el bot\u00f3n de <em>reset<\/em>.<\/p>\n\n\n\n<p>Con estos cambios ya puedo programar f\u00e1cilmente la placa del teclado: simplemente tengo que instalar <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pjrc.com\/teensy\/teensyduino.html\" target=\"_blank\">Teensyduino<\/a> para disponer de todas las bibliotecas, indicar al <em>IDE<\/em> que tengo un <em>Teensy 2.0<\/em>, y cada vez que compile, fijarme en donde ha almacenado el fichero <em>hex<\/em> con el c\u00f3digo objeto (normalmente en <em>\/tmp\/arduino_build_XXXXXX<\/em>, y utilizar el comando<\/p>\n\n\n\n<p class=\"mycode\">sudo ubaboot.py write path_al_fichero.hex<\/p>\n\n\n\n<p>para programarlo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Acabo de subir la revisi\u00f3n 1.7 de la placa del teclado. Uno de los cambios m\u00e1s importantes ha sido conectar una de las columnas del teclado desde el puerto PE2 al PB7. Para entender el motivo, primero necesitamos entender c\u00f3mo es el proceso de arranque del Atmega32Ux. El procesador Atmega32Ux permite a\u00f1adir un bootloader y &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=3099\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Problemas tecladiles (2)<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[19],"class_list":["post-3099","post","type-post","status-publish","format-standard","hentry","category-sin-categoria","tag-problemas-tecladiles"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3099","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3099"}],"version-history":[{"count":1,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3099\/revisions"}],"predecessor-version":[{"id":3101,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3099\/revisions\/3101"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3099"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3099"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3099"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}