TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Nash7 en 18 de Julio de 2005, 06:13:00
-
He hecho un programilla bastante cutrecillo para ver que tal van las interrupciones de cambio de estado en los pines RB 4 - 7. Sencillamente tiene que encender y apagar un LED y cuando se meta en la interrupción, encender otro... El problema es que Siempre me está saltando la interrupción y no se mete en el programa principal, en cambio si hago el mismo programa para el pin RB0 configurando la interrupción como externa pues va todo bien...
¿alguien sabe que puedo estar haciendo mal?, los pulsadores que hacen la interrupción están con sus condensadores de 0,1uF... Son muy sensibles dichas interrupciones?
Gracias
-
Dentro de la interrupción ponle un retardo de unos 30 milisegundos antes de salir de esta -delay_ms(30);- Y comenta que tal. Seguramente te sobre hasta el condensador ... Creo que por soft es mas eficiente que con un condensador.
-
Ya tengo puesto el delay y me sigue entrando la interrupcion, de hecho por si acaso habia algun problema de oscilaciones le he puesto un smith triger y da igual, la interrupcion sigue conectada, sólo cuando aprieto todos los pulsadores (RB 4- 7) a la vez, consigo ue entre en el main, tanto con el smith triger como sin él...
-
Realmente creo que el CCS es un poquitin tontorron con las interrupciones externas, pero debe de ir ... postea tu codigo para que lo podamos ver.
P.D.: por el foro habido muchas questiones sobre el mismo tema quizás te sea de ayuda leerlas.
-
Ahi va el código, en un principio tendría que funcionar ya que con la int externa va perfecto...
Gracias
PD: Como no me deja aduntar el fichero por falt de espacio, lo mando aqui
#include <16F877A.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#int_rb
flash_on_off(){
delay_ms(15);
output_high(PIN_C0);
delay_ms(15);
output_low(PIN_C0);
}
void flash_led() {
output_low(PIN_C1);
delay_ms(500);
output_high(PIN_C1);
delay_ms(500);
}
void main() {
enable_interrupts(global);
enable_interrupts(int_rb);
while (1)
flash_led();
}
-
Al final he leido un post que no habia visto antes de Priots que dice:
"Creo que lo que te pasa es que como la interrupcion es por cambio de estado en cualquiera de las patillas, te salta la interupcion cuando pulsas el pulsador y cuando lo sueltas vuelve a entrar a la interrupcion. Prueba a usar esta mascara.
delay_ms(70); // esperamos para evitar rebotes
if(!(port_b^0xF0)) // si se produce al soltar el pulsador
return; // salimos de la interrupcion.
Salu2"
El que le pase lo mismo qu elo pruebe, a mi me ha funcionado!!
Gracias Radon
-
Quieres decir, que hasta que no sueltes el boton no sale de la interrupcion?
-
Lo que ocurre con la interrupcion externa es que se produce cuando pulsas y cuando dejas de pulsar. PAra evitar que al dejar de pulsar vuelva a entrar en la interrupcion debes aplicar la mascara para detectar que es flanco ascendente y salir de la interrupcion, seria como una forma de configurar el flanco que produce la interrupcion.
Salu2