Autor Tema: division por 1000  (Leído 1513 veces)

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

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
division por 1000
« en: 11 de Agosto de 2012, 18:03:46 »
tengo una variable long conteo ( es entera)que se incrementa cdo hay una interrupcion por rb0. este incremento  se muestra por el lcd.
esta variable la quiero dividir por 1000 lo que hago en el programa es definir
float division; ( va a tener coma)

division= conteo /1000;
y muestro
printf(lcd_putc,"division %1.3f",division);

En el lcd no aparece ningun resultado solo 0.000
no se que estoy haciendo mal.
Una mano por favor. Gracias
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: division por 1000
« Respuesta #1 en: 11 de Agosto de 2012, 18:10:35 »
Deberas hacer un Cast, cuando divides un entero por otro entero, si no lo haces, el valor sigue siendo entero, y no se representa como float.

Algo asi deberas hacer:

Código: C
  1. float division; ( va a tener coma)
  2.  
  3. division= float( conteo /1000.0);
  4.  
  5. printf(lcd_putc,"division %1.3f",division);

Pruebalo asi... ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re: division por 1000
« Respuesta #2 en: 11 de Agosto de 2012, 18:47:16 »
me da este error "A numeric expression must appear here".`pongo el programita para ver si me puedes ayudar


#include <18f4520.h>  //PIC utilizado         
#fuses XT,NOWDT,NOPROTECT,PUT  //Configuramos los fuses
#use delay (clock=4000000)     //Oscilador a 4Mhz
#use fast_io(b)   //Optimizamos E/S del PORTB
#byte trisb = 0x86
#byte portb = 0x06
#include <lcd.c>
#byte option_reg = 0x81
long conteo=0;
float division;
#int_ext         //atención por cambio en rb0
ext_isr(){       //funciòn interrupción
conteo++;
}   

//------Programa principal-----
void main(){

lcd_init();
set_tris_b(0x01);
port_b_pullups(true);
enable_interrupts(int_ext);
ext_int_edge(H_to_L);
enable_interrupts(global);
//energia=pulsos/1000;

while (1)
{
division=float(conteo/1000.0);
lcd_gotoxy(1,1);
printf(lcd_putc,"conteo:%04ld",conteo);
lcd_gotoxy(1,2),
printf(lcd_putc,"division:%1.3f",division);
}
}

Gracias
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re: division por 1000
« Respuesta #3 en: 11 de Agosto de 2012, 19:12:34 »
gracias solucione el tema era por los parentesis ((float)conteo)/1000;
lo publico talvez a a lguno le sirva
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: division por 1000
« Respuesta #4 en: 11 de Agosto de 2012, 19:20:48 »
Y cuidado con las constantes...

1000 es distinto de 1000.0 para el compilador. 1000 te lo va a considerar como un integer, mientras que indicandole 1000.0 le estás indicando explícitamente que querés que lo interprete como variable float.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: division por 1000
« Respuesta #5 en: 11 de Agosto de 2012, 20:56:07 »
Asi es, prueba escribirlo como dice Bruno, asi ya vas quitando las malas costumbres que adquirimos al ir aprendiendo a programar.
Incluso comenta en tu software porque haces lo que haces, asi lo recuerdas tu mismo cuando lo leas en unos años... ;-)
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re: division por 1000
« Respuesta #6 en: 20 de Agosto de 2012, 17:08:16 »
Gracias por el aporte. Sobre este mismo programita funciona correctamente el conteo cuanto aparece un pulso H to L en Rb0. Lo incremento por interrupciòn. Lo que sucede es que el mismo no se realiza desde cero como dice el programa.
Si quieres trascender..., enseña humildemente  lo que sabes.