Forum: Mikrocontroller und Digitale Elektronik hypothenuse berechnen mit 8051


von metallman (Gast)


Lesenswert?

Hallo.

Ich muss ein C-Programm für einen 8bit-Mikrocontroller schreiben, das 
folgendes berechnet:

c = Wurzel(a*a + b*b)

prinzipiell ist alles klar. nur müssen follgende bedingungen erfüllt 
werden:

es muss die Funktion sqrt() verwendet werden
da program soll mit der adresse 2000h starten
die variablen  a und b sollen 2 byte lang sein und im Bereich 42h-43h 
liegen
das Ergebnis c soll 3 byte lang sein und im Bereich 44h-46h
es gibt noch einen temporary Bereich für zwischenergebniss: 47h-4Fh

NUn ist meine frage: wie kann ich in C die festgelegten adressen für die 
Variablen und Ergebnisse festlegen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> NUn ist meine frage: wie kann ich in C die festgelegten adressen für die
> Variablen und Ergebnisse festlegen?
Das steht in der Doku des Compilers...
BTW: Welcher ist das denn überhaupt?

Du kannst natürlich auch einfach drei Zeiger verwenden, die auf diese 
Adressen gebogen werden. Wie das geht steht in der Doku deines 
Compilers...

>  a und b sollen 2 byte lang sein
Jeweils oder insgesamt?
> und im Bereich 42h-43h liegen
Dann kann es eigentlich nur jeweils 1 Byte sein...
> das Ergebnis c soll 3 byte lang sein und im Bereich 44h-46h
Warum ist dann das Ergebnis gleich 3 mal so lang?

von ccccccc (Gast)


Lesenswert?

Für die 2 Byte Variablen geht das etwa so:

short * a = (short *) 0x42;
short * b = (short *) 0x44;

*a = 123;
*b = 312;

(Wie soll man 2x 2 Byte Variablen in einen 2 Byte großen Bereich 
speichern ?)

Wenn die dritte Variable wirklich nur 3 Byte lang sein darf muss man 
dann etwas tricksen.

char * c = (short *) 0x...;

Und dann mit Hilfe von Verschieben in c[0], c[1], c[2] speichern.

von metallman (Gast)


Lesenswert?

ich verwende uVision und da ist, glaube ich, C51 compiler integriert.

die jeweiligen Variablen sollen 2 Byte lang sein. Ich habe da falsch 
aufgeschrieben. Es muss heißen:
Für Variable a: 1. Byte: 40h, 2. Byte 41h
Für b: 1. Byte 42h, 2 Byte 43h


also, wenn man diese Zeiger verwendet, heißt das, dass man die Bytes 
einzeln aus dem Speicher holen muss, um die Wurzel berechnen zu lassen? 
Sehe ich das richtig?

von Uhu U. (uhu)


Lesenswert?

Du solltest erst mal richtig C lernen, bevor du ein Programm mit 
dermaßen kruden Vorgaben schreibst. (Und wenn du es gut kannst, wirst du 
vermutlich von solchem Unsinn Abstand nehmen.)

> es gibt noch einen temporary Bereich für zwischenergebniss: 47h-4Fh

Wenn sqrt auch diesen temporären Bereich benutzen soll, dann wirst du 
die wohl selbst schreiben müssen...

von Simon K. (simon) Benutzerseite


Lesenswert?

Uhu Uhuhu schrieb:
> Du solltest erst mal richtig C lernen, bevor du ein Programm mit
> dermaßen kruden Vorgaben schreibst.

Ja, ich vermute mal das ist Informatik/Mikrocontrollertechnik im 
Studium, da sind solche Vorgaben schon mal sehr realistisch ;) Was die 
allerdings mit der heutigen Realität zu tun haben, kann (konnte) ich 
auch nicht nachvollziehen.

von Uhu U. (uhu)


Lesenswert?

Simon K. schrieb:
> Ja, ich vermute mal das ist Informatik/Mikrocontrollertechnik im
> Studium, da sind solche Vorgaben schon mal sehr realistisch ;) Was die
> allerdings mit der heutigen Realität zu tun haben, kann (konnte) ich
> auch nicht nachvollziehen.

Was sind das für Dozenten, die sich solchen Krampf ausdenken? 
Professionell ist das nicht.

Wenn sowas tatsächlich gemacht werden muß, würde ich ASM nehmen. Da ist 
alles kontrollierbar.

von Klaus W. (mfgkw)


Lesenswert?

Also wenn die Aufgabe wirklich lautet,
1. das Programm in C zu schreiben, und
2. die Variablen an bestimmten Adressen zu haben,
dann hat derjenige, der die Aufgabe gestellt, den Schuß
nicht mehr gehört.

Abgesehen davon kann sqrt() aus der Standard-Lib nichts mit ganzen
Zahlen anfangen, egal wieviele Bytes.

Wie sagten mein Großeltern immer so schön:
Unser Herrgott hat einen großen Tiergarten...

