Autor Tema: instrucción INT_EXT  (Leído 2542 veces)

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

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
instrucción INT_EXT
« en: 07 de Mayo de 2008, 13:43:54 »
Buenas compañeros,
Estoy programando un pic16f877
y al ejecutar esta instrucción me da un error,
#INT_EXT                     
void EXT_isr()
{
   printf("temperatura=%f ", taula[n]);         
   printf("%C", 0x0D);           
}


he mirado en las posibles interrupciones del pic y esta está permitida, pero sin embargo me da un error, es el siguiente:
##########
A numeric expression must appear here

Some C expression (like 123, A or B+C) must appear at this spot in the code.  Some expression that will evaluate to a value.
###########

he probado de poner un número y me sigue dando error, no se el motivo. si alguein me puede ayudar le estaré agradecido, muchas gracias saludos!



Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: instrucción INT_EXT
« Respuesta #1 en: 07 de Mayo de 2008, 13:53:35 »
Cheapekt, el error no tiene porque estar en la definicion de la interrupcion en si misma sino probablemente en esos printf que tienes ahi. Deberias seguir esa matriz taula y fijate si has definido a la misma y a su indice n como variables globales.

El 16F877 permite la interrupción y yo la he usado sin problemas varias veces. Acuerdate de definir el flanco de activacion de la interrupción EXT para evitar problemas. Un saludo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: instrucción INT_EXT
« Respuesta #2 en: 07 de Mayo de 2008, 14:55:37 »
Detrás del %f tienes que especificar el número de decimales, por ejemplo 3.2 (1 entero y 2 decimales, 3 caracteres en total)

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: instrucción INT_EXT
« Respuesta #3 en: 07 de Mayo de 2008, 17:53:14 »
Hola pocher. %f es correcto y el valor de decimales en realidad es opcional, por lo tanto tendria que funcionar de esa forma.
Además la sintaxis es %nf , donde n es el numero de decimales luego de la coma (aunque f no redondea, creo que en realidad trunca el numero solamente).

Creo que coincidimos pocher en que el error no se encuentra en la interrupción en si, sino en el código contenido en ella, corrigeme si piensas lo contrario. Deberiamos ver el codigo completo para asegurarnos que que esos dos printf funcionan correctamente.

Un saludo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: instrucción INT_EXT
« Respuesta #4 en: 07 de Mayo de 2008, 18:44:38 »
Saludos!  :-)
Coincido con Gonzalo en que el printf no es el error... yo he usado el printf de esa misma manera y no he tenido problemas... pero generalmente cuando da ese mensaje el problema es el que dice Gonzalo, alguna defininición de variables por allí...
Cheapekt recuerda que para definir variables globales las colocas en la cabecera, antes del código y después de los fuses y demás #use que estás empleando...
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: instrucción INT_EXT
« Respuesta #5 en: 08 de Mayo de 2008, 00:45:20 »
Totalmente de acuerdo ... la velocidad es mala consejera. :D

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: instrucción INT_EXT
« Respuesta #6 en: 08 de Mayo de 2008, 06:56:02 »
Gracias compañeros el codigo es el siguiente:

#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   // TODO: USER CODE!!

#INT_EXT                       //aquesta comanda ens indica que la funció següent serà la que executarem quan entri una interrupció externa
void EXT_isr()
{
   printf("temperatura=%f ", taula[n]);         
   printf("%C", 0x0D);            //Envia "Enter"
}

{

int n;
int punter;
int offset=0;
float taula[24] = {0,1,2,3,4,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};

// Escriure taula en memoria flash
for(n=0, punter=0;n<97;n++,punter++){      //inicialitzem n=0 i punter=0; li diem que conti fins a 95; i que incrementi la n++ i punter++ cada cop
write_bank(0,offset,taula[n]);
}
}

   ext_int_edge(L_TO_H);          //Defineix un flang de pujada per la interrupció externa
   enable_interrupts(INT_EXT);   //activem la interrupció externa
   enable_interrupts(global);      //activem les interupcions generals
   while(TRUE)
   {}




}

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: instrucción INT_EXT
« Respuesta #7 en: 08 de Mayo de 2008, 06:57:43 »
perdón es este

#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   // TODO: USER CODE!!

#INT_EXT                       
void EXT_isr()
{
   printf("temperatura=%f ", taula[n]);         
   printf("%C", 0x0D);           
}

{

int n;
int punter;
int offset=0;
float taula[24] = {0,1,2,3,4,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};

// Escriure taula en memoria flash
for(n=0, punter=0;n<24;n++,punter++){     
write_bank(0,offset,taula[n]);
}
}

   ext_int_edge(L_TO_H);         
   enable_interrupts(INT_EXT); 
   enable_interrupts(global);     
   while(TRUE)
   {}




}


Gracias saludos

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
Re: instrucción INT_EXT
« Respuesta #8 en: 08 de Mayo de 2008, 12:37:48 »
Saca la rutina de interrupción del main y ponla arriba. Las variables que intervengan en la rutina tendrás que definirlas dentro de la rutina o como globales.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: instrucción INT_EXT
« Respuesta #9 en: 08 de Mayo de 2008, 14:11:46 »
Saludos!
Lo que dice porcher sería así (lo compilé y no dió errores, pero corrígeme si falta algo maestro porcher):

Código: [Seleccionar]
#include <16F877.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES PROTECT                  //Code protected from reads
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
static float taula[24] = {0,1,2,3,4,4,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
static int n;

#INT_EXT                       
void EXT_isr()
{
   printf("temperatura=%f ", taula[n]);         
   printf("%C", 0x0D);           
}

void main()
{
   int punter;
   int offset=0;
   
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   for(n=0, punter=0;n<24;n++,punter++)
      write_bank(0,offset,taula[n]);

   ext_int_edge(L_TO_H);         
   enable_interrupts(INT_EXT);
   enable_interrupts(global);     
   while(TRUE)
   {}
}

Ok nos leemos!  :mrgreen:



"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: instrucción INT_EXT
« Respuesta #10 en: 08 de Mayo de 2008, 14:30:12 »
Hola firepic, la variables globales no las definas como estáticas, salvo que tengas varias unidades para compilar y solo quieras que pueda utilizarla la local. En tu caso solo tienes un .C por lo que veo y por lo tanto definirlas como estáticas no es necesario.

Tal como dices tu, nos leemos.

P.D: No te voy a robar el saludo, pero es que es bastante pegajoso! :D
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: instrucción INT_EXT
« Respuesta #11 en: 08 de Mayo de 2008, 14:41:26 »
Saludos!  :-)

Gracias Dr. Gonzalo, por la aclaratoria. En realidad lo escribo así porque en un programa del maestro diego ví que estaba así y me gusto como se veía así que empecé a usarla así yo también  :D
Ah y no me preocupa lo del saludo...

Ok, nos leemos!  :mrgreen:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web


 

anything