TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: nach en 09 de Noviembre de 2007, 07:37:22
-
Hola
Trabajo con el 16HV616, CCS y ICD2. Estoy intentado trabajar con e¡su interrupcion externa y hay una cosa que no entiendo.
Cuando escribes...
#INT_EXT
Rb_isr() => aqui veo multitud de opciones...pero que significa esto??...que opciones existen??
pretendo que cuando se ejecute la interrupcion, ponga a cero una salida y me cambie el estado de una variable global. Y esto no lo consigo, me pone a cero la salida pero no me cambia el estado de la variable global. Dependo de eso??
GRacias
-
Mas programa, es la guerra ... ja, ja, ja :D :D :D
Quiero decir que pongas el trozo de tú código que ejecutas dentro de la interrupción, y dónde declaras la variables global. :mrgreen:
-
ahi va...
#include <16HV616.h>
#FUSES IOSC4, NOWDT, INTRC, NOMCLR, NOBROWNOUT, PUT
#use delay(internal=4000000)
//IOSC4
#use fast_io(A)
int direccion=0;
#byte PORTA = 0x05
#bit A0 = 0x05.0//output para abrir
#bit A1 = 0x05.1//output para cerrar
#bit A2 = 0x05.2
#bit A3 = 0x05.3//input para lectura del selector pin0
#bit A4 = 0x05.4//input para lectura del selector pin1
#bit A5 = 0x05.5
#INT_EXT
void extinterrupt()
{
int x;
x = input(PIN_A2);
if (x==0){
output_bit(PIN_A0,0);
delay_ms(1000);
direccion=1;
}
}
void main ()
{
set_tris_A( 0b111100 );
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L);
switch (direccion){
case 0:
output_high(PIN_A0);
output_low(PIN_A1);
break;
case 1:
output_low(PIN_A0);
output_high(PIN_A1);
break;
}
}
el problema es que cuando la int se ejecuta no me cambia a 1 la varible direccion...y no se ejecuta la sengunda parte del main.
pretendo que:
-se ejecute el case 0 hasta que aparezca la int y luego el case 1.
-
El problema no esque la variable no cambie de valor, esque el codigo al llegar al final vuelve a empezar y pone la variable a cero. Lo tienes que mantener con un bucle. algo asi.
#include <16HV616.h>
#FUSES IOSC4, NOWDT, INTRC, NOMCLR, NOBROWNOUT, PUT
#use delay(internal=4000000)
//IOSC4
#use fast_io(A)
int direccion=0;
#byte PORTA = 0x05
#bit A0 = 0x05.0//output para abrir
#bit A1 = 0x05.1//output para cerrar
#bit A2 = 0x05.2
#bit A3 = 0x05.3//input para lectura del selector pin0
#bit A4 = 0x05.4//input para lectura del selector pin1
#bit A5 = 0x05.5
#INT_EXT
void extinterrupt()
{
int x;
x = input(PIN_A2);
if (x==0){
output_bit(PIN_A0,0);
delay_ms(1000);
direccion=1;
}
}
void main ()
{
set_tris_A( 0b111100 );
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
ext_int_edge(H_TO_L);
while(1) //Bucle para ejecutar todo el rato el case, sale en la interrupcion.
{
switch (direccion){
case 0:
output_high(PIN_A0);
output_low(PIN_A1);
break;
case 1:
output_low(PIN_A0);
output_high(PIN_A1);
break;
}
}
}
-
hola gorgonas, yo pondria:
...
#INT_EXT
void extinterrupt()
{
if (!bit_test(PIN_A2)) {
output_bit( PIN_A2, 0);
Ddelay_ms(1000);
direccion=1;
}
}
no lo probe...
saludos
-
ok...gracias a los tres,
creo que ya probe lo de hacer un bucle infinito con el while y creo recordar que me dio el mismo resultado..no me entró en case 1... osea que no me toma lo de direccion=1....pero lo volveré a probar otra vez..
el lunes os cuento...
muxas gracias...
-
Acuerdate también de resetear la variable "direccion", ya que cuando tome valor "1", según tu código, nunca más cambiará de valor.
Suerte!!! ;)
-
grazzie una vez mas..ya furrula.
Le faltaba el bucle cerrado con el while (true){}
Ok :-)