Forum: Mikrocontroller und Digitale Elektronik Assembler Programm mit C routine?


von Florian (Gast)


Lesenswert?

Hallo miteinander, ich schreibe momentan ein Programm in 8051 Assembler 
auf den C509 Mikrocontroller.
Nun möchte ich fragen ob ich in diesem Assembler Programm eine C++ 
Routine einbauen kann??

Wäre froh wenn ihr mir helfen könnt.

Gruss und Danke

Euer Florian

von Gast (Gast)


Lesenswert?

Im Prinzip ja, aber ...

Es wäre einfacher, von einem C-Programm Assembler-Routinen aufzurufen.

Wenn Du es dennoch probieren willst, lasse Dir aus Deinen C-Routinen 
nicht den Code sondern einen Assembler Quellcode erzeugen, den Du dann 
einbinden und mit übersetzen lassen kannst.
Du mußt aber beachten, daß Stack und andere Speicherbereiche von Deiner 
Assemblerquelle zur Verfügung gestellt und initialisiert werden müssen.

von SiMa (Gast)


Lesenswert?

Am einfachsten wird es sein, wenn Du ein C-Programm schreibst, das 
sofort Deinen Assembler-Code aufruft. Dann sind alle Initialisierungen 
für Deine C-Routine erledigt und kannst sie später bedenkenlos aufrufen.

Aber mal eine Frage: Welchen Compiler willst Du denn nutzen? Ich frage, 
weil Du C++ und nicht C nutzen willst. Ich kenne keinen vernünftigen 
C++-Compiler für 8051...

von Florian (Gast)


Lesenswert?

Momentan habe ich das Microsoft Visual Studio 2005 zur verfügung...

von Peter D. (peda)


Lesenswert?

Florian wrote:
> Momentan habe ich das Microsoft Visual Studio 2005 zur verfügung...

Und da kann man wirklich als Target den 8051 auswählen?


Peter

von Pieter (Gast)


Lesenswert?

moin moin,

@Florian,
poste mal die C-Function, mal sehen wozu die notwendig ist.

Pieter

von Florian (Gast)


Lesenswert?

Habe die C-Routine noch nicht geschrieben, aber ich möchte eigentlich 
nur eine Zahl (200) durch einen gemessenen Wert (0.1 - 200) dividieren 
und dann das Resultat mit 3.6 multiplizeren.

Habe keine Ahnung ob das mit einer C-Routine funktionieren könnte..

Gruss

von Matthias L. (Gast)


Lesenswert?

Klingt nach ner Geschwindigkeitsmessung, wo eine Zeit für einen Weg von 
200 ermittelt wird und das dann auf km/h umgerechnet werden soll....

von Florian (Gast)


Lesenswert?

jaaaa genau.. das sollte es werden=)

von Matthias L. (Gast)


Lesenswert?

Und warum willst du gerade DAS STÜCK in C schreiben? Ich vermute, du 
programmierst den Rest ja auch in ASM...

von Karl H. (kbuchegg)


Lesenswert?

Wie du schon mitgekriegt haben wirst, ist das Einbinden einer
C-Funktion in ein Assembler Programm nicht so das wahre
(wenn ich mal die Methode "den Compiler ein Assemblerlisting
generieren lassen und dann abtippen" ausser acht lasse).

Anders rum ist das meist einfacher: Ein C Programm schreiben,
das in manchen Stellen auf Assembler Funktionen zurückgreift.

Allerdings erhebt sich bei mir bei deiner Aufgabenstellung
die Frage: Wozu brauchst du da überhaupt Assembler?

von Karl H. (kbuchegg)


Lesenswert?

Matthias Lipinsky wrote:
> Und warum willst du gerade DAS STÜCK in C schreiben? Ich vermute, du
> programmierst den Rest ja auch in ASM...

Hehe :-)
Meine Kristallkugel sagt: Weil er sich die Matheroutinen
ersparen will :-)

