Si el problema esta en que para resetear la interrupcion por RB, debes leer todo el puerto y no como lo estas haciendo leyendo cada pin.Hola RALF2 probé utilizándolo sin cargar una variable o sea prendiendo directamente las salidas al pulsar los botones de la interrupción de esa manera y funcionaba preguntando individualmente , el error esta cuando quiero cargarle un valor a cierta variable para luego analizarla en el switch para realizar ciertas secuencias de luces .
puedes hacer por ejemplo valor= portB; de esta manera reseteas el puerto y borras el flag de la interrupcion.
Saludos
volatile int VALOR=0;hola KILLERJC gracias por la observación de las mayúsculas de igual manera intente de la manera que me sugerís y sigo con el mismo problema gracias
Y
valor=2;}
por
VALOR=2;}
C es case-sensitive, deberias tener un error, no se por que no te lo da. Y deberias usar minusculas para las variables, y mayusculas para constantes predefinidas
Puedes hacerlo de varias formas una seria asi:hola RALF2 va por ese lado ahora no se traba el programa pero esta continuamente cambiando de modo como si se pulsaran siempre los pulsadores mira probando de esta manera que me comentas, probando solamente con un if es como si al iniciar el programa ya estuviera pulsado gracias
if (bit_test(valor, 4) == 0) // hago esto...
if (bit_test(valor, 5) ==0 ) // hago esto otro...
Saludos
El problema esta en el rebote del contacto de los pulsadores, cuando presionas un pulsador se activa la interrupcion al leer el puerto de borra el flag de la interrupcion, luego al salir de la interrupcion pasa al main pero al rebotar el contacto vuelve a entrar de nuevo a la interrupcion. Entonces prueba colocando un retardo de 200ms al momento de entrar en la interrupcion y luego lees el puerto y me comentas :mrgreen:que tal otra ves RALF2 mira te comento lo intente digamos poniendo una demora por el ruido pero directamente en proteus arranca como si se pulsaran los botones prendiendo y apagando es como si al momento de preguntar por los bit de la variable "valor" los dos if se cumplieran apagando y prendiendo sucesivamente
Saludos
Haz esto:que tal RALF2 sigo con el mismo inconveniente las luces inician sin pulsar nada directamente al iniciar el programa seria de esta manera como me comentas ?
Añade
#USE FAST_IO (A)
#USE FAST_IO (B)
quita el retardo y carga el valor= 0xff
Saludos
Te dije colocaras int valor= 0xff;Hola no te entndi muy bien al principio cuando me aclaraste lo de valor ai si jaja funciono muchas gracias por tomarte el tiempo de explicarme gracias ((:-))
Tu programa no lo entiendo :? podrias explicar que es lo que efectos de luces quieres hacer activando las interrupcion por RB0 y Rb4 - 7???
Saludos
Hola, me estoy iniciando en los microcontroladores, estoy usando el pic18f4550 con el compilador CCS, programado por usb a traves del bootloader, estoy trabajando con interrupcion externa RB1, pero tengo un problema, al querer ejecutar un ciclo for cuando se realiza la interrupcion el microcontrolador simplemente no responde a los cambios de flancos, me serviria mucho su ayuda u observacion.hola que tal intenta utilizar el for dentro del while con algun if. Q al entrar a la interrupcion por ejemplo cambie una variable. Y ingresando al for ya que de la forma q lo tenes al ingresar al ciclo de la interrupción el micro queda trabajando con el for y no te va detectar q estas pulsado porque estaria cumpliendo la interrupcion digamos q quedaria en ese ciclo hasta q se cumpla y luego podria volver a detectar la interrupcion.
PROGRAMA:
#include "18f4550.h"
#use delay(clock=48000000)
#build(reset=0x02000,interrupt=0x02008)
#org 0x0000, 0x1FFF {}
#byte TRISB=0xF93
#byte PORTB=0xF81
#int_ext1
int8 a;
void ext_isr()
{
for(a=0;a<3;a++)
{
output_high(PIN_B7);
delay_ms(500);
output_low(PIN_B7);
delay_ms(500);
}
}
void main()
{
TRISB=0X02;
set_tris_B(0x02);
port_B_pullups(TRUE);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT1);
enable_interrupts(GLOBAL);
while(TRUE){}
}