TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Daveliu_147 en 24 de Julio de 2017, 05:06:07
-
Buenos días. Antes de nada, dejar claro que soy muy novato en todo esto, apenas he hecho unas cuantas prácticas para una asignatura de universidad, y ahora estoy empezando a dar interrupciones. Es por esto que pido disculpas de antemano por la ignorancia.
En esta asignatura utilizamos la placa P16F876A y programamos con MPLAB IDE v8.92.
Este es el programa que tenemos hecho mi compañero y yo:
(http://www.todopic.com.ar/foros/imgtiny/2n04ief.jpg)
El propósito del programa es una cuenta atrás de 9 a 0 que se muestre en unos LEDs conectados al PUERTOC. La cuenta atrás funciona a base de interrupciones en el Timer0. Esa cuenta atrás sólo empezará una vez se haya pulsado un botón conectado a RB0. A lo largo del programa utilizamos direccionamiento indirecto.
En principio hemos probado a utilizar el "Stimulus Workbook" pero aunque RB0 está a 1 no ocurre la interrupción y el programa se queda todo el tiempo en el main.
(http://www.todopic.com.ar/foros/imgtiny/25ujkux.png)
En principio está correcto según comparamos con otros que, sabemos, están bien. Lo único es que no sabemos como hacer la simulación bien.
Hemos estado echando un vistazo y nada...estaría genial que alguien de por aquí pudiera ayudarnos. Tengo entendido según veo que por aquí muchos entienden del tema.
Muchas gracias de antemano
Un saludo
-
Buenos días. Antes de nada, dejar claro que soy muy novato en todo esto, apenas he hecho unas cuantas prácticas para una asignatura de universidad, y ahora estoy empezando a dar interrupciones. Es por esto que pido disculpas de antemano por la ignorancia.
Si estas dando clases o cursando una universidad, me voy a permitir ser un poco mas estricto. Espero que no sea de tu desagrado.
-----------------------------------
Sobre el programa:
- Quitar el ORG 0x5, es una mala practica, en otros PICs se exige que la direccion sea par por ejemplo y llevar esta mala practica no ayuda en nada, si uno quita ese ORG el compilador solo va a ponerlo en la direccion siguiente, por lo cual no cumple ningun cometido
- ¿Por que definir con EQU todos los registros y luego escribir la direccion en hexadecimal? Es como que directamente tiraste lo que hiciste con los EQU o CBLOCK
- Si tu idea es de tener los valores para un 7 segmento por ejemplo, me refiero a datos que no se van a modificar, entonces te digo que de la forma que lo realizaste esta mal, estas ocupando 10 direcciones de RAM cuando podrias utilizar ninguna, y usar una tabla, dependiendo del PIC lo vas a hacer con RETLW o poniendolo en datos y leyendolo como pueda leer la flash.
- Las interrupciones tienen un problema, y es que comparten los registros STATUS,W,PCLATH que si conoces como es que funciona una interrupcion, es decir deja el programa principal y luego vuelve, uno quisiera que esos registros tuvieran el mismo valor que cuando se fue a la interrupcion, si buscas en el datasheet W_TEMP seguramente Microchip te ofrece un codigo de entrada y salida de la interrupcion, entonces entra al vector de interrupcion de alli salta a ese codigo de entrada, luego haces lo que queres y para salir saltas al codigo de salida de interrupcion.
En este codigo no hay problema porque no tenes nada en el MAIN, pero mejor acostumbrarse a usarlo y entender porque esta ese codigo.
- Por ahi es mejor para quien le des clase que usen BANKSEL en ves de modificar los bits RPx, si cambias de PIC y usas BANKSEL el compilador solo cambia el BANKSEL por las instrucciones correctas, es decir si pones BANKSEL PORTA , el compilador va a generar las instrucciones de BSF/BCF sobre los bits RPx para ponerlo en el banco 0.
- El GOTO CUENTA no tiene sentido, si Cuenta esta donde sigue, la etiqueta no ocupa lugar, Ahora si moves la subrutina CUENTA a otra parte entonces si, Pero si esta seguido el linker va a solo ponerlo seguido.
- Cuando actives la interrupcion del RB0, limpia el flag antes sino mientras se cuenta y presionas el boton va a volver a entrar apenas termine.
------------------------------------------------
Respecto a la simulacion creo que estas haciendo lo mismo que hago yo, es decir darle un impulso cambiando el valor de RB0, en MPLAB X suelo poner el flag a 1 cuando quiero que entre a la misma si son pocas veces (Es mas rapido que configurar el Stimulus)
---------------------------------------------------
Como extra, si queres copiar un codigo, lo copias y pegas, lo seleccionas y luego tenes una lista que dice "Codigo" en el editor del foro, ahi seleccionas ASM, ejemplo:
-
Buenos días. Antes de nada, dejar claro que soy muy novato en todo esto, apenas he hecho unas cuantas prácticas para una asignatura de universidad, y ahora estoy empezando a dar interrupciones. Es por esto que pido disculpas de antemano por la ignorancia.
Si estas dando clases o cursando una universidad, me voy a permitir ser un poco mas estricto. Espero que no sea de tu desagrado.
-----------------------------------
Sobre el programa:
- Quitar el ORG 0x5, es una mala practica, en otros PICs se exige que la direccion sea par por ejemplo y llevar esta mala practica no ayuda en nada, si uno quita ese ORG el compilador solo va a ponerlo en la direccion siguiente, por lo cual no cumple ningun cometido
- ¿Por que definir con EQU todos los registros y luego escribir la direccion en hexadecimal? Es como que directamente tiraste lo que hiciste con los EQU o CBLOCK
- Si tu idea es de tener los valores para un 7 segmento por ejemplo, me refiero a datos que no se van a modificar, entonces te digo que de la forma que lo realizaste esta mal, estas ocupando 10 direcciones de RAM cuando podrias utilizar ninguna, y usar una tabla, dependiendo del PIC lo vas a hacer con RETLW o poniendolo en datos y leyendolo como pueda leer la flash.
- Las interrupciones tienen un problema, y es que comparten los registros STATUS,W,PCLATH que si conoces como es que funciona una interrupcion, es decir deja el programa principal y luego vuelve, uno quisiera que esos registros tuvieran el mismo valor que cuando se fue a la interrupcion, si buscas en el datasheet W_TEMP seguramente Microchip te ofrece un codigo de entrada y salida de la interrupcion, entonces entra al vector de interrupcion de alli salta a ese codigo de entrada, luego haces lo que queres y para salir saltas al codigo de salida de interrupcion.
En este codigo no hay problema porque no tenes nada en el MAIN, pero mejor acostumbrarse a usarlo y entender porque esta ese codigo.
- Por ahi es mejor para quien le des clase que usen BANKSEL en ves de modificar los bits RPx, si cambias de PIC y usas BANKSEL el compilador solo cambia el BANKSEL por las instrucciones correctas, es decir si pones BANKSEL PORTA , el compilador va a generar las instrucciones de BSF/BCF sobre los bits RPx para ponerlo en el banco 0.
- El GOTO CUENTA no tiene sentido, si Cuenta esta donde sigue, la etiqueta no ocupa lugar, Ahora si moves la subrutina CUENTA a otra parte entonces si, Pero si esta seguido el linker va a solo ponerlo seguido.
- Cuando actives la interrupcion del RB0, limpia el flag antes sino mientras se cuenta y presionas el boton va a volver a entrar apenas termine.
------------------------------------------------
Respecto a la simulacion creo que estas haciendo lo mismo que hago yo, es decir darle un impulso cambiando el valor de RB0, en MPLAB X suelo poner el flag a 1 cuando quiero que entre a la misma si son pocas veces (Es mas rapido que configurar el Stimulus)
---------------------------------------------------
Como extra, si queres copiar un codigo, lo copias y pegas, lo seleccionas y luego tenes una lista que dice "Codigo" en el editor del foro, ahi seleccionas ASM, ejemplo:
Woww!!! Que crack!!