Autor Tema: Problema en incremento de un int  (Leído 2220 veces)

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

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Problema en incremento de un int
« en: 27 de Mayo de 2006, 10:07:59 »
Hola muy buenas,

Estoy realizando la conversión de un tipo de dato float a unsigned int, para poder actuar sobre el PWM incrementando una variable. Lo curioso, es que esta variable es incrementada correctamente hasta 127, que es 2 elevado a 8, pero en ese momento toma un valor negativo, y comienza a volverse loco. Además le coloco unos limites al pwm, pero no hace ni caso. ¿Me pueden ayudar?. Lo mejor de todo es que con el resto de sentencias que utilizo de forma similar en mi aplicacion no pasa esto, pero en este caso no logro saber que es lo que pasa. Posteo el código:

float salida;
unsigned int duty_pwm2;

salida = (unsigned int) salida;                 // Cambiando de tipo de dato float a 8 bits sin signo.
              if (salida>0) duty_pwm2++;                      // Incrementamos el duty cicle
              else if (salida>=1024) duty_pwm2=1024;          // Valor máximo del duty cicle
              else if (salida<=0) duty_pwm2=0;                // Valor mínimo del duty cicle

posteriormente uso la sentencia: set_pwm2_duty(duty_pwm2);         // Actuacion del PWM en funcion de la magnitud salida.

Un saludo,

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problema en incremento de un int
« Respuesta #1 en: 27 de Mayo de 2006, 12:05:21 »
Pruébalo así, a ver qué tal:

Código: CSS
  1. float salida;
  2. unsigned int salida_entero;
  3. unsigned int duty_pwm2;
  4.  
  5. salida_entero = (unsigned int) salida;                 // Cambiando de tipo de dato float a 8 bits sin signo.
  6.               if (salida_entero>0) duty_pwm2++;                      // Incrementamos el duty cicle
  7.               else if (salida_entero>=1024) duty_pwm2=1024;          // Valor máximo del duty cicle
  8.               else if (salida_entero<=0) duty_pwm2=0;                // Valor mínimo del duty cicle

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: Problema en incremento de un int
« Respuesta #2 en: 27 de Mayo de 2006, 12:59:35 »
Hola Nocturno,

Gracias por la respuesta, ya probé esta posibilidad, y ocurre lo mismo, en cuanto llega a 127, pasa a -127, y se vuelve loco el valor que me muestra en el display. Tampoco entiendo esto, porque debería entrar en los else if y dar los valores limites. ¿El uso de esta instrucción?, he visto por otros lugares que se usa la instruccíon abs, ¿Puede ser?

duty_pwm2=abs(salida);   //Calculamos el valor absoluto de un entero, necesitamos la libreria stdlib.h

Un saludo,

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problema en incremento de un int
« Respuesta #3 en: 27 de Mayo de 2006, 14:30:08 »
Si el problema esta en la visualización en el display LCD a lo mejor es un problema de la representación. Cambia a la instrucción:

printf("Variable: %u",duty_pwm2); // %u entero sin signo

Saludos.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema en incremento de un int
« Respuesta #4 en: 27 de Mayo de 2006, 14:42:29 »
No, una variable de tipo unsigned int solo admite valores entre -127 y +127, exactamente 256 valores entre 0 y 255, es un solo byte de información la que contiene (8 bits).

Prueba con unsigned long, una variables de DOS bytes (16 bits), que debe admitir valores entre -32768 y +32768, o sea 65536 valores.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problema en incremento de un int
« Respuesta #5 en: 27 de Mayo de 2006, 14:49:27 »
Una variable unsigend int varia entre 0 y 255 (256 valores) y una signed int varia entre -127 y +127 (256 valores). El problema es que tanto el signed como el unsigned utilizan el mismo numero de bits y la función printf no sabe si el bit de mas peso corresponde al signo o no, por eso se lo especificamos nosotros con %u para sin signo y %s para con signo.

