En lo que a mí respecta, no hay necesidad de una división flotante aquí, si solo va a convertir el resultado en un entero y escribir en un puerto. El resultado de la división flotante se truncará para obtener un entero, por lo que puede hacer aritmética de enteros.
unsigned int input;
unsigned char output;
void main(){
TRISA = 0x00;
input = 1000;//operator has input 1000
output = input/100;//scale input by 100
PORTA = output;//output 6-bit number
while (1); //while away once the program is done
}
Para la independencia de la implementación, puede incluir stdint.h
y usar uint8_t
y uint16_t
para definir output
y input
respectivamente, aunque eso no es necesario aquí. Si desea los beneficios de la división flotante, debe redondear .
#include <math.h>
unsigned int input;
unsigned char output;
void main(){
TRISA = 0x00;
input = 1000;
output = round((double)input/100.0); // implicit cast to uchar
PORTA = output;
while (1); //while away once the program is done
}
Debo mencionar que este último enfoque es más costoso que el anterior, debido a su aritmética de punto flotante. Use esto solo si necesita la precisión adicional.
EDITAR:
Un compromiso sería agregar una compensación a input
y luego dividir; esto aumenta la precisión de sus resultados al simular el redondeo con números enteros. Es mucho más eficiente que la opción de punto flotante.
unsigned int input;
unsigned char output;
void main(){
TRISA = 0x00;
input = 1000;
output = (input + 50) / 100;
PORTA = output;
while (1); //while away once the program is done
}