en los últimos dos artículos a otro, he desprestado de cómo es impresionante pero extraño, y luego se puso en un sistema básico y parpadeó algunos LEDs. Y mientras te he apuntado en el Multitaker, aún no hemos hecho mucho uso real. Empezando a un Sistema Fortuario como este es aproximadamente la mitad de la batalla. Trabajar dentro del microcontrolador es diferente de la compilación para el microcontrolador, y averiguar el flujo de trabajo, cómo técnicas de problemas, y donde los recursos beneficiosos no son necesariamente obvios. Además, hay algunas características excelentes de Mecrisp-Stellaris que puede no notar hasta que haya pirateado el sistema por un tiempo.

Idealmente, harías mirando sobre el transporte de alguien haciendo lo suyo, y verías algo de cómo funcionan. Ese es el objetivo de esta pieza. Si ya ha flasiado en nuestra versión de Mecrisp-Stellaris-Plus-Embello, está listo para seguirlo. Si no, vuelve y haz tu tarea real rápido. Aún estaremos aquí cuando hayas terminado. Mucha de esta publicación será muy segura con el sabor de Mecrisp-Stellaris, pero dado que se ejecuta en toneladas de fichas de brazos por ahí, esto no es un mal lugar para estar.

Conseguir aclimatado

Lo primero que necesitará acostumbrarse a la hora es la pila. ¿Sabes que la vieja castaña acerca de las personas solo pudiendo mantener cinco (siete?) Cosas en su mente al mismo tiempo? Adelante lo pone a la prueba.

Última vez, señalé brevemente el comando .s (“Imprimir Stack”). En la edición de Hackaday, he vuelto a definir el Mecrisp convencional .S para ser un poco menos verboso, y a mis ojos mucho más legibles. Si te encuentras golpeando mucho. Y lo harás, también he escrito una función que (temporalmente) sobrescribe el “OK”. Pregunte al agregar una impresión de pila, siempre que presione ENTER. Escriba print.Stack y pulse ingrese una vez más tiempo para ver cómo funciona. Golpear el botón de reinicio, o el reinicio de tipificación borrará todo en RAM, y eso incluye el indicador de impresión de pila, por lo que volverá a una pizarra limpia.

Ahora es probablemente un buen momento para jugar con los operadores de pila. ¿Has leído el glosario MECRISP? Echa un vistazo a la lista de operaciones de malabares de pila allí. Encienda Print.Stack y juegue hasta que tengan sentido.

¿Ya tienes palabras? Escupe una lista vinculada de cada palabra que lo sabe, junto con las ubicaciones de memoria donde viven, y algunos detalles adicionales, demasiados detalles, a menos que estés depurando el sistema en sí. Hay una palabra adicional, no estándar, en Mecrisp que simplemente imprime los nombres de la función: Lista. Dale un tiro ahora. Si aún no ha definido algunas palabras, hágalo.

: HW. “Hola, mundo!” cr;
Es bueno tener a mano.

Capas en memoria

La memoria de Mecrisp-Stellaris se divide en dos ubicaciones brutas: RAM y Flash. Todas las palabras que se proporcionan antes de la marca “- Mecrisp-Stellaris Core -” están en RAM, y se perderán en restablecimiento o apagado. Se agregarán nuevas funciones de RAM al frente de la lista.

Después de la marca “- MECRISP-STELLARIS CORE -“, se presentan funciones en Flash. En las primeras partes de Flash, antes del “- Flash Dictionary -” es el MECRISP convencional de un núcleo. Desde allí hasta que “<>” se tomen palabras de la distribución MECRISP que normalmente son útiles, incluidas algunas funciones de depuración y multitarea. Los precedentes de “<>” son las contribuciones de las bibliotecas del embelllo, incluidas muchas definiciones de GPIO, y las anteriores “<>” se agregaron solo para esta serie POST.

