Autor Tema: Problema con interrupciones EXT y RB  (Leído 3916 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #15 en: 10 de Enero de 2016, 17:56:51 »
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.

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){}
}
  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.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:Problema con interrupciones EXT y RB
« Respuesta #16 en: 28 de Enero de 2016, 05:50:44 »
Prueba a poner #int_ext en vec de #int1_ext Yo lo acabo de probar compila pero no funciona. Luego deberias poner en
 void ext_isr()
{
..............
............
clear_interrupt(INT_EXT);
}
al final de la interrupcion Yo tambien soy bastante nuevo no se muy bien su comportamiento interno, pero tiene que ver con resetear la interrupcion para que su resultado final no afecte a la siguiente. una puesta a cero de sus banderas.
Al parecer tampoco son buenos tantos derlays() dentro de ella, en el caso de que haya mas interrupciones de por medio dile solo a void ext_isr() que ejecute la funcion que sea dentro de main()