von Florian (Gast)


Lesenswert?

Mein Ausbildner wollte dass ich das ganze in Assembler schreibe, weil 
ich bei meiner Teilprüfung in 2 Monaten auch Assembler programmieren 
muss.
Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen 
und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach 
nicht genau hin, deshalb habe ich mir jetzt überlegt ob man das mit 
einer C-Funktion machen kann.

Gruss

von Matthias L. (Gast)


Lesenswert?

Wenn du y= 200 / x * 3.6 rechnen willst, mit x = 0.1 ... 200
würde ich folgendes Vorschlagen:

y = 7200 / x    mit x= 1..2000
Damit umgehst du numerische PRobleme, sowie Kommazahlen.
Bei Anzeigen machst du einfach einen Punkt vor die letzte Stelle.
ZUr Rechnung kannst ja mal in den Anhang dieses Links gucken:

Beitrag "Re: Schnelle(re)s Quadrieren??"

Da nimmst du die Div Routine, rüfst die mit 7200 und x auf und fertig.

von Peter D. (peda)


Lesenswert?

Florian wrote:
> Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen
> und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach
> nicht genau hin


http://home.tiscali.de/peterd/appl/soft/arithmet/index.htm


Peter

von Karl H. (kbuchegg)


Lesenswert?

Florian wrote:
> Mein Ausbildner wollte dass ich das ganze in Assembler schreibe, weil
> ich bei meiner Teilprüfung in 2 Monaten auch Assembler programmieren
> muss.
> Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen
> und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach
> nicht genau hin, deshalb habe ich mir jetzt überlegt ob man das mit
> einer C-Funktion machen kann.

Na ja. Das ist aber dann geschummelt.
Denn dein Ausbildner möchte dann ja haben, dass du ihm zeigst
dass du 16 Bit Arithmetik machen kannst.

> aber ich möchte eigentlich
> nur eine Zahl (200) durch einen gemessenen Wert (0.1 - 200)
> dividieren und dann das Resultat mit 3.6 multiplizeren.

Du willst also berechnen

   200 / x * 3.6

das stellst du gleich mal etwas um

   200 * 3.6 / x

die 200 * 3.6 kannst du gleich ausrechnen: das macht 720

Du musst also rechnen: 720 / x

Jetzt denke ich aus deiner Aufgabenstellung herausgelesen
zu haben, dass du die Zeit auf 1/10 Sekunden genau misst.
Und diese Kommastelle macht Probleme. Die Lösung: Verschiebe
das Komma um 1 Stelle. Das x hat dann die Einheit 1/10 Sekunde
Ein x Wert von 125 bedeutet also 12.5 Sekunden. Damit
wird deine Berechnung zu

    7200 / x

Und du kommst mit einer stinknormalen 16 Bit Division gut über
die Runden.

von Florian (Gast)


Lesenswert?

Okee, danke für die Antworten. Werde es mal so probieren=)

Gruss

von Gast (Gast)


Lesenswert?

@ Karl Heinz

>(wenn ich mal die Methode "den Compiler ein Assemblerlisting
>generieren lassen und dann abtippen" ausser acht lasse).

Man muß nichts abtippen!
Als mißtrauischer Zeitgenosse sehe ich mir hin und wider an, was der 
Compiler aus meinen Geschreibe generiert. Wenn etwas nicht optimal zu 
sein scheint, kann man nachträglich optimieren. Hast Du so etwas nie 
gemacht?

Aber gut, die aktuelle Codeerzeugung macht "Nachoptimierungen" 
heutzutage entbehrlich.

von wuddy (Gast)


Lesenswert?

Ich hab genau das oben genannte Problem. Ich will aus einem C- Programm 
eine Assemblerroutine aufrufen. Diese besitzt keinerlei 
übergabeparameter.Mein problem ist jetzt unter welchem Name ist die 
Routie aufrufe bzw wie ich sie in eine Header einfüge.

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.