Un saludo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: Problema en incremento de un int
« Respuesta #6 en: 29 de Mayo de 2006, 15:18:53 »
Hola amigos,

He probado todas las opciones habidas y por haber, y no hay forma de ver como esa variable va creciendo hasta 127, y de golpe y porrazo se convierte en un -127. Lo primero afianzemos conceptos, que creo que pueden dar lugar a confusión y yo ya estoy liado, sino es correcto me corrigen:

un tipo int, es una variable de 16 bits o 2 bytes, la cual tiene un rango que va desde el -32768 al 32767, dandose el caso del uso de la definición como unsigned int, lo que hace que tome solamente valores positivos desde el 0 al 65533. Por lo que no entiendo porque demonios cambia en 127, ya que da la sensación de que se comporte como un tipo char (8 bits, 1 byte), que va del rango -128 al 127.

Vuelvo a repetir si me equivoco me corrigen y de esta forma seguro que entenderemos que hace CCS cuando ve esta instrucción.

Un saludo,

Tengo un libro en el cual define lo anteriormente mencionado.


Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problema en incremento de un int
« Respuesta #7 en: 29 de Mayo de 2006, 15:25:06 »
Aquí te pongo la definición de prototipos de CCS:

Type-Specifier:
 
int1    Defines a 1 bit number   
int8    Defines an 8 bit number
int16  Defines a 16 bit number
int32  Defines a 32 bit number
char   Defines a 8 bit character
float   Defines a 32 bit floating point number
short  By default the same as int1
Int     By default the same as int8
long   By default the same as int16
void   Indicates no specific type
 
como puedes ver el int es de tipo int8 osea se 8 bits, eso hace que el último bit sea el de signo. Si la variable se declara como unsigned int y ademas al representar la variable en el LCD la ponemos como %u se ha de incrementar de forma correcta. Otra cosa que puedes probar al realizar la conversión es:

sustituyes:

Código: CSS
  1. salida_entero = (unsigned int) salida;

Por:

Código: CSS
  1. salida_entero = make8(salida,0);

Un saludo.
« Última modificación: 29 de Mayo de 2006, 15:32:17 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Problema en incremento de un int
« Respuesta #8 en: 29 de Mayo de 2006, 15:31:22 »
Amigo Ore, te lo puesto haces post anteriores:

int = 1 byte (256 valores posibles ó -127 a +127 si es con signo)

long = 2 bytes (65535 valores posibles ó  -32768 y +32768 si es con signo)

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado ORE

  • PIC10
  • *
  • Mensajes: 43
Re: Problema en incremento de un int
« Respuesta #9 en: 01 de Junio de 2006, 17:19:38 »
Hola,

Lo primero muchas gracias a ambos. He probado de realizar lo siguiente:

// Declarar la variable como unsigned int16 duty_pwm2

unsigned int16 duty_pwm2;

pero a la hora de intentar mostrarlo por el lcd, me da el siguiente error:

Print format type is invalid

//En el programa para mostrarlo en el lcd coloco la siguiente instrucción

printf(lcd_putc,"%u",duty_pwm2);

Creo que el problema estará en mi subrutina lcd, pero intentare colocar un tipo long para poder obtener el mismo resultado.

Un saludo,

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problema en incremento de un int
« Respuesta #10 en: 01 de Junio de 2006, 18:21:59 »
Los formatos para printf son:

c   Character
s   String or character
u   Unsigned int
d   Signed int
Lu  Long unsigned int
Ld  Long signed int
x   Hex int (lower case)
X   Hex int (upper case)
Lx  Hex long int (lower case)
LX  Hex long int (upper case)
f    Float with truncated decimal
g   Float with rounded decimal
e   Float in exponential format
w  Unsigned int with decimal place inserted. Specify two numbers for n. The first is a total field width. The second is
    the desired number of decimal places.

Por consiguiente deberas poner:

printf(lcd_putc,"%Lu",duty_pwm2);

Un sañudo.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús