duda con interrupcion INT0 pic 16f84a

Hola amigos mi nombre es George y soy nuevo en el foro, estube leyendo algunos hilos y me parece que hay mucha gente entusiasta en estos temas .Actualmente estoy experimentando con los pic especificamente el pic 16f84a, para aprender a programarlos. mis conocimientos son basicos acerca de los pic, he desarrollado un par de cosas para poder familiarizarme con ellos y ahora estoy probando con las interrupciones haber si alguien me puede hechar una manito.
Lo que sucede es lo siguiente.
quiero hacer un programa que al accionar un pulsador que esta conectado el pin RBO se active la interrupcion externa y desde ahi, mediante codigo, encender un led que esta conectado al pin
RA2 (configurado como salida) , Ok hasta el moneto esta todo bien pero la duda biene aqui:
-Necesito apagar el led del puerto RA2 una vez que vuelva a accionar el pulsador RA2, osea se volvera a producir la INT0, pero no se como hacerlo. He leido por hay que no se puede llamar a una interrupcion dentro de otra, asi que porfavor si ustedes me pudieran ayudar un poquito.
Muchas gracias. si necesitan el codigo lo colocare.
Saludos.
 
Creo que lo tienes muy facil
Si ya has hecho la primera parte solo tienes que modificar un poco el codigo y añadirle la segunta parte para apagarlo
Algo asi deberia servir

INT0
si RB0 esta a cero ponlo a uno
goto salir
si RB0 esta a uno ponlo a cero
salir
salir de INT0
 
Hola gracias por responder, pero al hacer eso el programa funciona de manera irregular ya que dentro de la interrupcion tengo una rutina que hace que el led encienda y apague con un Ton=500ms y Toff=500ms esto lo hago llamando a una subrrutina de retardos y aparte hay que volver a habilitar las interrupciones generales y las externas. Bueno lo que hice fue hacer un contador que al entrar a la interrupcion se encontraba en estado cero "cont=0" y luego volvi a habilitar las interrupciones del registro "INTCON" BIT 7 Y BIT 4 (GIE y INTE, respectivamente) para poder producir una interrupcion en cualquier momento incluso estando dentro de una. y si volvia a presionar RB0 el contador se incrementaria y con eso ya sabria que se han presionado 2 veces el pulsador RB0 (una vez activa y dos apaga , osea sale de la interrupcion). Pero al hacer esto di con otro problema el contador de programa podria estar apuntando a la subrrutina de retardos ya que la interrupcion puede producirse incluso estando en el retardo y al hacer un return o retfie volvera a la rutina de retardo, para solucionar esto antes de salir cargue en en el registro pcl la direccion a la cual queioro que apunte al salir para que no vuelva a la rutina de retardo, sin embargo esto me funciono muy bien en el MPLAB pero no asi cuando grabe el pic.
Bueno tendre que seguir intentando haber que sale y si alguien me puede hechar una manito mejor o si alguien ya ha hecho algo similar que ponga el codigo. Cuando lo solucione por completo colocare el codigo para alguien que lo pueda necesitar.
Muchas gracias, saludos.
 
Bueno, despues de hacer algunas intentos lo he solucionado, lo que hice fue hacer un contador de 4 bits binario. Este funciona cada vez que se presiona el pulsador de RBO produciendose la INT0, y si se vuelve a presionar este deja de contar, tambien deja de contar si ha llegado a su valor maximo de 4bits 2^4-1=16.
los pines para colocar led son el RA0, RA1,RA2 y RA3, el pin para el pulsador es el RBO configurado como entrada. Bueno aca dejo el programa por si a alguien le sirve o si me pueden ayudar a mejorarlo.



#include <16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#include "C:\pics_en_c\contador4bits\contador4bits.h"
#byte PORTA=05 //CONFIGURO PORTA COMO SALIDA

int contador; //INICIALIZO VARIABLES
int hasta15=0; //


#int_EXT
void EXT_isr(void) //CODIGO QUE SE EJECUTARA AL
{ //AL OCURRIR INT0
delay_ms(20);
contador++;


}



void main()
{
set_tris_a(0x00); //PORTA COMO SALIDA
set_tris_b(0xff); //PORTB COMO ENTRADA, AUNQUE EN REALIDAD SOLO OCUPO RB0

enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
ext_int_edge(L_TO_H);

while((contador==1)&&(hasta15<=14)) //CONTARA SIEMPRE Y CUANDO
//CONTADOR=1 Y CONTADOR=14
{
hasta15++;
PORTA++;
delay_ms(500);

} //SI CONTADOR ES DISTINTO
//A 1
PORTA=0;
hasta15=0;
contador=0;

}

SALUDOS Y GRACIAS.
 
Última edición:
Atrás
Arriba