Autor Tema: Cómo simular interrupciones con RB0 en Mplab  (Leído 3905 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daveliu_147

  • PIC10
  • *
  • Mensajes: 1
Cómo simular interrupciones con RB0 en Mplab
« 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:



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.



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








Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cómo simular interrupciones con RB0 en Mplab
« Respuesta #1 en: 24 de Julio de 2017, 09:47:52 »
Citar
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:

Código: ASM
  1. MAIN
  2.        GOTO MAIN

Desconectado Arenado98

  • PIC10
  • *
  • Mensajes: 4
Re:Cómo simular interrupciones con RB0 en Mplab
« Respuesta #2 en: 05 de Octubre de 2017, 15:05:53 »
Citar
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:

Código: ASM
  1. MAIN
  2.        GOTO MAIN

Woww!!! Que crack!!


 

anything