von metallman (Gast)


Lesenswert?

@UhuUhuhu & Klaus :

ey, jungs! wo ist denn das problem??

OK. in assembler kann man das alles gganz gut machen. warum nicht in C?
wieso darf man so was nicht ausprobieren? ich baue doch keinen raumschif 
ich lerne doch nur?

von Uhu U. (uhu)


Lesenswert?

Ausprobieren darfst du es natürlich. Aber wenn du dann auch noch meinst, 
hier fragen zu müssen, dann machst du definitiv was falsch...

von Bernd (Gast)


Lesenswert?

... da program soll mit der adresse 2000h starten ...

Arbeitest du mit der EVA-Version von Keil?

von Simon K. (simon) Benutzerseite


Lesenswert?

Das erste Problem ist, dass man in C Variablen nicht an bestimmte 
Adressen legt, dafür gibt es den Compiler, dafür wurde er (unter 
anderem) erfunden. Und die Zeigerverbiegerei oben ist mehr ein Hack als 
eine Lösung und verleitet zu schlechtem Programmierstil.

von Klaus W. (mfgkw)


Lesenswert?

metallman schrieb:
> @UhuUhuhu & Klaus :
>
> ey, jungs! wo ist denn das problem??
>
> OK. in assembler kann man das alles gganz gut machen. warum nicht in C?
> wieso darf man so was nicht ausprobieren? ich baue doch keinen raumschif
> ich lerne doch nur?

Das war auch kein Vorwurf an dich; die Aufgabenstellung ist krank.
(Es wäre ein Vorwurf an dich, wenn die Aufgabe von dir käme...)
Wenn die Aufgabe nun mal so ist, habe ich auch kein Problem, wenn du
hier um Rat fragst, wenn du nicht weiter kommst.
Aber Mist bleibt Mist, das muß man dann auch so sagen können.

Warum es Schwachsinn, hat Simon schon gesagt, außerdem die
Geschichte mit sqrt(), das für double ist und nicht für ganze Zahlen.

von Karl H. (kbuchegg)


Lesenswert?

Ich könnte ja noch verstehen, wenn sich der Lernende ein Verfahren zur 
Wurzelberechnung für ganze Zahlen überlegen soll. Aber so, mit diesen 
Vorgaben, ist das einfach nur relaitätsfremd. Die Aufgabenstellung hat 
so keinen praktischen Wert.

von Simon K. (simon) Benutzerseite


Lesenswert?

Okay, zugegeben genau das ist mir so in den 2 Semestern mit 
Programmierung (PC und Mikrocontrollertechnik in diesem/letzten Jahr) 
noch nicht passiert, aber ne Menge anderer komischen Sachen, die nicht 
Standardkompatibel waren oder die man ohne Probleme als Hack bezeichnen 
konnte. Das war Gang und gebe bei uns im vorletzten/letzten Semester und 
lief auch mit genau dem Compiler glücklicherweise.
Als das schlimmste habe ich immer empfunden, das den Kollegen erklären 
zu müssen, die sich immer mal an mich gewandt haben und gefragt haben, 
wo der Sinn bei diesem und jenem ist. Und da ich das korrekt machen 
will, musste ich sie dann aufklären, was daran Hack ist, warum und wie 
man es besser macht.
Dadurch waren die natürlich schnell überfordert und verwirrt, eben wegen 
meinem Drang alles möglichst korrekt machen zu wollen ;) Waren ja auch 
teilweise Leute die damit das Erste mal zu tun haben.
Von daher ist es im Studium auf kurze Sicht gesehen besser, wenn man 
Hacks benutzt und den Studenten sagt "ist so". Wenn man das nicht machen 
würde, wäre der Stoff gar nicht zu schaffen in einem Semester. Auf lange 
Sicht aber haben die nichts davon. Das zu der "Notwendigkeit" von 
solchen komischen Sachen.
Okay, mit dem Beispiel hier hat das eher nichts zu tun, aber es gibt 
genug andere gleichartige komische Aufgabenstellungen würde ich mal 
vermuten.

Ich hab das Programmieren auch nicht in 6 Monaten gelernt, sondern eher 
in locker 6 Jahren mittlerweile (früh angefangen ;)). Wobei ich jetzt 
hiermit nicht behaupten möchte fertig zu sein mit dem Lernprozess. Dazu 
wird es nie kommen.
C komplett in einem Semester zu machen ist meiner Meinung nach krank und 
zeugt ebenfalls von Realitätsfremdheit. Programmieren lernt man durch 
Programmieren und durch schauen wie andere (mit viel Erfahrung) etwas 
gelöst haben und dann Vergleiche zur eigenen Lösung zu ziehen.
Aber was will man machen ;)

