-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Varios fallos al crear procedimientos escritura de EEPROM interna #6
Comments
Por cierto, he actualizado la librería PIC16F84A.pas (https://pastebin.com/i3PMcNGs) con los nombres de bits de SFR que aparecen en el DataSheet de Microchip. Había alguna discrepancia, al igual que ocurre en distintos manuales en internet sobre PICs. Por eso, creo que lo mejor es tomar siempre los nombres facilitados por el fabricante. |
Hola Agustín. Con respecto al problema de tener que definir EECON1 y EECON2 en el banco 0, y el porqué el compilador no hace los cambios de banco, no veo el problema. Déjame revisarlo. Con respecto al error al usar la notación: EECON1,EECON1_WREN := 1; , para identificar a un campo de un byte. Por definición, PicPas, soporta solo: Y los únicos identificadores válidos para el tipo byte son: bit0, bit1, ... bit7. Si clao, también se puede usar 0, 1, .. 7, pero esto se mantiene solo por compatibilidad. Legalmente no se podrían usar números.
Y es lo que te comenté, con respecto a la sintaxis legal, de PicPas, para acceder a campos de un SFR. No está implementado por ahora, pero espero tenerlo pronto disponible, o al menos un acercamiento. |
Hola t-edson, el resultado de compilar este procedimiento:
Es este:
Ves que antes de la dirección $0015 debería de haber cambiado al banco 1 y sin embargo lo hace en la dirección $0017, y no se por qué vuelve a cambiar al banco 0 en la dirección $001B, lo cual es incorrecto ya que a partir de ahí existen tres instrucciones que que trabajan con registros del banco 1. Como digo, las instrucciones que cambiar los registros TRIS, también en el banco 1 funcionan perfectamente, probado incluso compilando código para 16F877A con los puertos C, D y E. |
Otra solución, mientras implantas el modo de definir bits en RECORD, puede ser esta:
Pero sería mucho mejor que se siguiera un solo criterio para llamar a los bits de los registros SFR. Ahora mismo, en las partes de programa escritas en ASM se definen como constantes (reciente implantado, lo que es muy de agradecer), y en las partes de código escritas en Pascal se definen como variables, y por lo tanto, es necesario darles otros nombres. Se puede dejar así, y funciona sin ningún problema, pero dobla es trabajo de crear librerías de registros para los distintos microcontroladores. De todos modos, la ventaja que le veo ahora mismo a PicPas es que ofrece distintos recursos para que si alguien sabe programar y entiende el código ensamblador casi siempre puede encontrar soluciones, pero entiendo que estas soluciones particulares para problemas concretos en cada programa pueden ser una barrera para quien tenga intención de empezar a usarlo o quiera simplemente aprender a programar microcontroladores PIC en lenguaje Pascal. Pero bueno, supongo que paso a paso se irán solucionando estos problemas normales cuando se afronta una labor tan compleja como programarse uno mismo su propio compilador. :) |
Efectivamente he comprobado que hay un "bug", en el manejo de bancos en PicPas. Hay una ligera corrección, que he hecho en esta misma versión 0.6.8 (tienes que actualziar de nuevo) y puede ayudar, pero el problema de fondo persiste y es un fallo en la asignación de bancos cuando se manejan procedimientos. Este tema es algo que estaré viendo en la siguiente versión, junto a otros pendientes. Mientras tanto te recomiendo que tengas cuidado cuando un procedimiento accede a variables de otros bancos. Puedes ayudarte de la función de sistema SetBank(), para fijar el banco de trabajo. |
Con respecto al problema que mencionas: " Ha sido necesario redefinir las variables EECON1 y EECON2 en direcciones del banco 0. Si se dejan las originales del banco 1 el código escrito en ensamblador falla." Quisiera que indiques, en qué sentido falla. ¿No compila? ¿No hace lo que debe hacer? |
Hola t-edson. Si compilo el siguiente código:
En el emulador Proteus no funciona la escritura en la memoria interna EEPROM. Pero si añado las dos siguientes línea para redefinir la posición de las variables EECON1 y EECON2.
En la simulación de Proteus funciona y escribe la memoria EEPROM interna del uC sin problemas. Existen compiladores en los que esto es normal, por lo que las librerías de SFR se definen todas en el banco 0, pero me parece que no es sería muy complicado poder utilizar las posiciones reales y que el compilador elimine los bits altos a partir de la dirección límite del banco 0. Por supuesto, en ensamblador el cambio de bancos es siempre labor del código ASM. |
Hola Agustín. Los fallos que mencionas deben estar ya corregidos en la nueva versión de PicPas, la 0.6.9, excepto el problema de acceso a los bits de un registro, usando constates, que como ya te indiqué, es un tema de sintaxis y no una falla. |
Perfecto! Ahora funciona sin ningún problema. Para el temas de las constantes, he actualizado la UNIT de los nombres de registro 16F84A.pas ( disponible en https://pastebin.com/4eRdCPzA ). Con ella, se evitan los problemas comentados, y por la forma de escribir el código en lenguaje Pascal y en Ensamblador, me parece incluso más coherente este uso de nombres de registros especiales y sus bits. Ahora compila y funciona a la perfección el código escrito de esta manera (usando la UNIT 16F84A.pas actualizada):
(Código disponible en https://pastebin.com/RzfpdyXU) A ver que te parece la UNIT actualizada con definiciones de bytes y bits del SFR válidos para su uso tanto en Pascal como en ASM y lo pudieras actualizar ya en la versión actual de PicPas. En cuanto a lo que comentas de selección de bancos en ASM, por supuesto, debe ser así. El programador debe decidir en que banco trabaja, y el compilador debe eliminar los bits altos de los registros SFR que están fuera del banco 0. Por las pruebas realizadas hasta ahora, todos los problemas comentado quedan solucionados o aclarados perfectamente, y Picpas sigue mejorando en cada actualización. Gracias. |
Me parece muy bien la forma como has actualizado las unidades, hasta mientras no se tenga una mejor sintaxis.
El ensamblador soporta ya desde la versión 0.6.7 referencias a variables bit y boolean. No sé si sea necesario definir adicionalmente la constante "bit_Z". |
En ese caso, mejor. Son temas que si en una ocasión no funcionan y encuentras un modo de solucionarlas ya sigues metódicamente haciéndolas de la forma en que te funcionó. Acabo de probarlo con el siguiente procedimiento dejando en forma de comentarios las lineas de código actualizada. Supongo que me dio problemas en alguna versión previa a la 0.6.7, pero ahora reconoce perfectamente las variables tipo bit en el código ASM.
Estoy de acuerdo en que se pueden eliminar las constantes tipo bit_XXX y llamar a los bits del SFR del mismo modo en el código Pascal y ASM. |
En esta prueba realizado con la versión 0.6.8 he conseguido escribir la EEPROM interna del microcontrolador PIC16F84A. En el siguiente código podemos ver los procedimientos empleados, ambos son equivalentes, pero uno está escrito en código ensamblador y el otro en Pascal.
Aunque ambos procedimiento graban la EEPROM perfectamente, ha sido necesario hacer ciertas correcciones para que funcione que no deberían haber sido necesarias. Estas correcciones evitar fallos del compilador y permiten generar un código que funciona correctamente.
Los fallos detectados son:
The text was updated successfully, but these errors were encountered: