
/*#####################################################
// Float Numbers for AVR (AVR-Studio4)
//#####################################################

Immer wieder mal muß man konvertieren. Und oft fragt man Tante Google wieder.
Hier die Standardvarianten in Kurzform. Die Funktionen werden nach unten zunehmend 
komfortabler und platzintensiver. Für sprintf sollten 4kByte Flash frei sein.
Für den ATtiny (1...2...4k)empfehlen sich utoa() und itoa(), beim ATmega8 (8k Flash) 
geht bereits das komfortable sprintf(). 


//#####################################################
// utoa, itoa:
//#####################################################

   // utoa: Unsignad integer to Ascii
   // itoa: Integer to Ascii (dito)
   // Example:

   #include <stdlib.h>                  // utoa, itoa

   uint16_t number = 0x23a7;
   char string[20] = {"\0"};

   uputs( utoa( number, string, radix ) ); 
               // number:  integer number as input
               // string:  ascii-string for output 
               // radix:   exponent 2 to 36; decimal: 10
   uputs("; \r\n");       // Ausgabe im CSV-Format

   // Hier gibt es nette Tips dazu:
   // http://www.mikrocontroller.net/articles/Festkommaarithmetik


//#####################################################
// dtostrf:
//#####################################################

   #include <stdlib.h>                       // dtostrf

   The dtostrf() function converts the double value val into
   an ASCII representation that will be stored under s. The caller
   is responsible for providing sufficient storage in s.

   Conversion is done in the format "[-]d.ddd".  The minimum field
   width of the output string (including the '.' and the possible
   sign for negative values) is given in width, and prec determines
   the number of digits after the decimal sign. width is signed value,
   negative for left adjustment.

   The dtostrf() function returns the pointer to the converted string s.

   extern char *dtostrf(      double __val, 
                              signed char __width,
                              unsigned char __prec,
                              char *__s);

//#####################################################
// sprintf:
//#####################################################


   // ACHTUNG: sprintf braucht die Library lib_printf_flt.a 
   // für float-Konversion. Dazu eintragen in 
   // Project/Configuration/Libraries:

   //      lib_printf_flt.a      // Reihenfolge beachten!
   //      libm.a                // Reihenfolge beachten!

   // dann in Project/Configuration/Custom Options/Linker Options
   //             -Wl,-u,vfprintf

   // http://www.mikrocontroller.net/articles/FAQ
   // #Aktivieren_der_Floating_Point_Version_von_sprintf_bei_WinAVR_bzw_AVR-Studio
   // bei float-Fehler: lib_printf_flt.a einbinden

   // Beispiel:
   #include <stdio.h>               // printf scanf etc.
   sprintf(outstr,"* chl[%d] ~ %dnm ~ Ion_K%d \r\n", i, chl[i].nm, chl[i].k);
   uputs(outstr);


//#####################################################
// printf:
//#####################################################


   // stdout umlenken, um printf einzubinden:
   // __mulhi3 fehlt: libgcc.a einbinden (sollte eigentlich vorhanden sein)

   // Beispiel:

   #include <stdio.h>               // printf scanf etc.
   static FILE uartout = FDEV_SETUP_STREAM( uputc, NULL, _FDEV_SETUP_WRITE );
   stdout = &uartout;   // printf schreibt auf stdout mit FILE-struct
   int uputs( char ch, FILE *stream) { uputc( ch); return 0;}

*/




