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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Problema con interrupciones EXT y RB
« en: 28 de Diciembre de 2015, 10:28:03 »
Hola buenas tengo un problema al utilizar las interrupciones RBO Y RB4-RB7, mi programa es muy sencillo es un juego de luces y quiero utilizar las interrupciones para ir cambiando de modos  la cuestión es que al apretar por ejemplo rb4 quiero que a mi variable "valor" se le cargue el 1 hasta ai bien porque lo realiza el problema es luego el programa se queda completamente trabado. Al probar las interrupciones prendiendo simplemente las luces de a una funcionan correctamente el problema surge cuando quiero utilizar la variable.

dejo mi programa si lo pueden mirar y ver si no estoy utilizando alguna instrucción adecuadamente dejo un archivo 7zip con el programa y la simulacion en isis 7 desde ya gracias.

//*******************
#include <16f84a.h>
#use delay(clock=4M)
#fuses NOPROTECT, NOPUT, NOWDT, XT
#BYTE PORTA = 0X05
#BYTE TRISA = 0x85
#BYTE PORTB = 0X06
#BYTE TRISB = 0x86

volatile int VALOR=0;


#int_ext
void EXT_isr()
{
if(input(pin_b0)==0){
  valor=1;}
}

#int_RB
VOID RB4_INT()
{
 
   IF(INPUT(PIN_B4)==0){
   valor=2;}
   
   IF(INPUT(PIN_B5)==0){
   valor=3;}
   
   IF(INPUT(PIN_B6)==0){
   valor=4;}
   
   IF(INPUT(PIN_B7)==0){
   valor=5;}

}

void main()
{

TRISA=0B10000;
PORTA=0B00000;
TRISB=0B11110001;
PORTB=0B00000000;
enable_interrupts(int_ext);
enable_interrupts(int_RB);
ext_int_edge(H_TO_L);
enable_interrupts(global);

WHILE(true)
{

SWITCH(valor)
{
CASE 1:
OUTPUT_A(0B01111);
OUTPUT_B(0B00000110);
BREAK;

CASE 2:
OUTPUT_A(0B01111);
OUTPUT_B(0B00000010);
BREAK;

CASE 3:
OUTPUT_A(0B00110);
OUTPUT_B(0B00000100);
BREAK;

CASE 4:
OUTPUT_A(0B00101);
OUTPUT_B(0B00000110);
BREAK;

CASE 5:
OUTPUT_A(0B01001);
OUTPUT_B(0B00000000);
BREAK;
}
}
}
« Última modificación: 28 de Diciembre de 2015, 16:27:00 por juli1098 »

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Problema con interrupciones EXT y RB
« Respuesta #1 en: 28 de Diciembre de 2015, 13:04:20 »
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.
puedes hacer por ejemplo valor= portB; de esta manera reseteas el puerto y borras el flag de la interrupcion.

Saludos

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #2 en: 28 de Diciembre de 2015, 14:50:09 »
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.
puedes hacer por ejemplo valor= portB; de esta manera reseteas el puerto y borras el flag de la interrupcion.

Saludos
  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 .

si lo realizo como me decís como puedo analizar después la variable "valor" para preguntar por cual pin fue pulsado ?

gracias RALF2

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con interrupciones EXT y RB
« Respuesta #3 en: 28 de Diciembre de 2015, 15:14:30 »
volatile int VALOR=0;

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

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Problema con interrupciones EXT y RB
« Respuesta #4 en: 28 de Diciembre de 2015, 15:16:10 »
Puedes hacerlo de varias formas una seria asi:

if (bit_test(valor, 4)  == 0)  // hago esto...

if (bit_test(valor, 5) ==0 )  // hago esto otro...

Saludos

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #5 en: 28 de Diciembre de 2015, 15:24:17 »
volatile int VALOR=0;

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
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

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #6 en: 28 de Diciembre de 2015, 15:48:36 »
Puedes hacerlo de varias formas una seria asi:

if (bit_test(valor, 4)  == 0)  // hago esto...

if (bit_test(valor, 5) ==0 )  // hago esto otro...

Saludos
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

#include <16f84a.h>
#use delay(clock=4M)
#fuses NOPROTECT, NOPUT, NOWDT, XT
#BYTE PORTA = 0X05
#BYTE TRISA = 0x85
#BYTE PORTB = 0X06
#BYTE TRISB = 0x86

int valor=0;


#int_ext
void EXT_isr()
{
 valor=portB;
}

#int_RB
VOID RB4_INT()
{
 
   valor=portB;

}

void main()
{

TRISA=0B10000;
PORTA=0B00000;
TRISB=0B11110001;
PORTB=0B00000000;
enable_interrupts(int_ext);
enable_interrupts(int_RB);
ext_int_edge(H_TO_L);
enable_interrupts(global);

WHILE(true)
{

if (bit_test(valor, 4)  == 0){
OUTPUT_A(0B01111);
OUTPUT_B(0B00000110);
}


if (bit_test(valor, 5)  == 0){
OUTPUT_A(0B01111);
OUTPUT_B(0B00000010);
}

}
}


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Problema con interrupciones EXT y RB
« Respuesta #7 en: 28 de Diciembre de 2015, 19:23:59 »
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:

Saludos

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #8 en: 28 de Diciembre de 2015, 20:14:57 »
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:

Saludos
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

#include <16f84a.h>
#use delay(clock=4M)
#fuses NOPROTECT, NOPUT, NOWDT, XT
#BYTE PORTA = 0X05
#BYTE TRISA = 0x85
#BYTE PORTB = 0X06
#BYTE TRISB = 0x86

int valor=0;

#int_ext
void EXT_isr()
{
 delay_ms(200);
 valor=portB;
}

#int_RB
VOID RB4_INT()
{
  delay_ms(200);
  valor=portB;

}

void main()
{

TRISA=0B10000;
PORTA=0B00000;
TRISB=0B11110001;
PORTB=0B00000000;

enable_interrupts(int_ext);
enable_interrupts(int_RB);
ext_int_edge(H_TO_L);
enable_interrupts(global);

WHILE(true)
{

if (bit_test(valor, 4)  == 0){
OUTPUT_A(0B01111);
OUTPUT_B(0B00000110);
}
if (bit_test(valor, 5)  == 0){
OUTPUT_A(0B00000);
OUTPUT_B(0B00000000);}
}
}

tal cual como me comentaste  te dejo un .rar con el archivo y el proteus a ver si podes comprobar lo que me sucede en el proteus gracias che por la ayuda

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Problema con interrupciones EXT y RB
« Respuesta #9 en: 28 de Diciembre de 2015, 21:51:01 »
Haz esto:
Añade
#USE FAST_IO (A)
#USE FAST_IO (B)

quita el retardo y carga el valor= 0xff

Saludos

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #10 en: 29 de Diciembre de 2015, 06:49:16 »
Haz esto:
Añade
#USE FAST_IO (A)
#USE FAST_IO (B)

quita el retardo y carga el valor= 0xff

Saludos
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 ?


#include <16f84a.h>
#use delay(clock=4M)
#fuses NOPROTECT, NOPUT, NOWDT, XT
#BYTE PORTA = 0X05
#BYTE TRISA = 0x85
#BYTE PORTB = 0X06
#BYTE TRISB = 0x86
#USE FAST_IO (A)
#USE FAST_IO (B)

int valor=0;

#int_ext
void EXT_isr()
{
 valor= 0xff;
}

#int_RB
VOID RB4_INT()
{
  valor= 0xff;

}

void main()
{

TRISA=0B10000;
PORTA=0B00000;
TRISB=0B11110001;
PORTB=0B00000000;

enable_interrupts(int_ext);
enable_interrupts(int_RB);
ext_int_edge(H_TO_L);
enable_interrupts(global);

WHILE(true)
{

if (bit_test(valor, 4)  == 0){
OUTPUT_A(0B01111);
OUTPUT_B(0B00000110);
}
if (bit_test(valor, 5)  == 0){
OUTPUT_A(0B00000);
OUTPUT_B(0B00000000);}
}
}


Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re:Problema con interrupciones EXT y RB
« Respuesta #11 en: 29 de Diciembre de 2015, 08:46:08 »
Te dije colocaras int valor= 0xff;
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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con interrupciones EXT y RB
« Respuesta #12 en: 29 de Diciembre de 2015, 11:02:44 »
Código: C
  1. #include <16f84a.h>
  2. #use delay(clock=4M)
  3. #fuses NOPROTECT, NOPUT, NOWDT, XT
  4. #USE FAST_IO (A)
  5. #USE FAST_IO (B)
  6.  
  7. int valor;
  8.  
  9. #int_ext
  10. void EXT_isr()
  11. {
  12.    OUTPUT_A(0B01111);
  13.    OUTPUT_B(0B00000110);
  14. }
  15.  
  16. #int_RB
  17. VOID RB4_INT()
  18. {
  19.   valor= portb;            // Lectura del puerto solo para quitar la condicon
  20.   OUTPUT_A(0B00000);
  21.   OUTPUT_B(0B00000000);
  22. }
  23.  
  24. void main()
  25. {
  26.  
  27. set_tris_a(0x10);
  28. output_a(0);
  29. set_tris_b(0xF1);
  30. output_b(0);
  31.  
  32. enable_interrupts(int_ext);
  33. enable_interrupts(int_RB);
  34. ext_int_edge(H_TO_L);
  35. enable_interrupts(global);
  36.  
  37.   WHILE(true);
  38. }

Desconectado juli1098

  • PIC10
  • *
  • Mensajes: 8
Re:Problema con interrupciones EXT y RB
« Respuesta #13 en: 30 de Diciembre de 2015, 09:25:35 »
Te dije colocaras int valor= 0xff;
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 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  ((:-))

Desconectado Ruido

  • PIC10
  • *
  • Mensajes: 1
Re:Problema con interrupciones EXT y RB
« Respuesta #14 en: 02 de Enero de 2016, 01:19:13 »
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){}
}


 

anything