{"id":3106,"date":"2022-09-26T22:26:34","date_gmt":"2022-09-26T22:26:34","guid":{"rendered":"https:\/\/blog.rastersoft.com\/?p=3106"},"modified":"2023-12-25T19:46:00","modified_gmt":"2023-12-25T19:46:00","slug":"problemas-tecladiles-4","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=3106","title":{"rendered":"Problemas tecladiles (4)"},"content":{"rendered":"\n<p><strong>EDITADO<\/strong>: actualizados los fuses.<\/p>\n\n\n\n<p>Como ya coment\u00e9, decid\u00ed reemplazar el cargador original del <a rel=\"noreferrer noopener\" href=\"https:\/\/www.microchip.com\/en-us\/product\/ATmega32U4\" target=\"_blank\">Atmega32U4<\/a>, llamado<a rel=\"noreferrer noopener\" href=\"http:\/\/ww1.microchip.com\/downloads\/en\/devicedoc\/doc7618.pdf\" target=\"_blank\"> DFU<\/a> y que <a rel=\"noreferrer noopener\" href=\"http:\/\/www.atmel.com\/Images\/megaUSB_DFU_Bootloaders.zip\" target=\"_blank\">se puede descargar desde la p\u00e1gina de Atmega<\/a>, por <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/rrevans\/ubaboot\" target=\"_blank\">Ubaboot<\/a>, un <em>bootloader <\/em>reducido que s\u00f3lo ocupa 512 bytes y que es muy sencillo de utilizar. A mayores envi\u00e9 dos parches para simplificarlo a\u00fan m\u00e1s:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/rrevans\/ubaboot\/pull\/5\" target=\"_blank\" rel=\"noreferrer noopener\">Un fichero de reglas UDev<\/a> para no tener que usar <em>root<\/em> para programar el microcontrolador<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/rrevans\/ubaboot\/pull\/6\" target=\"_blank\" rel=\"noreferrer noopener\">Un parche para el programador que muestra una ventana<\/a> pidiendo que se pulse el bot\u00f3n de reset y que espera a que aparezca el identificador USB de Ubaboot, lo que simplifica el utilizarlo desde Arduino<\/li>\n<\/ul>\n\n\n\n<p>Para instalar Ubaboot, lo primero que hay que hacer es editar el fichero <em>config.h<\/em> y configurar los par\u00e1metros de nuestra placa. En el caso de mi teclado, hay que descomentar <strong>OSC_MHZ_16<\/strong> (pues el reloj es de 16MHz), y <strong>USB_REGULATOR<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/09\/imagen-1.png\" rel=\"lightbox-0\"><img loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"190\" src=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/09\/imagen-1.png\" alt=\"\" class=\"wp-image-3109\" srcset=\"https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/09\/imagen-1.png 732w, https:\/\/blog.rastersoft.com\/wp-content\/uploads\/2022\/09\/imagen-1-300x78.png 300w\" sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><\/a><\/figure>\n\n\n\n<p>Una vez hecho esto, hay que programar los <em>fuses<\/em> del microcontrolador para un <em>bootloader<\/em> de 512bytes, adem\u00e1s de asegurarnos de configurar bien el resto. En el caso de mi teclado, la configuraci\u00f3n es la siguiente:<\/p>\n\n\n\n<p><em>Fuse LOW<\/em>: 0x5E<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CKDIV8 0<\/li>\n\n\n\n<li>CKOUT 1<\/li>\n\n\n\n<li>SUT1\/0 = 0x01<\/li>\n\n\n\n<li>CKSEL3\/0 = 0x0E<\/li>\n<\/ul>\n\n\n\n<p>En este bloque b\u00e1sicamente no tocamos nada.<\/p>\n\n\n\n<p><em>Fuse HIGH<\/em>: 0xDE<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCDEN 1<em> (desactivado)<\/em><\/li>\n\n\n\n<li><strong>JTAGEN 1 (JTAG desactivado)<\/strong><\/li>\n\n\n\n<li>SPIEN 0 (programaci\u00f3n por SPI activada)<\/li>\n\n\n\n<li>WDTON 1 (watchdog desactivado)<\/li>\n\n\n\n<li>EESAVE 1 (preservar EEPROM al borrar la memoria)<\/li>\n\n\n\n<li><strong>BOOTSZ1\/0 0x11 (bootloader de 512 bytes)<\/strong><\/li>\n\n\n\n<li><strong>BOOTRST 0 (vector de reset apunta al bootloader)<\/strong><\/li>\n<\/ul>\n\n\n\n<p>En este bloque b\u00e1sicamente desactivamos el JTAG, pues no lo necesitamos para nada, ponemos la direcci\u00f3n de inicio del cargador a 512 bytes antes del final de la memoria, y por \u00faltimo configuramos el vector de <em>reset<\/em> para que salte al cargador directamente. Esto \u00faltimo es muy importante, pues el propio cargador detecta si estamos arrancando \u00aben fr\u00edo\u00bb (en cuyo caso saltar\u00e1 a nuestro c\u00f3digo directamente) o si hemos pulsado el bot\u00f3n de reset (en cuyo caso entrar\u00e1 en modo <em>programaci\u00f3n<\/em>).<\/p>\n\n\n\n<p><em>Fuse EXTRA<\/em>: 0xFE<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RESERVADO 7\/4 tienen que estar todos a 1 (0xF)<\/li>\n\n\n\n<li><strong>HWBE 1<\/strong><\/li>\n\n\n\n<li><strong>BODLEVEL2\/0 0x1<\/strong> (EDITADO)<\/li>\n<\/ul>\n\n\n\n<p>El entorno de Arduino me hab\u00eda cambiado el BODLEVEL a 110 (1,8 a 2,2 voltios), en lugar del original 011 (2,4 a 2,8 voltios). Tras algunas pruebas, y en base a mi experiencia, he decidido que es m\u00e1s seguro ponerlo a 001 (3,3 a 3,7 voltios). Esto es algo que he cambiado en este art\u00edculo despu\u00e9s de haberlo publicado.<\/p>\n\n\n\n<p>El siguiente paso es conectar un programador SPI al teclado a trav\u00e9s de los pines correspondientes. Yo uso un <a rel=\"noreferrer noopener\" href=\"http:\/\/dangerousprototypes.com\/docs\/Bus_Pirate\" target=\"_blank\">BusPirate<\/a> que me prestaron, para lo cual tuve que editar el fichero <em>Makefile<\/em> y sustituir <em>usbtiny -B10<\/em> por <em>buspirate -P \/dev\/ttyUSB0 -b 115200<\/em>, adem\u00e1s de instalar <em>AVRdude<\/em> y el resto de utilidades de AVR. Con esto ya s\u00f3lo me queda <a rel=\"noreferrer noopener\" href=\"http:\/\/dangerousprototypes.com\/docs\/Bus_Pirate_AVR_Programming\" target=\"_blank\">conectarlo al teclado<\/a> y ya puedo leer el estado con<\/p>\n\n\n\n<p class=\"mycode\">avrdude -c buspirate -P \/dev\/ttyUSB0 -b 115200 -p m32u4<\/p>\n\n\n\n<p>borrar todo el estado para desprotegerlo con<\/p>\n\n\n\n<p class=\"mycode\">avrdude -c buspirate -P \/dev\/ttyUSB0 -b 115200 -p m32u4 -e<\/p>\n\n\n\n<p>grabar los fusibles con<\/p>\n\n\n\n<p class=\"mycode\">avrdude -c buspirate -P \/dev\/ttyUSB0 -b 115200 -p m32u4 -U efuse:w:0xFE:m<br>avrdude -c buspirate -P \/dev\/ttyUSB0 -b 115200 -p m32u4 -U hfuse:w:0xDE:m<br>avrdude -c buspirate -P \/dev\/ttyUSB0 -b 115200 -p m32u4 -U lfuse:w:0x5E:m<\/p>\n\n\n\n<p>y hacer <em>make<\/em> y <em>make program<\/em> para grabar el Ubaboot. Con \u00e9l grabado, s\u00f3lo tengo que pulsar el boton de RESET del teclado y se pone autom\u00e1ticamente en modo programaci\u00f3n por USB, con lo que ya no necesito m\u00e1s el  BusPirate.<\/p>\n\n\n\n<p>Y ya, por \u00faltimo, instal\u00e9 <a rel=\"noreferrer noopener\" href=\"https:\/\/www.arduino.cc\/\" target=\"_blank\">Arduino<\/a> y <a rel=\"noreferrer noopener\" href=\"https:\/\/www.pjrc.com\/teensy\/teensyduino.html\" target=\"_blank\">Teensyduino<\/a> para disponer de las bibliotecas de USB. Sin embargo, hice un peque\u00f1o cambio para integrar la programaci\u00f3n mejor. Los cambios concretos est\u00e1n descritos en el fichero README del segundo parche que envi\u00e9 a Ubaboot.<\/p>\n\n\n\n<p>Y con esto escrib\u00ed la primera versi\u00f3n del software de mi teclado, pero eso lo comentar\u00e9 con calma en otra entrada.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>EDITADO: actualizados los fuses. Como ya coment\u00e9, decid\u00ed reemplazar el cargador original del Atmega32U4, llamado DFU y que se puede descargar desde la p\u00e1gina de Atmega, por Ubaboot, un bootloader reducido que s\u00f3lo ocupa 512 bytes y que es muy sencillo de utilizar. A mayores envi\u00e9 dos parches para simplificarlo a\u00fan m\u00e1s: Para instalar Ubaboot, &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=3106\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Problemas tecladiles (4)<\/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":[2,7],"tags":[19],"class_list":["post-3106","post","type-post","status-publish","format-standard","hentry","category-cacharreo","category-tutoriales","tag-problemas-tecladiles"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3106","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=3106"}],"version-history":[{"count":9,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3106\/revisions"}],"predecessor-version":[{"id":3171,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3106\/revisions\/3171"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}