Lo que no es evidente es que todos estos marcadores con paréntesis que los rodean son piedras angulares. Estos le permiten eliminar la ubicación de la memoria. Entonces, si ha agregado algunas funciones adicionales en Flash, y desea eliminar el estado predeterminado de Hackaday Edition, puede escribir << Hackaday-extras >>. Las funciones adicionales se borrarán, y el chip. (Tenga en cuenta que esto pierde lo que estaba en RAM!) El comando ERASEFLASH le devolverá al marcador “- Flash Dictionary -“.

Historia de sobrescribir

Si define una palabra dos veces con el mismo nombre, tendrá dos versiones de la palabra en el diccionario. Cuando se llama o compila una palabra, el intérprete mira a través de la memoria, desde la parte superior de la RAM hacia abajo, y luego desde el final de Flash vuelve al principio. Las palabras con el mismo nombre en RAM se llaman así antes de aquellos en Flash. Lo que puede ser particularmente extraño en adelante, porque se compila en tiempo real, la palabra que se menciona en cualquier palabra de llamada es la que estaba en la parte superior en el momento en que se definió la palabra llamada. Hacer historias enredadas es una forma segura de volverse loco.

: ¡Foo Foo!” ;
: Bar foo. “¡Bar!” ;
Bar foo! ¡bar! está bien.
: foo. “¡Bizzle!” ; Redefinir foo. está bien.
foo bizzle! está bien.
Bar foo! ¡bar! está bien.

Por otro lado, aquí hay una excelente manera de trabajar que aprovecha estas diversas características de memoria. RAM se borra en cada reinicio, lo que le da una pizarra limpia, pero al usar piedras angulares, el flash tampoco es inmutable. Por supuesto, más profundo en flash tienes que borrar,Cuanto más palabras tiene que redefinirse más tarde, suponiendo que algunos de ellos fueron útiles. Esto sugiere una técnica en capas para el desarrollo, con la mayoría de las palabras “principales” internas en Flash. Eso también es natural porque las palabras deben definirse para ser llamadas, por lo que definir lo básico primero tiene sentido de todos modos.

Puede compilar una nueva palabra a la RAM (el valor predeterminado) llamando a CompileToram o para parpadear invocando compiletoflash. Prototipe tus palabras en RAM. Siéntase complementario para sobresucharlos como muchas veces como desee, pero recuerde que tiene que redefinir cualquier palabra dependiente después de cambiar algo ascendente para mantener intacto el historial de llamadas. Una vez que estés hecho con un trozo de desarrollo, tipo de reinicio y RAM. Ahora redefine estas palabras en Flash. Si desarrolla su solicitud desde abajo, descubrirá que todo esto se cuelga muy bien. Cuando haya descubierto un error en algo que ya está escrito para flash, las piedras angulares vienen al rescate.

Finalmente, esta naturaleza en capas de las últimas definiciones puede ser realmente útil. Por ejemplo, una función que se define en Flash se ejecuta en cada reinicio. Incluye cosas como establecer la velocidad del procesador y la marca del sistema, que probablemente no quiera meterte. Debido a que puede sobrescribir el inicio, y cualquier compilación use las palabras disponibles en el momento de la compilación, puede simplemente captar su funcionalidad en Init:: init init. “Howdy!” Cr;. El primer “init” es el nombre de la nueva palabra, y el segundo está llamando al inicio preexistente y haciendo toda la configuración. El resto de la definición es tuyo para jugar. En reinicio, todo se llevará a cabo en la compra que se definió.

Comodidades de criatura

Escribo mucho código en un editor (VIM) y luego envíalo al chip para jugar. Muy específicamente, escribí un script llamado FULT_UPLOAD.SH que contiene lo siguiente:

[[$ 1]] && Término = $ 1 || Término = / dev / ttyusb0
Retraso = 0.2
Mientras se lee -R f; hacer eco “$ f”; echo “$ f”> $ plazo; dormir $ {retardo} s; hecho

