TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: headbreacker en 22 de Septiembre de 2006, 13:47:29
-
quiero saber qeu sucede cuando se esta ejecutando una rutina de interrupcion correspondiente al INT1 y a media ejecucion cae una interrupcion en INT0 con el sistema de prioridades activado.
yo lo simule pero me di cuenta que cuando retorna de la rutina de INT0 y continua en con la INT1 terminandola el retfie no pone en 1 en bit correspondiente por lo cual queda deshabilitado para una siguiente interrupcion
-
quiero saber qeu sucede cuando se esta ejecutando una rutina de interrupcion correspondiente al INT1 y a media ejecucion cae una interrupcion en INT0 con el sistema de prioridades activado.
yo lo simule pero me di cuenta que cuando retorna de la rutina de INT0 y continua en con la INT1 terminandola el retfie no pone en 1 en bit correspondiente por lo cual queda deshabilitado para una siguiente interrupcion
1) De qué interrupciones estas hablando puntualmente
2) En qué estas codificando (Assembler, CCS, C18, etc)
-
estoy utilizando ensamblador
y estoy utilizando dos interrupciones externas INT0 e INT1 pero el problema es que cuando la interrupccion de mayor prioridad se ejecuta mientras se atiende la de menor prioridad, la de menor prioridad(INT1) queda deshabilitada para subsiguientes ejecuciones solo quedando habilitada la de mayor prioridad(INT0)
-
seria bueno que copiaras las partes importantes del programa, te podriamos ayudar mejor
saludos
-
estoy utilizando ensamblador
y estoy utilizando dos interrupciones externas INT0 e INT1 pero el problema es que cuando la interrupccion de mayor prioridad se ejecuta mientras se atiende la de menor prioridad, la de menor prioridad(INT1) queda deshabilitada para subsiguientes ejecuciones solo quedando habilitada la de mayor prioridad(INT0)
heabreaker esto es algo normal, es así como funcionan los PICs
Fíjate lo siguiente:
Si estas en la rutina LOW y te ocurre una rutina HIGH, el vector de interrupción irá a 0x0008. Bien, ahi tu atiendes tu interrupción HIGH.
Las llamadas a los vectores de interrupción son "calls automáticos", para volver de ellos debes hacer un "return".
En el caso específico de las interrupciones debes hacer un "retfie" o "Return from interrupt".
Esto te habilita nuevamente las interrupciones. El tema es que como "también" estabas en el vector LOW no se habilitará pero debiera volver a él. Es decir terminar de hacer lo que hacía ahí y en ese punto vuelves a hacer otro "retfie" con lo cual el código volverá al su flujo normal con ambos GIEH y GIEL habilitados.
Espero lo hayas comprendido. Esto sirve para "explicar" como funcionan las interrupciones.
Ahora bien, si modificas nuevamente tu código de acuerdo a lo que te acabo de comentar y aún así no te anda, debieras subir tu código como lo sugirió GustavoT.
Saludos
-
ok lo tendre presente!!!!!!!!!!!!!!
-
eso lo entiendo,hago ese retfie en la rutina LOW pero cuando la ejecuta despues de haber retornado de la rutina HIGH este retfie no habilita el GIEL provocando que no se ejecute otra vez la rutina LOW, quedando solo habilitada la interrupcion HIGH por lo menos eso es lo que me demuestra el simulador pic18 simulator
-
eso lo entiendo,hago ese retfie en la rutina LOW pero cuando la ejecuta despues de haber retornado de la rutina HIGH este retfie no habilita el GIEL provocando que no se ejecute otra vez la rutina LOW, quedando solo habilitada la interrupcion HIGH por lo menos eso es lo que me demuestra el simulador pic18 simulator
¿Podes subir tu código en un archivo .zip?
Saludos
-
aqui esta el correspondiente a las rutinas de interrupcion
recepcion_ISR:
movwf W_TEMP,ACCESS ;Push W
movff STATUS,STATUS_TEMP
movf LATE,W,ACCESS
movwf tmp_late,ACCESS
bsf enb6
bcf enb3
movf PORTC,W,ACCESS ;Leer latch de salida y guardarlo en W
movwf POSTINC0,ACCESS
bsf enb3 ;DESHABILITACION DE transceiver recepcion
movf W_TEMP,W,ACCESS
movff STATUS_TEMP,STATUS
movf tmp_late,W,ACCESS
movwf LATE,ACCESS
bcf INTCON,INT0IF,ACCESS ;Limpiar bandera para poder habilitar la interrupcion
retfie
transmision_ISR:
movwf W_TEMP,ACCESS ;Push W
movff STATUS,STATUS_TEMP
movf LATE,W,ACCESS
movwf tmp_late1,ACCESS
bsf enb3
bcf enb6
movf PORTC,W,ACCESS ;Leer latch de salida y guardarlo en W
movwf POSTINC1,ACCESS
movf W_TEMP,W,ACCESS
movff STATUS_TEMP,STATUS
movf tmp_late1,W,ACCESS
movwf LATE,ACCESS
bcf INTCON3,INT1IF,ACCESS ;Limpiar bandera para poder habilitar la interrupcion
retfie
el programa solo simplemente debe de recoger un dato en el puerto c cuando este reciba un pulso en INT0 o INT1 pero el asunto es que es bastante probable que mientras este procesando un dato provocado por la int1 ocurra una interrupcion en INT0 causando el problema que les mencionaba