Problema con Stack Overflow

A ver si alguien me puede ayudar. Mirad, tengo un programa principal que se dedica a otros menesteres, al activar un pulsador se genera una interrupción que deja en suspenso el programa principal y acude a otro que me genera una señal de 40Khz en el pin RB0. Pues bien, ese programa que me genera la señal lo tengo en un "INCLUDE" .INC y al compilarlo me da problemas, os dejo el .INC para que me digais donde está el fallo.



PD: le he cambiado la extensión de .INC a .TXT para poder subirlo.
 

Adjuntos

  • 40_Khz.txt
    2.6 KB · Visitas: 12
Que problemas te genera?
Con que programa lo compilas?


Resuelto el fallo al compilar (USO EL MPASWIN 5.2), pero ahora no me funciona. El programa debiera hacer lo siguiente:

- Muestra el número 8 en display si no se activa el interruptor de puerta RB0
- Si se activa el interruptor se genera una interrupción (valga la redundancia)
se borra el número 8 y se genera una señal de 40Khz en patita RB1 la cual es audible en un buzzer.
- Se chequea el estado de PORTB,0 para ver si se puede salir de la interrupción.
- Si abrimos el interruptor finaliza la interrupción y vuelve el 8 al display.

He denominado al archivo 2_interrupciones porque simultaneamente se producen dos interrupciones, una por activación de RB0 y otra por desbordamiento del TMR0 para generar los 40Khz.

Me da fallo, os dejo el archivo de PROTEUS y los .HEX .INC y .asm para ver si me podeis ayudar.
 

Adjuntos

  • 2_INTERRUPCIONES.zip
    32.1 KB · Visitas: 7
En el archivo .INC cambias la configuracion TRISB como salidas

cuarenta_khz bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerto B salidas menos RB0 entrada.
movlw b'00000001' ;Prescaler on, reloj interno, divide por 4(01)8(010)16(011)
movwf OPTION_REG
bcf STATUS,RP0 ;Selecciona banco 0

No te aconsejo tener una interrupcion dentro de otra, si es aconsejable el preguntar cual es el motivo de la interrupcion y trabajar sobre ella

Para generar el tono no te hace falta tener interrupcion sobre el TMR0, solamente tienes que preguntar en el programa si ya se ha desbordado junto con el estado de la puerta

No tienes ningun registro con el nombre CARGA_TONO sinembargo aparece esta instruccion
movwf CARGA_TONO
 
Última edición:
Como bien te dice se esta desbordando la pila y te da ese mensaje
Yo quitaria la interrupcion por TMR0, ya que llegar al desbordamiento e iniciar una nueva interrupcion produciendo el llenado de la pila y tambien cargando de nuevo los registros donde guardas W y STATUS
 
Igual te ha defraudado un poco el tema que propuse?
Es bastante dificultoso el hacer dos interrupciones en una,tal y como propones. Pero realmente solo hay una manera de generar la interrupcion, puesto que si no tienes GIE, que es la interrupcion general activada, no ocurrira ninguna interrupcion y la interrupcion general siempre empieza en el vector de programa 0x04
Despues de ocurrir la interrupcion general, se debe preguntar ¿cual fue el motivo de ella?, y tratar el evento desarrollando el concepto que quieras dar
 
Atrás
Arriba