N76E003 C-Kurs - 2    


Elektronik-Labor  Projekte  Nuvoton 





Die Übung bezieht sich auf das Kap. 3,2, Fließkomma-Zahlen  aus dem Buch C programmieren von Anfang an, von Helmut Erlenkötter, rororo, 25. Auflage Juli 2019. Ich verwende jetzt das Kommentarzeichen // für die Programmnamen aus dem Buch. Dann kann ich alle alten Tests mit /*  */ abtrennen, sodass sie nicht mehr kompiliert werden. Alle Programme bis zum Ende dieser Lektion kann man hier laden:  Ckurs2.zip

Zunächst einmal muss ich <float.h> einbinden.  Dann zeigen sich sehr schnell noch andere Besonderheiten des SDCC. Es gibt kein scanf für den 8051. Also muss ich meine Eingaben erstmal als Konstanten reinschreiben. Danach wird alles korrekt übersetzt. ABER:



Die Steuersequenz t2 sollte eigentlich zwei Töne ausgeben. Dass printf das nicht kann, ist einzusehen. Aber leider können auch keine Float-Zahlen ausgegeben werden. Das ist schon etwas schmerzlich.


#include <N76E003.h>
#include <stdio.h>
#include <float.h>

 // bsp10006.c
void main(void)
{
    float x,y;
    P0M1=0;P0M2=0;P1M1=0;P1M1=0;
    InitUART0_Timer1(9600);
    printf ("\n\nt2 , R e c h e n p r o g r a m m e\n");
    //printf ("\nBitte x eingeben:");
    //scanf("%f",x);                     //kein scanf für 8051
    x = 300.0;
    //printf ("\nBitte y eingeben:");
    //scanf("%f",y);
    y = 200.0;
    printf ("\n %f + %f ist %f", x,y,x+y);
    printf ("\n %f - %f ist %f", x,y,x-y);
    printf ("\n %f * %f ist %f", x,y,x*y);
    printf ("\n %f / %f ist %f", x,y,x/y);
    while (1);
}

Also gut, dann setzte ich eine Umwandlung in Integer vor die Ausgaben:



Zum Kopieren direkt aus der Seite:

#include <N76E003.h>
#include <stdio.h>
#include <float.h>

void InitUART0_Timer1(long Baudrate);
char getchar(void);
void putchar(char);
void delay(void);

 // bsp10006.c neu
void main(void)
{
    float x,y;
    P0M1=0;P0M2=0;P1M1=0;P1M1=0;
    InitUART0_Timer1(9600);
    printf ("\n\R e c h e n p r o g r a m m e\n");
    x = 300.0;
    y = 200.0;
    printf ("\n %d + %d ist %d", (int)x,(int)y,(int)(x+y));
    printf ("\n %d - %d ist %d", (int)x,(int)y,(int)(x-y));
    printf ("\n %d * %d ist %d", (int)x,(int)y,(int)(x*y));
    printf ("\n %d / %d ist %d", (int)x,(int)y,(int)(x/y));
    while (1);
}



Die ersten beiden Ergebnisse sehen gut aus. Aber 60000 passt nicht in Integer und wird deshalb als negativer Rest unter 65336 angezeigt. Und 1,5 wird brutal auf 1 gerundet. So langsam wird mir klar, dass ein 8-Bit-Controller nicht dafür prädestiniert ist, solche Aufgaben zu übernehmen. Vielleicht ist es besser, wenn man letztlich mit Ganzzahlen arbeitet. Und das geht auch, wenn man Vorkomma- und Nachkommastellen getrennt verarbeitet. Außerdem habe ich die zu verarbeitenden Zahlen etwas kleiner gehalten, damit alles in Integer passt.



 // bsp10006.c  ganz neu
void main(void)
{
    float x,y,z;
    int a,b;

    P0M1=0;P0M2=0;P1M1=0;P1M1=0;
    InitUART0_Timer1(9600);
    printf ("\n\R e c h e n p r o g r a m m e\n");
    x = 30.0;
    y = 20.0;
    printf ("\n %d + %d ist %d", (int)x,(int)y,(int)(x+y));
    printf ("\n %d - %d ist %d", (int)x,(int)y,(int)(x-y));
    printf ("\n %d * %d ist %d", (int)x,(int)y,(int)(x*y));
    z=x/y;
    a=(int)z;   //Vorkomma
    z=1000*(z-a);
    b=(int)z;   //Nachkomma, 3 Stellen
    printf ("\n %d / %d ist %d,%d", (int)x,(int)y,a,b);
    while (1);
}




Funktioniert!





Elektronik-Labor  Projekte   Nuvoton