Para enviar un archivo al puerto serie, y por lo tanto, a la FULT_UPLOAD.SH U VIP: Silent W! FURPLOAD.SH
INOREMAP U : Silent .W! FULT_UPLOAD.SH
NNOREMAP U: SILEENT W! FULT_UPLOAD.SH

Esta configuración me permite desarrollar y modificar las funciones en un editor que me gustan y luego los envíe casi rápidamente al final del sistema para probar. Mantengo abierto una ventana de terminal que siempre ha iniciado sesión en el último sistema, para que pueda disfrutar de las nuevas palabras, y luego comenzar a jugar con ellos de forma interactiva. Es bastante dulce.

El probador de células solares

Ahora a un verdadero ejemplo real que hará uso de todo lo anterior. Recientemente tomé la decisión de caracterizar un montón de pequeños paneles solares que tuve en mi cajón basura. Esto indica ajustar la carga en el panel y notando el voltaje generado por el panel y la corriente a través de la carga. Engancho dos multímetros y escribí algunos números, pero este es, sin duda, un trabajo para un microcontrolador.

Como está claro a partir de la imagen, esta es una pala rápida. El trozo más grande de cobre-clad tiene una resistencia de medición actual y un par de resistencias configuradas como un divisor de voltaje para bajar la tensión del panel a algo que el ADC de 3,3 V puede manejar.

Colgando que es el circuito de carga variable (plateado), que es totalmente subóptimo: un MOSFET disipa el calor al ser convirtiéndose en la mitad por un voltaje de PWM. La batería de 9 V y el optoisolador se sincronizaron para asegurarse de que una tensión lo suficientemente alta para abrir completamente el MOSFET, que quería mucho más de 3.3 V. Este horrible y funcional, el circuito de carga fue una adición posterior: la primera versión acaba de tener un Potenciómetro aquí, hasta que eso se fumó corriendo demasiado a través de él.

Los pushbutones se usan para iniciar y detener las grabaciones del dispositivo en el balcón sin tener que correr hacia atrás dentro. El procedimiento fue a cadena de cocodrilo en un panel nuevo y mantenga presionado el botón blanco mientras realizó grabaciones. El botón Negro PEQUEÑO se presiona una vez para demarcar los datos de una nueva celda. Los datos se remontan a mi computadora portátil sobre UART Serial a través de un enlace ESP8266 que ejecuta ESP-Link como un puente serial WiFi transparente, visto en la parte superior izquierda, ideal junto a las baterías de la computadora portátil reciclada. Pegamento caliente y cartón alrededor de la construcción de última generación.

A la hoja de datos!

Este tipo de creación de herramientas rápida y práctica está a donde se brilla. Las bibliotecas de Jeelabs ya tienen algunas funciones que simplifican la configuración de ADC, pero en realidad no funcionaron para mí, así que miré hacia la hoja de datos.El mínimo desnudo que se necesita para obtener el trabajo de ADC es activar los relojes periféricos de ADC, habilite la unidad ADC y luego seleccione el tiempo de muestreo de ADC. También podríamos querer ejecutar el procedimiento de calibración de ADC para asegurarse de que nuestras lecturas sean correctas. Este es todo el tipo de detalle de bajo nivel que tendría que hacer con cualquier microcontrolador, o apoyarse en una biblioteca que lo haga por usted.

Lectura de la hoja de datos, para encender el reloj del sistema ADC, debemos establecer el bit ADC1EN en el registro de memoria RCC-APB2ENR. Lo que. MECRISP-STELLARIS tiene algún código de soporte que lee estos valores de los archivos que son suministrados por el fabricante. Los he incluido en el directorio / registros / directorio. El archivo del mapa de memoria tuvo grandes mnemónicos para todos los registros, pero no estoy emocionado con la forma en que se manejan los nombres de los bits individuales. Eso es un yak para afeitarse en otro día, estoy tratando de hacer cosas.

Aquí está el conjunto de palabras ADC a nivel de bits con las que se me ocurrió:

\ Conectar
\ PB0 – AIN8 está conectado al voltaje del panel
\ PB1 – AIN9 está conectado a la resistencia al sentido actual

: adc.rcc-habilitar 9 bit rcc-apb2enr bis! ; \ set adc1en
: ADC.SET-ADON 0 BIT ADC1-CR2 BIS! ; \ Set Adon para habilitar ADC
: ADC.SET-CAL-BIT 2 BIT ADC1-CR2 BIS! ;

: adc.cal-hecho? 2 bits adc1-cr2 bit @ 0 =;
: adc.isdone? 1 bit adc1-sr bit @;

9 bits crea un número con el noveno juego de bits y todos los demás cero, y rcc-apb2enr bis! Establece el bit deseado en el registro de control de ADC correspondiente. En general, bastante opaco, pero también uno por uno con las instrucciones de la hoja de datos. El buen nombramiento de estas palabras de capa inferior hace que las cosas mejoran una capa. Por ejemplo, la palabra que es responsable de ejecutar una calibración (establecer un bit, espere hasta que se pueda leer a otro) relativamente legible :: adc.cal adc.set-cal-bit comienza adc.cal-listo? Hasta que ;.

Y aquí vemos nuestro primer control de flujo, el comienzo … hasta la construcción. La compra es extraña, ¿verdad? Comience a iniciar el bucle, la función de prueba ADC-CAL-HECHO? Ejecuta, dejando un valor verdadero o falso en la pila, y luego, hasta que lea este valor y los bucles para comenzar hasta que el valor sea verdadero. Esto es lo mismo que un C mientras (! ADC-CAL-HECHO ()) {;} bucle de espera ocupado. Y es una introducción a otro Idioma de fuera: ¿Usando? Por cualquier cosa que devuelva un booleano.

Prueba, arregla y prueba de nuevo

Así que vamos a probar estas palabras. La inicialización del ADC y la lectura es fácil: ahora vamos a llevarlos a correr y asegurarnos de que los valores sean lo que estamos esperando. Buffing Up Un accesorio de prueba rápido a otro es una de sus principales fortalezas. : Test-ADC comienza con ADC @. CR 10 MS KEY? Hasta que ; Define una palabra que lee el ADC, imprime el valor y repite cada diez milisegundos hasta que ingrese. Si hace esto con un panel solar bajo una luz fluorescente, por ejemplo, recogerá las ondulaciones de frecuencia de la red, ya que golpean su panel, lo que es algo que quizás no haya estado pensando. La capacidad de jugar con tus nuevas palabras tan pronto como las definas, hace que este tipo de investigación de codificación de investigación sea naturalmente.

Tiempo de la historia real. Cuando estaba escribiendo este código, había establecido un tiempo de muestra demasiado corto en las entradas de ADC. Esto hace que el valor de una lectura afecte a la siguiente, ya que el condensador interno de ADC no tiene tiempo para cargar o descargar completamente. Estaba recibiendo lecturas demasiado altas para la corriente cuando el voltaje era alto, y las lecturas demasiado bajas para la corriente cuando el voltaje era bajo. Depuré esto de manera bastante rápida escribiendo una rutina que lee cada canal varias veces seguidas e imprimí los valores y dejé esas palabras para la posteridad.

(Tome 8 muestras de cada una, para la depuración)
: Lea, ambos 8 0 do lectura-v. Loop 8 0 DO LEER-I. lazo ;
: ¡Readloop comience a leer, tanto CR 100 MS Key? Hasta que ;

Los comentarios de este ejercicio de prueba me llevan a cambiar los tiempos de muestra en el ADC a su valor máximo, porque nada aquí fue el tiempo vital y estaba usando una fuente de impedancia bastante alta. (El valor predeterminado es de muestra tan rápido como P

Leave A Comment

Recommended Posts