Estoy tratando de escribir un código para pic16f877 traduciendo un algoritmo simple en código ensamblador.
El conjunto de instrucciones no tiene tal instrucción.
Esto es lo que escribí:
MOVF 0X40,W
MOVWF 0X50
SUBWF 0X41,W
BTFSS Status,C
GOTO label
MOVF 0X41 ,W
MOVWF 0X50
label END
Mi pregunta es: ¿hay alguna manera de "finalizar" un algoritmo al programar un microcontrolador usando código ensamblador?
Deténgase y realmente piense en ello.
¿Qué quiere que haga el microcontrolador después de que esté hecho con la poca lógica que muestra? Seguro que hay algo . ¿Debería volver a realizar la operación? ¿Debería volver a alguna tarea más grande? ¿Debería esperar a que suceda algo externo y luego volver a hacerlo? Incluso si se supone que no debe hacer "nada" hasta que se desconecte la energía, en realidad es algo que tiene que decirle que haga.
El punto es que no hay un "final". No tiene sentido. Todo requiere alguna acción. Incluso apagarse a sí mismo a través de algún interruptor externo requiere activar ese interruptor.
En un tema aparte, los diagramas de flujo realmente deberían indicar la lógica del siguiente nivel, no los detalles de cómo el procesador realizará esa lógica. Está especificando detalles sobre cosas como el registro W en su diagrama de flujo. En cambio, debería mostrar algo así como un bloque de comparación entre A y B (o lo que sea), luego dos o más opciones para tomar dependiendo del resultado. Cuando codifica esto en ensamblaje, descubre las instrucciones reales para realizar la lógica de nivel superior descrita por el diagrama de flujo.
También es malo referirse a las variables por sus direcciones. Refiérase a la variable simbólicamente, luego deje que el enlazador decida dónde pegarlos en la memoria. Eso realmente no es de su incumbencia, aparte quizás del banco en el que deberían estar. Su diagrama de flujo se refiere a tres variables diferentes a las 40h, 41h y 50h. Déles nombres y use los nombres en el diagrama de flujo. Los buenos nombres también ayudan a iluminar la lógica. Incluso cuando codifica esto en ensamblador, todavía da nombres a las variables y se refiere a ellas por nombres en el código.
Solo para que quede claro: en el código de ensamblaje de microcontroladores generalmente no hay un final. Ciertamente no hay una instrucción final. No hay un sistema operativo al que devolver el control, y no hay forma de "detenerse".
El código del microcontrolador casi siempre contiene un bucle infinito.
Cuando trabajas con un µC, tienes que hacer un bucle infinito al final de tu código. De lo contrario, no controlará lo que hará el µC. Si olvida dicho bucle, el µC lo activará y bloqueará la ejecución del programa. (llamado ISR_TRAP en MSP430 de TI)
En C, básicamente terminará su código con algo como while(1)
o for(;;)
. Al hacerlo, el procesador realizará alguna tarea inactiva para que permanezca activo y consciente de la interrupción.
Lo mismo para el ensamblaje, debe hacer que su código se repita para que permanezca activo.
loop:
jmp loop
M. Ferru
colin
A.Bujari
AndrejaKo
A.Bujari
Dmitri Grigoriev
GOTO END
?A.Bujari
Dmitri Grigoriev
END
A.Bujari
Chu
pastel de perro malvado
SLEEP
instrucción (consulte la sección 14 de la hoja de datos). Sería diferente en un microcontrolador diferente, pero eso detendrá el que está usando.