www.mikrocontroller.net

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


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: SiMa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Momentan habe ich das Microsoft Visual Studio 2005 zur verfügung...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

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

Pieter

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jaaaa genau.. das sollte es werden=)

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian (Gast)
Datum:

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

Gruss

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.