TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: maritov en 10 de Octubre de 2008, 23:57:05
-
Hola Gente!!
estoy evaluado lo sigiente en un if:
if(espera - 0x09)> 0x05 )
los declaré así:
char espera;
Lo que sucede es que cuando espera=8, la condicion es TRUE, o sea, cuando la resta es negativa me lo toma que es mayor 5.
Alguien sabe como tratar esto????
-
unsigned int espera;
-
Si ese if está copiado textualmente del código original, pués ni debería compilar
if((espera - 0x09)> 0x05 )
le falta un paréntesis
-
Si ese if está copiado textualmente del código original, pués ni debería compilar
if((espera - 0x09)> 0x05 )
le falta un paréntesis
No se q onda CCS, pero por lo menos el gcc en la compu, resuelve todas las operaciones antes de compararlas. No es asi en CCS?
-
La precedencia de los operadores es algo que he visto en muchos lenguajes de programación.
primero se ejecuta lo que está encerrado entre-paréntesis
pero no se si es un error de tipeo de maritov.
-
Hola.
La variable espera deberia declararse como signed int.
PD// Ojo con los rangos de las variables.
Saludos
-
Hola, el problema es como toma el compilador el default del char, que puede ser asgineado o signeado, aca es claro que lo toma como asigneado, ya que 8-9 = -1 o 0xFF y por ende mayor que 5, seguramente el compilador te permita cambiar esto o sino hace como te indica MLO.
Saludos !
-
Toma ya "palabro1", no seria mejor decir: "lo toma con signo o sin signo", lo comento por que seguramente algún lector del hilo se quede con la boca abierta preguntándose que es eso de "signeado"
Un saludo
1- palabro: Palabra mal dicha o estrambótica. (tomado de la página de la RAE).
-
Antes que nada amigos, gracias por ineresarse y aportar, voy a ir respondiendo por partes aca cada uno de Uds.:
unsigned int espera;
Probé de esa manera y el problema persiste.
Si ese if está copiado textualmente del código original, pués ni debería compilar
if((espera - 0x09)> 0x05 )
le falta un paréntesis
Corregí el tema de los parentesis!! Y el problema persiste aún!!
La precedencia de los operadores es algo que he visto en muchos lenguajes de programación.
primero se ejecuta lo que está encerrado entre-paréntesis
pero no se si es un error de tipeo de maritov.
Corregí el tema de los parentesis!!!
Hola.
La variable espera deberia declararse como signed int.
PD// Ojo con los rangos de las variables.
Saludos
Probé con signed int espera; .....y el problema persiste!!!! :? ¿Pero por lo que entiendo signed en 8 bits no va desde -128 a 127??
Hola, el problema es como toma el compilador el default del char, que puede ser asgineado o signeado, aca es claro que lo toma como asigneado, ya que 8-9 = -1 o 0xFF y por ende mayor que 5, seguramente el compilador te permita cambiar esto o sino hace como te indica MLO.
Saludos !
Coincido con vos!! Ahora, ¿habrá alguna manera que 0xff NO sea -1?
A modo de conclusión yo veo que una variable int (o int8, ya no uso mas char para evitar confusiones) está expresada en complemento a dos, o sea que un numero de 8 bits puede representar desde -128 a 127. Mi pregunta: ¿Habrá alguna manera de NO usar complemento a doscomplemento a dos (http://es.wikipedia.org/wiki/Complemento_a_dos)? Yo creí que usando unsigned lo lograba....pero no!.
Saludos
Toma ya "palabro1", no seria mejor decir: "lo toma con signo o sin signo", lo comento por que seguramente algún lector del hilo se quede con la boca abierta preguntándose que es eso de "signeado"
Un saludo
1- palabro: Palabra mal dicha o estrambótica. (tomado de la página de la RAE).
Si esto que dice jfh900 hace bien a la comunicación (y asi lo creo), bienvenido sea!!!
Saludos a todos
-
Prueba a utilizar una variable intermedia:
unsigned int operacion;
operacion = espera - 0x09;
if(operacion > 0x05 )
También puedes probar un TypeCast:
if((unsigned int)(espera - 0x09)> 0x05 )
Un saludo
-
Hola.
Por eso te coloque la PD, por el rango. Para aumentar el rango colocalo como signed int16 o signed int32.
Saludos
-
Hola
Pues lo he probado asi:
#include<16F877A.h>
#fuses XT
#use delay(clock=4M)
signed int espera=0;
void main (void)
{
while(true)
{
if((espera-0x09)>0x05)
on(pin_e0);
else
on(pin_e1);
espera++;
}
}
y si cambia :-/
Saludos