ENCICLOPEDIA DE RADIOELECTRÓNICA E INGENIERÍA ELÉCTRICA Programación modular de sistemas de control en MCS48. Enciclopedia de radioelectrónica e ingeniería eléctrica. Enciclopedia de radioelectrónica e ingeniería eléctrica. / Microcontroladores Se sabe que el mismo microcontrolador puede controlar tanto equipos tecnológicos complejos como un molinillo de café doméstico o un reloj electrónico. La adaptación a un objeto específico se lleva a cabo cambiando el programa del microcontrolador, el hardware casi no se ve afectado. El artículo propuesto está dedicado a las técnicas de programación de los microcontroladores de la serie MCS48, que son ampliamente utilizados en los sistemas de control para diversos fines. Sus principales disposiciones también son válidas para dispositivos más modernos. El desarrollo y la modernización de los programas de control se facilitan mucho si se construyen de acuerdo con un principio modular. En este caso, después de ganar algo de experiencia, y lo más importante, nuestra propia biblioteca de módulos depurados, programar un nuevo sistema de control (SC) se reduce a reemplazar algunos módulos de un programa ya existente y depurado y, posiblemente, complementarlo con fragmentos que tener en cuenta las características específicas de un sistema en particular. Este principio está incrustado en la estructura de muchos lenguajes de alto nivel (PASCAL, C++), y el programador está literalmente obligado a seguirlo. Desafortunadamente, los ENSAMBLADORES (incluso para MSS48), si bien le dan al programador una mayor libertad de elección de medios y métodos para resolver problemas, por regla general, no controlan en absoluto la observancia de la disciplina de programación. Esto a menudo conduce a la creación de programas tan confusos que incluso sus autores no pueden averiguar qué se hizo después de un tiempo, sin mencionar el uso de fragmentos depurados en otros programas. La adhesión consciente a conceptos modulares comunes facilita y acelera enormemente la programación de microcontroladores. En la tabla se muestra un ejemplo de un programa modular típico para CS. Su sintaxis corresponde al ASSEMBLY tabular TASM para el microprocesador 8048. Como puede ver, al comienzo del texto del programa, las directivas EQU dan nombres a las constantes y asignan valores. Siempre es preferible usar constantes con nombre que especificar valores numéricos directamente en las instrucciones del procesador ejecutable. Por ejemplo, el retardo de tiempo implementado por una de las subrutinas discutidas a continuación está definido por tres números. Están dados por las constantes N1, N2 y N3. Si necesita cambiar la velocidad de obturación, basta con especificar nuevos valores en los operadores EQU. De lo contrario, habría que buscar en todo el programa instrucciones con operandos iguales a estos números, decidir si cada uno de ellos se refiere a un retraso de tiempo e indicar nuevos valores en los casos necesarios. Obviamente, dicho trabajo requiere mucho tiempo y, a menudo, no está exento de errores. Es especialmente complicado por el hecho de que algunos comandos pueden no usar el número entero, sino, por ejemplo, su byte alto o bajo. ASSEMBER ya en la etapa de traducción del programa es capaz de calcular algunas constantes en base a los valores de otras. Esta posibilidad se ilustra mediante el cálculo de los bytes alto (N3N) y bajo (N3L) del número NXNUMX. A continuación, el programa asigna memoria para las variables. Lo hacen con las mismas directivas EQU, pero a diferencia de las descripciones de constantes, no especifican los valores numéricos de las variables, sino las direcciones de las celdas de memoria que ocupan. Si el ENSAMBLADOR lo permite, no se debe descartar la posibilidad de utilizar macros. Cada uno de ellos es, por así decirlo, una nueva instrucción que realiza una operación no proporcionada directamente por el sistema de instrucciones del procesador. Al describir una instrucción macro, el programador le da un nombre (que, por supuesto, no coincide con el nombre de ninguna de las instrucciones "reales") y especifica las acciones requeridas en forma de Secuencia de instrucciones de máquina. Cada vez que encuentra una instrucción macro en un programa, el ENSAMBLADOR la reemplazará con la secuencia especificada. En este ejemplo, se utilizan dos macros. Uno de ellos transfiere el contenido del acumulador a la celda de memoria de datos especificada por el parámetro macro, y el otro, de regreso. Después de que se enciende la alimentación (o se da una señal de reinicio), el microcontrolador comienza a ejecutar el programa desde la dirección cero. Esta dirección generalmente se usa para escribir un comando de salto incondicional al punto de inicio del programa real (en este caso, la etiqueta INICIO). Esto es necesario porque las interrupciones de hardware siempre transfieren el control a las direcciones fijas 3 y 7 (para otros tipos de microcontroladores, las direcciones pueden ser diferentes, pero todavía están ubicadas al comienzo de la memoria del programa). Los comandos de transición incondicional a las rutinas de servicio de las interrupciones correspondientes ubicadas en estas direcciones deben ser "puenteadas" por el programa principal. El siguiente paso es configurar los modos de operación del controlador (por ejemplo, seleccionar registros y bancos de memoria), inicializar variables y dispositivos externos. Un error típico de los programadores novatos es suponer que inmediatamente después de iniciar el programa, las variables ya tienen algunos valores definidos. Este concepto erróneo se ve reforzado por el hecho de que algunos lenguajes de alto nivel (como BASIC) establecen automáticamente todas las variables en un valor inicial de cero. En los programas en lenguaje ensamblador (y muchos otros lenguajes), el propio programador debe cuidar que antes de la primera lectura del valor de una variable, ya se haya escrito algo en la celda de memoria asignada a ella. Un buen estilo de programación requiere que los valores iniciales se asignen a las variables al comienzo del programa. En este caso, esto lo hace la subrutina 1INIT. La sección de inicialización de dispositivos externos generalmente parece una llamada alternativa a las subrutinas, cada una de las cuales restablece una de ellas (convertidor analógico a digital, indicador LED, teclado, etc.) y puede reemplazarse fácilmente al finalizar y mejorar el sistema. A menudo, estas mismas rutinas comprueban el estado de los dispositivos. A continuación, la mayoría de los programas de control ingresan a un ciclo principal que se repite sin fin, cuya ejecución se suspende solo para manejar las interrupciones. El ciclo consta de subrutinas para sondear el teclado y otros sensores, verificar las banderas establecidas por las subrutinas de manejo de interrupciones (por ejemplo, la bandera para el vencimiento de un intervalo de tiempo específico o el final del convertidor de analógico a digital), procesamiento la información recibida de acuerdo con el algoritmo de control especificado, enviando acciones de control a los actuadores, mostrando información sobre el estado del proceso tecnológico en una pantalla de cristal líquido u otros indicadores. La salida del bucle principal generalmente se proporciona solo en situaciones de emergencia, por ejemplo, si para eliminar las consecuencias de una falla, es necesario repetir la inicialización de todas las variables y dispositivos externos, así como cuando se interrumpe el procesamiento. Así, un programa construido sobre una base modular es un conjunto de subrutinas. Si, por ejemplo, se utiliza un teclado diferente en el nuevo sistema de control, será suficiente reemplazar la subrutina BUTT. Para que dicho reemplazo sea simple e indoloro, se deben desarrollar y observar ciertas reglas. Las subrutinas, si es posible, deben guardar el contenido de todos los registros del controlador, recibir datos iniciales y emitir resultados en los mismos registros y celdas de memoria, usar la misma codificación de caracteres, etc. Es necesario luchar contra el deseo natural (especialmente para los programadores que han superado las primeras dificultades y comienzan a sentirse profesionales) de simplificar el programa alejándose de las reglas estrictas y utilizando técnicas no estándar. Aparentemente, a primera vista, la complicación injustificada valdrá la pena al facilitar la depuración y la reelaboración del programa en su conjunto. Consideremos algunas características de las subrutinas. I NCREM y DESREM realizan lo requerido en muchos casos, la operación de aumentar o disminuir en un valor dado de un número binario de 16 bits (sus bytes altos y bajos están respectivamente en los registros R6 y R5). Las constantes que especifican la cantidad de incremento se describen al principio del programa. Dado que cualquier microcontrolador funciona mucho más rápido que los equipos tecnológicos, es muy importante poder organizar el tiempo de retardo en el programa. En este caso, se utiliza el contador/temporizador interno del procesador. Tiene capacidad limitada y se desborda en milisegundos. Cada desbordamiento genera una solicitud de interrupción. La rutina de servicio de interrupción del temporizador (TIME) los cuenta y, cuando se alcanza el número especificado, establece el indicador de tiempo de espera FLT en uno. Todas las subrutinas cuyo trabajo depende del tiempo, queda por analizar el estado de esta bandera. Por lo tanto, es posible realizar velocidades de obturación de varios segundos e incluso minutos. Para comenzar a contar un nuevo intervalo, es necesario ingresar los valores iniciales en las celdas de trabajo de la subrutina TIME y encender el temporizador. La subrutina SET2M, por ejemplo, establece el tiempo de retardo en 2 minutos. El cálculo de los valores iniciales tiene varias sutilezas. Se sabe que en los microcontroladores de la serie MSS48, los pulsos llegan a la entrada del contador/temporizador interno a una frecuencia 480 veces menor que la frecuencia del oscilador de cuarzo. Por ejemplo, con un resonador de cuarzo de 7 MHz de frecuencia, el número escrito en el contador cambia cada 480/7000000 = 0,00006857 s = 68,57 µs. Entonces, el contador se desbordará (y generará una solicitud de interrupción) en 68,57 -(256-N1) µs, donde N1 es el número escrito originalmente en el contador. Si cada vez que inicia un nuevo conteo a partir de este número, N0,1 = 2 0,1/[7000000 (1480-N256)] se producirán desbordamientos en 1 s (retardo de tiempo mínimo). Obviamente, se puede obtener el mismo retardo de tiempo con diferentes N1 y N2, pero dado que estos números no pueden ser fraccionarios, se implementará con algún error. La tarea es seleccionar un par de valores para los cuales el error sea mínimo. En el caso considerado, la mejor opción es N1 = 13, N2 = 6. Se obtiene un retardo de tiempo de 2 min repitiendo el procedimiento descrito N3 = 1200 veces. A menudo es necesario usar diferentes procedimientos para procesar las mismas interrupciones de hardware en diferentes modos de operación del programa. Una forma de hacer esto es ilustrada por la subrutina INTER. Analiza el código de tipo de interrupción ingresado por el programa principal en la celda INTT y, según su valor, llama a una de las rutinas de servicio de interrupción ISR1 o ISR2. Tenga en cuenta que ambos terminan con RET, no RETR. Es fácil aumentar el número de opciones de procesamiento e incluso hacer que, para un determinado valor del código, se llamen varias subrutinas diferentes una tras otra. No es necesario escribir todas las subrutinas necesarias en el archivo de texto del programa principal. Los módulos depurados y utilizados repetidamente en diferentes programas se pueden ubicar en archivos separados y conectarse al programa principal mediante las directivas INCLUDE. Cada archivo de inclusión puede contener una o más rutinas. La desventaja de este método es que los nombres de variables, constantes y etiquetas en todos los módulos utilizados no deben repetirse. Privado de este defecto, el método de traducción separada de módulos con su posterior fusión a nivel del código objeto, desafortunadamente, no es compatible con TASM ASSEMBLY. Autor: D. Ryzhov, Vladímir Ver otros artículos sección Microcontroladores. Lee y escribe útil comentarios sobre este artículo. Últimas noticias de ciencia y tecnología, nueva electrónica: Cuero artificial para emulación táctil.
15.04.2024 Arena para gatos Petgugu Global
15.04.2024 El atractivo de los hombres cariñosos.
14.04.2024
Otras noticias interesantes: ▪ Células sexuales cultivadas a partir de células madre ▪ Se ha creado una célula nerviosa artificial ▪ Lenovo es el mayor fabricante de portátiles ▪ El parque eólico flotante más grande que se construirá Feed de noticias de ciencia y tecnología, nueva electrónica
Materiales interesantes de la Biblioteca Técnica Libre: ▪ sección del sitio Consejos para radioaficionados. Selección de artículos ▪ artículo Lista de términos OBZhD y GO. Conceptos básicos de una vida segura ▪ artículo ¿Cuándo se pusieron burros y científicos en el medio? Respuesta detallada ▪ Artículo de Freucinetius. Leyendas, cultivo, métodos de aplicación. ▪ artículo LED domésticos. Enciclopedia de radioelectrónica e ingeniería eléctrica.
Deja tu comentario en este artículo: Todos los idiomas de esta página Hogar | Biblioteca | Artículos | Mapa del sitio | Revisiones del sitio www.diagrama.com.ua |