Achso, man sollte auch noch dazu sagen, dass die meisten Dozenten aus 
der Anfangszeit der 8051er stammen. Da war das Thema Compiler ja noch 
nicht so ein großes Ding. Die Features eben dieser hielten sich in 
Grenzen, weswegen manche Sachen durchaus normal waren damals, die man 
heute so nie mehr machen würde, weil der Compiler bereits eigene, 
bessere, Funktionen/Deklarationen/Wasauchimmer zur Verfügung stellt.
Ich sag nur uint8_t vs char. "Hä, char ist doch für Zeichen, wurde 
vorhin gesagt, wieso wird jetzt damit gerechnet?" :-(

So, bisschen OT, wo waren wir :-)

Wir hatten damals auch den C51 Compiler im Studium, gab es da nicht eine 
Möglichkeit Variablen direkt bei der Deklaration an bestimmte Adressen 
zu verpflanzen?

von metallman (Gast)


Lesenswert?

wie auch immer.. dann laß ich halt den scheiß sein.


@ Simon:

Wie hast du denn programmieren gelernt? Gibt es eine lernmethodik um 
erfolgreich C zu lernen?

von Karl H. (kbuchegg)


Lesenswert?

metallman schrieb:
> wie auch immer.. dann laß ich halt den scheiß sein.
>
>
> @ Simon:
>
> Wie hast du denn programmieren gelernt? Gibt es eine lernmethodik um
> erfolgreich C zu lernen?

Kernighan&Ritchie lesen. Die Übungen im Buch machen.
Und dann: üben, üben, üben.
Nach einiger Zeit fremde Programme studieren. Richtig studieren, nicht 
einfach abschreiben, sondern vergleichen, die Idee hinter dem Programm 
rausfinden, Techniken lernen. etc.
Und dann natürlich noch: üben, üben, üben

von Simon K. (simon) Benutzerseite


Lesenswert?

Wenn du es machen musst, also die Aufgabe dazu bekommen hast, kannst du 
es ja schlecht sein lassen :-)
Kannst ja mit den vorhandenen Informationen erst mal selber versuchen 
was zusammenzustricken. Dadurch legst du mal selber Hand an und das ist 
der erste Schritt dazu ein Gefühl für das Programmieren zu kriegen.

Wie gesagt, Um Programmieren zu lernen hilft nur Programmieren. Sich 
irgendwelche Aufgaben stellen und mal überlegen wie man da ran gehen 
könnte. Für die C Syntax und die Basics auf jeden Fall ein Buch kaufen 
(Den Klassiker von Ritchie und Kernighan) oder in diversen Tutorials 
stöbern:
http://openbook.galileocomputing.de/c_von_a_bis_z/
Hauptsache du fängst irgendwie an zu programmieren. Dann mit fertigen 
Programmen andere Leute fragen, was man verbessern könnte. Dafür finden 
sich immer Leute wenn du mal hier im Forum fragst, sowas ist in der 
Regel kein Problem. Und wenn du dabei sagst, dass du das Programm aus 
eigenem Interesse "optimieren" lassen willst durch die Forumsuser, dann 
kommt das sicher nicht negativ rüber ;)
Es kommt jedenfalls besser rüber, als nach der Lösung eines Problems zu 
fragen, ohne mal selber sich Gedanken gemacht zu haben (Ist jetzt nicht 
böse gemeint. Gerade als Anfänger ist man schnell mal überfordert, habe 
ich ja auch gemerkt bei meinem Amt als "ehrenamtlicher Nachhilfelehrer" 
im Studium :-) ;)).

@Karl Heinz: Sag nicht "üben", das hört sich nach Schule und 
unangenehmer Arbeit an ;) (Auch wenn ich jetzt kein alternatives Wort 
weiß :-)). Wenn das eigene Interesse am Programmieren-wollen groß genug 
ist, dann ist es eher einer netter Zeitvertreib und kann durchaus Spaß 
machen.

Übrigens, Programmieren lernen geht in der Regel am PC besser, da man 
hier bessere Debug Möglichkeiten hat (Also der Ausführung des Programms 
durch den Prozessor "zuzusehen", Inhalte von Variablen zu überprüfen und 
dergleichen).
Wenn man dann mit Mikrocontrollern anfängt sollte man eine Ahnung davon 
haben, wo Stolperfallen liegen, die man so ohne weiteres gar nicht so 
leicht finden würde auf einem Mikrocontroller.
Zum Beispiel Speicherbereichsübertretungen. Der PC gibt dir sofort eine 
Fehlermeldung an den Kopf. Der Mikroprozessor macht nichts, macht 
komische Sachen oder startet neu.

von Karl H. (kbuchegg)


Lesenswert?

Simon K. schrieb:

> @Karl Heinz: Sag nicht "üben", das hört sich nach Schule und
> unangenehmer Arbeit an ;)

OK. Kritik angekommen :-)

von Uhu U. (uhu)


Lesenswert?

Da hat der Troll metallman ja eine richtige Grundsatzdebatte 
losgetreten. Ob er der auch folgen kann?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.