TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juli1098 en 28 de Diciembre de 2015, 10:28:03

Título: Problema con interrupciones EXT y RB
Publicado por: juli1098 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;
}
}
}
Título: Re:Problema con interrupciones EXT y RB
Publicado por: RALF2 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: KILLERJC 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: RALF2 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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);
}

}
}

Título: Re:Problema con interrupciones EXT y RB
Publicado por: RALF2 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: RALF2 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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);}
}
}

Título: Re:Problema con interrupciones EXT y RB
Publicado por: RALF2 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
Título: Re:Problema con interrupciones EXT y RB
Publicado por: KILLERJC 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. }
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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  ((:-))
Título: Re:Problema con interrupciones EXT y RB
Publicado por: Ruido 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){}
}
Título: Re:Problema con interrupciones EXT y RB
Publicado por: juli1098 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.
Título: Re:Problema con interrupciones EXT y RB
Publicado por: Berto 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()