Autor Tema: funcion sizeof()  (Leído 5406 veces)

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
funcion sizeof()
« en: 19 de Febrero de 2008, 03:12:52 »
saludos, espero logren ayudarme, pues he visto en el foro y en el manual y no he logrado entender lo que hace esa función, pasa que quiero capturar datos del puerto serial y para ello me base en el codigo de Nocturno de los led's RGB por PWM con un timer, según su codigo hace esto:
char buffer[13];
int8 CaracteresRecibidos  = 0;
int1 ComandoRecibido;
#INT_RDA
void serial_isr()
{
   char c;

   c=getc();
   putchar(c);
   buffer[CaracteresRecibidos] = c;
   if (c==13)
      ComandoRecibido=true;
   else
      CaracteresRecibidos = (CaracteresRecibidos+1) % sizeof(buffer);
}

que hace esa funcion sizeof? y el %, es el residuo de la div entre  caracteres+1 y sizeof?

es necesario ello?? osea podria estar solo CaracteresRecibidos++;?

y si mi buffer fuera de 8 caracteres como máximo? en realidad 9 mas en ENTER, solo con cambiar a esos valores no me funciona bien me sale este warning "Interrupts disabled during call to prevent re-entrancy:  (@DIV88)" osea coloco 9 en los lugares que esta 13 y salta ese warning, pero si coloco valores menores no aparece el warnig pero no funciona

estoy usando un 16f88 y este seria mi codigo:

Código: [Seleccionar]
#include <16F88.h> // libreria de definiciones del pic qeu se usa
#device adc=8      // el adc convertirá a 8 bits
#fuses INTRC_IO,MCLR,NOWDT,PUT,NOPROTECT,NOLVP,NOCPD,NOBROWNOUT//,NODEBUG,NOSTVREN,IESO,FCMEN,NOWRT,NOWRTD,NOWRTC,NOEBTR,NOEBTRB,NOCPB,NOWRTB   // fuses necesarios
#use delay(internal=8000000)  // valor del oscilador interno
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2, parity=N, bits=8) // definicion de uso del puerto serie
// en transmision asíncrona, 9600bps y pines necesarios para tx y rx, sin paridad, 8 bits para datos y 1 bit de parada
#byte port_a=0x05 // direccion en memoria del puerto a
#byte port_b=0x06 // direccion en memoria del puerto b
#use fast_io(a)   // el puerto a, debes ser definido con tris_a
#use fast_io(b)   // el puerto b, debes ser definido con tris_b
#define der_A PIN_B1  // definicion del pin B1 que representara al motor A, que sea alimentado para ir a derecha
#define izq_A PIN_B3  // definicion del pin B3 que representa al motor A, que sea alimentado para ir a izquierda
#define der_B PIN_B4  // definicion del pin B4 que representara al motor B, que sea alimentado para ir a derecha
#define izq_B PIN_B7  // definicion del pin B7 que representa al motor B, que sea alimentado para ir a izquierda

int count=0,CaracteresRecibidos=0,value,MotorA,MotorB;
char c,Buffer[9];
int1 ComandoRecibido;

#INT_RDA
void serial_isr()
{
   c=getc();
   putchar(c);
   Buffer[CaracteresRecibidos]=c;
   if (c==9)
      ComandoRecibido=true;
   else
      CaracteresRecibidos=(CaracteresRecibidos+1)%sizeof(buffer);
}

void Demo()
{

}

void Procesa()
{
   int8 i=0;
   int1 CambiandoA,CambiandoB;

   CambiandoA=false;
   CambiandoB=false;
   while(i<CaracteresRecibidos)
   {
      if((Buffer[i]=='a') || (Buffer[i]=='A'))
      {
         CambiandoA=true;
         CambiandoB=false;
      }
      if((Buffer[i]=='b') || (Buffer[i]=='B'))
      {
         CambiandoB=true;
         CambiandoA=false;
      }
      if((Buffer[i]>='0') && (Buffer[i]<='9'))
      {
         if(CambiandoA)
            MotorA=MotorA*10+Buffer[i]-48;
         if(CambiandoB)
            MotorB=MotorB*10+Buffer[i]-48;
      }
      if((Buffer[i]=='d') || (Buffer[i]=='D'))
         Demo();
      i++;
   }
   printf("Grados establecidos: Motor A = %u, Motor B = %u \n\r\n\r",MotorA,MotorB);
   CaracteresRecibidos=0;
   ComandoRecibido=false;
}

void main()
{
   setup_oscillator(OSC_8MHZ);
   set_tris_b(0b01000101);
   set_tris_a(0b11111111);
   output_b(0);
   output_a(0);
   printf ("Control Motores\n\r\n\r");
   printf ("Introduce la cantidad deseada de grados a girar formato AxxxBxxx\n\r");
   printf ("Puedes modificar solo un motor con (A/B)xxx\n\r");
   printf ("Si escribes DEMO veras una secuencia de giros\n\r");
   SETUP_ADC(ADC_CLOCK_INTERNAL);
   SETUP_ADC_PORTS(sAN0|sAN1|VREF_VREF);
   SET_ADC_CHANNEL(0);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   while(true)
   {
      if(ComandoRecibido)
         Procesa();
   }
}

no esta entrando en mi rutina de procesa() a pesar de que le doy los datos correctos osea axxxbxxx :(  ya sea si pongo 8 o 9 en mi bufer

que es mi error?

un saludo y disculpas las molestias :mrgreen:
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: funcion sizeof()
« Respuesta #1 en: 19 de Febrero de 2008, 03:19:15 »
 :8} :8}

pero qeu tonto soy :( el 13 es el numero ascii del ENTER :D se me estaba olvidando, es que como el buffer de nocturno era tb de 13 pensaba que era ese el número por el que debía preguntar :mrgreen:

jeje, pero no, ahora si esta mbien :-/ :-/

pero si me sigue quedando la duda del sizeof() y del % y para que esa sentencia?
ahh y el warning que sigue saliendo con buffer[9] :(

un saludo muchas gracias y disculpas
.

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
Re: funcion sizeof()
« Respuesta #2 en: 19 de Febrero de 2008, 06:44:50 »
Hola

sizeof() devuelve el tamaño reservado en memoria en bytes de la variable o tipo de datos especificado

osea

Código: [Seleccionar]
char buffer[20];

strcpy(buffer,"hola");

t=sizeof(buffer);        // t=20
t=strlen(buffer);        // t=4

t=sizeof(int16);         // t=2


Saludos


Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: funcion sizeof()
« Respuesta #3 en: 19 de Febrero de 2008, 17:51:36 »
ahh ok muchas gracias por la respuesta juanelete :mrgreen:

algo asi sospechaba, pero no estaba seguro, thx
.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: funcion sizeof()
« Respuesta #4 en: 19 de Febrero de 2008, 18:19:38 »
Respecto al operador %, en este caso se usa para impedir el acceso fuera del "array". Si haces A = B % C, almacenara en A un numero entre 0 y C-1, esto lo hace ideal para controlar el acceso a elementos de los arrays.
Ej:
buff[ x % buff_size ]

El operador % obtiene el resto de la division realizando la division entera y esto puede llevar mas calculos de los necesarior. Si el tamaño de nuestro array es de 2^n podemos utilizar el operador & y tendremos un codigo mas rapido.
Ej:
buff[ x & ( buff_size - 1)]

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: funcion sizeof()
« Respuesta #5 en: 20 de Febrero de 2008, 14:16:00 »
ahh ok muchísimas gracias por la respuesta :mrgreen:

ese tipo de control no lo conocía

ahora si :-/ :-/

gracias un saludo
.


 

anything