N76E003 C-Kurs
- 2
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!