{"id":414,"date":"2023-04-24T08:00:00","date_gmt":"2023-04-24T07:00:00","guid":{"rendered":"https:\/\/jorgeturiel.es\/?p=414"},"modified":"2023-04-16T21:47:36","modified_gmt":"2023-04-16T20:47:36","slug":"raspberry-pi-pico-y-freepascal","status":"publish","type":"post","link":"https:\/\/jorgeturiel.es\/?p=414","title":{"rendered":"Raspberry Pi Pico y FreePascal"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Raspberry Pi Pico, no es una Raspberry como otras placas de la fundaci\u00f3n Raspberry que son un  microordenador. Sino que es una microcontrolador. La diferencia es que un microordenador es un <a rel=\"noreferrer noopener\" href=\"https:\/\/es.wikipedia.org\/wiki\/Microprocesador\" target=\"_blank\">microprocesador<\/a> con todos sus perif\u00e9ricos, tarjeta de v\u00eddeo, puertos usb, etc. En cambio un microcontrolador es solo un el microprocesador. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.freepascal.org\/\">FreePascal<\/a>, en sus versiones trunk o desarrollo, pr\u00f3ximas a publicarse, soporta gran cantidad de sistemas <a href=\"https:\/\/es.wikipedia.org\/wiki\/Sistema_embebido\">embebidos<\/a> entre ellos las nueva placa Raspberry Pi Pico.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Al programar un microcontrolador, como por ejemplo los famosos <a rel=\"noreferrer noopener\" href=\"https:\/\/es.wikipedia.org\/wiki\/Arduino#Hardware\" target=\"_blank\">Arduinos<\/a>, se suele hacer en C, el cual es un lenguaje compilado. Lo que significa que el c\u00f3digo que escribamos ser\u00e1 traducido al lenguaje que entiende el microprocesador, y ejecutado. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Raspberry Pi Pico, permite ser programada adem\u00e1s de en C, en Micropython, el cual es un lenguaje interpretado. La principal diferencia est\u00e1 en que un programa escrito en un lenguaje interpretado siempre tiene un rendimiento menor que un lenguaje compilado. Ya que lo que ocurre con los lenguajes interpretados es que son le\u00eddos l\u00ednea a l\u00ednea por un interprete, traducido a lenguaje del microcontrolador y ejecutado. Todo esto seg\u00fan se ejecuta nuestro programa, lo cual hace que el microprocesador tenga m\u00e1s trabajo. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El lenguaje C, es un lenguaje con el cual, los programas al ejecutarse obtienen un gran rendimiento pero para muchas personas se hace complicado trabajar con \u00e9l, en gran medida por su sintaxis.  Por otra parte Pascal en un lenguaje d\u00f3nde la sintaxis es m\u00e1s amigable, y como en C, los programas tiene un gran rendimiento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparando el entorno<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de nada debemos instalar FreePascal, y su entorno desarrollo, o IDE, llamado Lazarus. Tal como coment\u00e9, FreePascal en su versi\u00f3n actual no soporta Raspberry Pi Pico, pero si en su versi\u00f3n \u00abTrunk\u00bb o desarrollo. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La mejor manera de instalar todo lo necesario es utilizar la aplicaci\u00f3n <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/LongDirtyAnimAlf\/fpcupdeluxe\/releases\/tag\/v2.2.0h\" target=\"_blank\">Fpcupdeluxe<\/a>. Descarga la \u00faltima versi\u00f3n desde su p\u00e1gina. Escoge la versi\u00f3n para tu sistema operativo.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1023\" height=\"768\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/fpcupdeluxe_General.png\" alt=\"\" class=\"wp-image-415\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/fpcupdeluxe_General.png 1023w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/fpcupdeluxe_General-300x225.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/fpcupdeluxe_General-768x577.png 768w\" sizes=\"auto, (max-width: 1023px) 100vw, 1023px\" \/><figcaption class=\"wp-element-caption\">Aspecto de Fpcupdeluxe<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Lo primero es seleccionar un carpeta d\u00f3nde realizar la instalaci\u00f3n, para ello pulsa en el bot\u00f3n <em>Set InstallDir<\/em>. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"332\" height=\"70\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220116_143017.png\" alt=\"\" class=\"wp-image-416\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220116_143017.png 332w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220116_143017-300x63.png 300w\" sizes=\"auto, (max-width: 332px) 100vw, 332px\" \/><figcaption class=\"wp-element-caption\">Seleccionar directorio<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Ahora, abajo de todo. Pulsa sobre el bot\u00f3n que pone <em>Pico<\/em> y que tiene una imagen de la placa Raspberry Pi Pico.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"189\" height=\"121\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_104446.png\" alt=\"\" class=\"wp-image-418\"\/><figcaption class=\"wp-element-caption\">Bot\u00f3n instalar Pico<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Ahora, pulsa en <em> Install\/Update<\/em> <em>FPC+LAZ<\/em>. Ya solo queda esperar. Fpcupdeleuxe se encargar\u00e1 de descargar todos los archivos necesarios e instalarlos. El proceso pude tardar m\u00e1s o menos dependiendo de la  conexi\u00f3n a internet y de tu ordenador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez descargado e instalado todo, Fpcupdeleuxe crear\u00e1 un icono en el escritorio para iniciar Lazarus. Antes de abrir el programa, descarga los ejemplos de este <a href=\"https:\/\/github.com\/michael-ring\/pico-fpcexamples\">github<\/a>. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Algunos ajustes previos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abre el entorno Lazarus, usando el acceso directo que se cre\u00f3 en el escritorio de tu pc. Por defecto aparece en ingl\u00e9s. Para cambiar el idioma, selecciona el men\u00fa <em> Tool <\/em> y dentro de este  <em>Options<\/em>. En la ventana que aparece, selecciona <em>General<\/em>, y selecciona <em>Lenguage<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"553\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163133.png\" alt=\"\" class=\"wp-image-419\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163133.png 844w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163133-300x197.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163133-768x503.png 768w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><figcaption class=\"wp-element-caption\">Cambiar el idioma.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Para que el cambio sea efectivo cierra Lazarus y vuelve a abrirlo. O desde el men\u00fa <em>File<\/em>, selecciona <em>Restart<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"502\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163328.png\" alt=\"\" class=\"wp-image-420\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163328.png 225w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_163328-134x300.png 134w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><figcaption class=\"wp-element-caption\">Reiniciar Lazarus<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Primer programa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como es tradici\u00f3n, vamos hacer parpadear un LED, en este caso es un LED, que viene integrado en la placa. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Selecciona el men\u00fa Proyecto y dentro de este selecciona, <em>Abrir proyecto.<\/em> Busca la carpeta d\u00f3nde hayas descargado los ejemplos y selecciona el proyecto <em>Blinky.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"910\" height=\"744\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_164858.png\" alt=\"\" class=\"wp-image-422\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_164858.png 910w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_164858-300x245.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_164858-768x628.png 768w\" sizes=\"auto, (max-width: 910px) 100vw, 910px\" \/><figcaption class=\"wp-element-caption\">Abrir proyecto Blinky<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Ahora, desde el men\u00fa <em>Ejecutar<\/em> selecciona <em>Compilar<\/em>. Tambi\u00e9n puedes usar el atajo <em>Ctrl+F9<\/em>. Te recomiendo que recuerdes esta combinaci\u00f3n de teclas, ya que la usar\u00e1s mucho.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"368\" height=\"813\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165102.png\" alt=\"\" class=\"wp-image-424\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165102.png 368w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165102-136x300.png 136w\" sizes=\"auto, (max-width: 368px) 100vw, 368px\" \/><figcaption class=\"wp-element-caption\">Compilar programa<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">En la ventana de mensajes, puedes ver como se produce el proceso de compilado y el resultado del mismo. Si todo ha ido bien, mostrar\u00e1 un mensaje indicando que ha sido un \u00e9xito.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"157\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165328-1024x157-1.png\" alt=\"\" class=\"wp-image-425\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165328-1024x157-1.png 1024w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165328-1024x157-1-300x46.png 300w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220120_165328-1024x157-1-768x118.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Ventana mensajes.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Ahora solo queda cargar nuestro programa en la Raspberry Pi Pico. Conecta la placa a tu ordenador en un puerto usb. Mant\u00e9n pulsado el bot\u00f3n BOOTSEL, conecta el cable micro USB y suelta el bot\u00f3n BOOTSEL. En el ordenador se montar\u00e1 una unidad nueva llamada <em>RPI-RP2<\/em>,como si fuera una unidad USB. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"732\" height=\"687\" src=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220122_184126.png\" alt=\"\" class=\"wp-image-426\" srcset=\"https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220122_184126.png 732w, https:\/\/jorgeturiel.es\/wp-content\/uploads\/2023\/04\/Screenshot_20220122_184126-300x282.png 300w\" sizes=\"auto, (max-width: 732px) 100vw, 732px\" \/><figcaption class=\"wp-element-caption\">Unidad RPI-RP2 montada al conectar la placa Pico<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Para ello abre la carpeta d\u00f3nde est\u00e1 el programa que acabas de abrir. Dentro de este hay una carpeta llamada <em>Bin<\/em>, dentro de esta \u00faltima hay un archivo llamado <em>blinky.uf2<\/em>. C\u00f3pialo dentro de la la unidad <em>RPI-RP2<\/em>. La placa Rasperry pi Pico se reiniciar\u00e1 y empezar\u00e1 a ejecutar el programa. En esta caso parpadear\u00e1 el Led de color verde que lleva incorporado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El programa que hemos cargado es muy sencillo, vamos a ver algunos detalles del mismo.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \" >program blinky;\n{$MODE OBJFPC}\n{$H+}\n{$MEMORY 10000,10000}\n\nuses\n  pico_gpio_c,\n  pico_timer_c;\n\nbegin\n  gpio_init(TPicoPin.LED);\n  gpio_set_dir(TPicoPin.LED,TGPIODirection.GPIO_OUT);\n  repeat\n    gpio_put(TPicoPin.LED,true);\n    busy_wait_us_32(500000);\n    gpio_put(TPicoPin.LED,false);\n    busy_wait_us_32(500000);\n  until 1=0;\nend.      <\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">El primer detalle que debemos fijarnos es en la l\u00ednea cuatro. La directiva de compilaci\u00f3n <em>{$MEMORY 10000,10000}<\/em> indica al compilador que debe reservar debe reservar 10000 bytes de la memoria para la el stack (pila) y otros 10000 para el heapsize (mont\u00edculo). Sino tienes claro para que sirve para cosa, te recomiendo que visites esta <a href=\"https:\/\/codingornot.com\/diferencias-entre-heap-y-stack\">p\u00e1gina<\/a>. Recordar que estamos programando un microcontrolador, y no existe sistema operativo que gestione la memoria<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las siguientes l\u00edneas indican las unidades o librer\u00edas que vamos usar, en este caso: <em>pico_gpio_c <\/em>y <em>pico_timer_c<\/em>.  Estas librer\u00edas fueron instaladas previamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En las l\u00edneas 11 y 12, preparamos la salida. Primero inicializ\u00e1ndola y luego indicando que ser\u00e1 una salida. <em>TPicoPin.LED <\/em> es una constante que contiene el n\u00famero de pin en el cual est\u00e1 conectado el LED que est\u00e1 incluido en la placa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s, entramos en un bucle en el cual se repetir\u00e1 hasta que sea cumpla la condici\u00f3n indicada en la l\u00ednea 18. La cual nunca se cumplir\u00e1 por lo cual siempre estar\u00e1 ejecut\u00e1ndose el c\u00f3digo que hay en el interior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La l\u00ednea 14, activa la salida que hemos definido antes. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La l\u00ednea 15 espera 50000 microsegundos, osea 500 milisegundos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La l\u00ednea 16, desactiva la salida. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La l\u00ednea 17 vuelve a esperar 50000 microsegundos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con lo cual conseguimos que la salida est\u00e9 activa durante medio segundo, y desactivada otro medio segundo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De una manera sencilla podemos preparar el entorno para programar nuestra Raspberry Pi Pico, usando un lenguaje compilado, y aprovechar as\u00ed todo su potencial.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Saludos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>FreePascal, en sus versiones trunk o desarrollo, pr\u00f3ximas a publicarse, soporta gran cantidad de sistemas embebidos entre ellos las nueva placa Raspberry Pi Pico.<\/p>\n","protected":false},"author":2,"featured_media":417,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,41,26,40],"tags":[43,32,23,42],"class_list":["post-414","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-lazarus","category-microcontroladores","category-programacion","category-stm32","tag-bluepill","tag-free-pascal","tag-lazarus","tag-stm32"],"_links":{"self":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/414","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=414"}],"version-history":[{"count":5,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/414\/revisions"}],"predecessor-version":[{"id":430,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/posts\/414\/revisions\/430"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=\/wp\/v2\/media\/417"}],"wp:attachment":[{"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=414"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=414"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jorgeturiel.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}