TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: QIQE en 27 de Marzo de 2007, 16:44:49
-
Hola amigos estoy usando un PIC18f4580 para hacer un "watimetro" el watimetro realmente es un mcp3905, este me da una salida en frecuencia mi problema es el siguiente:
tengo hecho un programa que convierte frecuencia a valor con una interrupcion externa por rb0 y un timer, luego tb necesitoque envie y reciba datos por el rs 232 pero cuando junto todo m i programa que lleva mas cosas no me entra en la interrupción externa, llevo unos dias dandole vueltas podeis mirarlo estoy desesperado:S:S
#include <18F4580.h>
#device adc=10
#FUSES NOWDT,NOPROTECT,NOLVP,HS //No Watch Dog Timer
#FUSES
#use delay(clock=20000000)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
#include <ctype.h>
#include <string.h>
#include <lcd.c>
#int_EXT
void EXT_isr()
{
printf("jajaaj");
switch (flancos)
{
case 0: //Primer flanco de subida
set_timer1(0);
desbordes=0;
flancos =1;
printf("jajaaj");
break;
case 1: //Segundo Flanco de subida
TIMER1=get_timer1();
//medir_frecuencia();
flancos=2;
printf("ejej");
break;
}
}
//----------------Interrupcion puerto serie --------------------------------
#int_RDA
void serial_isr()
{
rcvchar=0x00;
if (kbhit())
{
cbuff[xbuff++]=getc();
if (xbuff>longitud)
xbuff=longitud;
}
}
#INT_TIMER1
void desborda_T1()
{
desbordes++;
}
//##############################################################################
//## ##
//## Programa ##
//## ##
//##############################################################################
void main()
{
setup_adc_ports(ALL_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,0,1);
enable_interrupts(INT_RDA);
ext_int_edge(0,H_TO_L); //Interrupcion 0 por flanco de subida
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while (true)
{\\mi código}
}
-
Hola qiqe!
Vamos a ver esto:
#int_EXT
void EXT_isr()
{
printf("jajaaj");
switch (flancos)
{
case 0: //Primer flanco de subida
set_timer1(0);
desbordes=0;
flancos =1;
printf("jajaaj");
break;
case 1: //Segundo Flanco de subida
TIMER1=get_timer1();
//medir_frecuencia();
flancos=2;
printf("ejej");
break;
}
}
Deduzco que la variable 'flancos' es una variable global, ¿no? Confirma esto porfa.
Así a bote pronto veo que 'flancos' lo igualas a 1 y que despues lo igualas a 2.
Aquí a 1:
case 0: //Primer flanco de subida
set_timer1(0);
desbordes=0;
flancos =1;
printf("jajaaj");
break;
Aquí a 2:
case 1: //Segundo Flanco de subida
TIMER1=get_timer1();
//medir_frecuencia();
flancos=2;
printf("ejej");
break;
Lo tendrías que igualar a 1 y a 0, es decir:
case 0: //Primer flanco de subida
set_timer1(0);
desbordes=0;
flancos =1;
printf("jajaaj");
break;
case 1: //Segundo Flanco de subida
TIMER1=get_timer1();
//medir_frecuencia();
flancos=0;
printf("ejej");
break;
Ya nos cuentas.
Un saludo desde Alicante.
-
¿Puede ser que un printf() ocupe "demasiado" tiempo dentro de la interrupción y empeicen a aparecer cosas raras?
-
hola azicuetano, correcto flanco es global, su valor flanco lo recojo en el el bucle principal si flanco==2 hago cosas y al final flanco=0, el problema es que nunca entra en la interrupción externa nunca recibo jajaaj ni jejej con lo que deduzco que nunca llega a entrar :S:S
-
luego tb necesitoque envie y reciba datos por el rs 232 pero cuando junto todo m i programa que lleva mas cosas no me entra en la interrupción externa
Según esto solo tienes el problema cuando trabajas con el programa completo, deberías mostrarnos todo el código.
saludos.
-
Habilitaste las interrupciones con eneble_interrupts()?
Si lo que tienes es un circuito que te entrega frecuencia (supongo que un tren de pulsos cuyo período es proporcional a la señal que tiene a su entrada), mejor no utilizas uno de los temporizadores como contador y te ahorras tener que procesar cada pulso con INT_EXT. No se me parece mejor utilizar este método cuando lo que tienes es una entrada alimentada por un convertidor Algo/Frecuencia.
Un saludo Reinier