Forum: Mikrocontroller und Digitale Elektronik 8051 in C Programmieren


von Daniel (Gast)


Lesenswert?

Hallo Zusammen
Möchte auf meinem Atmel8051 einen Teil eines Programmes in C schreiben.
Die Daten die ich in dem C Teil bearbeiten möchte liegen im externen 
Speicher. Leider habe ich noch nicht herausgefunden wie ich die Daten
in ein Array bekomme um mit ihnen zu arbeiten.Kann mir da jemand
weiterhelfen?
Gruß Daniel

von Schrotty (Gast)


Lesenswert?

Ich bin zwar kein Softwarefreak, aber ich würde es mal mit einem Pointer 
auf die betreffende Speicheradresse versuchen ;-)

von Daniel (Gast)


Lesenswert?

OK werde das mal versuchen. Noch ein Problem. Möchte den in C 
geschriebenen
Teil von meinem Hauptprogramm aus aufrufen. Also ne A51 Datei daraus 
machen
und einbinden. Das mit der A51 Datei bekomme ich hin. Aber normalerweiße
beginne ich meine "Unterprogramme" ja mit z.B. berechnung: und beende 
sie mit ret muß ja so was Ähnliches jetzt auch in mein C-Teil einbauen 
was mir aber nicht richtig gelingen mag.
OK das mit dem pointer hätte mir selber einfallen können muß ich schon 
zugeben.

von Matthias K. (matthiask)


Lesenswert?

Mehr Datails und das Progamm zeigen.

von Daniel (Gast)


Lesenswert?

Das Programm ist noch in Arbeit. Bin am testen wie ich wenn ich aus dem
C Programm eine A51 Datei gemacht habe diese mit einem lcall aufrufen 
kann.
Habe schon viel versucht aber das richtige war noch nicht dabei.
Zum Pointer ist mir auch noch was eingefallen. Die Daten liegen im
eingebauten 2k Speicher (externer Speicher) dieser ist wenn ich mich 
nicht
irre Adressparallel zum Internen. In Assembler muß ich ja auch mit movx
arbeiten. Also wie sage ich dem Pointer das er auf den externen Speicher 
zeigt.
Gruß

von Schrotty (Gast)


Lesenswert?

"Adressparallel".. Was soll das denn bedeuten?

von Daniel (Gast)


Lesenswert?

Beide Speicher fangen bei 00h an und werden durch die Art des zugriffs 
Unterschieden intern mit mov externer Speicher mit movx.

von Ralph (Gast)


Lesenswert?

Les doch einfach mal die Doku zu deinem Compiler/Linker.
Deine Fragen sollten darin beantwortet werden, wenn nicht such dir einen 
Compiler/Linker mit anständiger Dokku.

Generell gesagt musst du dich bei C nicht um Speicherzuweisungen, ret, 
Registerrettung,... kümmern.
Das macht der Compiler.

Es gibt schon Spezialfälle wo du es doch tun musst, aber 99,x% deines 
C-Codes haben mit solchen Dingen nichts zu tun. Ansonsten könntest du ja 
auch bei Assembler bleiben.


Ich würde das ganze anderst angehen.
==> Das ganze Programm in C und nur die wenigen direkten 
Hardwarezugriffe die unumgänglich sind in Assembler. Und da wenn möglich 
InlineAssembler.

von Daniel (Gast)


Lesenswert?

Leider geht das nicht habe einen großteil meiner Unterprogramme schon 
fertig. Alles in Assembler (mit Keil uVision3). Hatte mir das am Anfang
mit C überlegt. Da ich meine Datenerfassung am Port zeitlich an ein paar
Steuersignale koppeln musste und das Timing ziemlich eng ist habe ich 
mich für Assembler entschieden weil ich nicht wußte wie das C Programm 
umgesetzt wird und ob die laufzeit dann passt damit ich kein Signal 
verpasse.Jetzt muß ich versuchen mit einem C File eine A51 Datei zu 
erstellen die ich dann einbinden kann und mit LCALL aufrufen kann.
Weiß nicht genau wie das geht. Muß ja irgendwo im C File was stehen 
haben
das mein Hauptprogramm findet und dorthin springt. Also so wie bei den
anderen Unterprogrammen name: und dann mit ret beendet.
Das nächste Problem ist mein Externer Speicher muß in C den 16Bit 
Datenpointer meinés Atmel 8051 ansprechen weil dort meine Messdaten 
liegen.Keine Ahnung wie das geht. Also einen normalen Pointer bekomme 
ich schon hin haber eben keine Ahnung wie das mit dem dptr geht.
Gruß

von ttl (Gast)


Lesenswert?

Wieder einer der glaubt besser in Assembler zu sein als ein C-Compiler!
Der Keil-C ist echt gut. Leider den Ansatz falsch gewählt. So wird das 
mühsam bis unmöglich.

von Karl H. (kbuchegg)


Lesenswert?

Daniel schrieb:
> Leider geht das nicht habe einen großteil meiner Unterprogramme schon
> fertig.

Dann hast du dein Projekt schlecht geplant.
ZU früh mit dem Coden angefangen, zu wenig Überlegung in die 
Vorbereitung gesteckt.

Lehrgeld, das wir alle zahlen mussten und müssen.
Jetzt bist du drann mit Lehrgeld zahlen.


> Alles in Assembler (mit Keil uVision3). Hatte mir das am Anfang
> mit C überlegt. Da ich meine Datenerfassung am Port zeitlich an ein paar
> Steuersignale koppeln musste und das Timing ziemlich eng ist habe ich
> mich für Assembler entschieden weil ich nicht wußte wie das C Programm
> umgesetzt wird und ob die laufzeit dann passt damit ich kein Signal
> verpasse.

Das wäre mit einiger Sicherheit in C genauso machbar gewesen. Warum hast 
du keine Vorversuche in C gemacht?

Aber selbst dann hättest du dein Programm in C machen sollen und die 
eventuell zeitkritischen Dinge, so sie in C tatsächlich nicht machbar 
wären, in Assembler auslagern.

> Jetzt muß ich versuchen mit einem C File eine A51 Datei zu
> erstellen die ich dann einbinden kann und mit LCALL aufrufen kann.
> Weiß nicht genau wie das geht. Muß ja irgendwo im C File was stehen
> haben
> das mein Hauptprogramm findet und dorthin springt. Also so wie bei den
> anderen Unterprogrammen name: und dann mit ret beendet.

Du zäumst das Pferd falsch auf.
C ist darauf angewiesen, dass der µC beim Hochfahren bestimmte Dinge 
tut. Da müssen Sachen initialisiert werden. Da müssen 
Funktionsaufrufkonventionen eingehalten werden, da müssen 
Registerkonventionen eingehalten werden.
Unter der Motorhaube muss der Compiler für Ordnung in seinem 
Abreitsbereich sorgen. Er tut dies, indem er sich streng an gewissen 
Konventionen hält. Es ist schon unangenehm genug, sich an diese 
Konventionen zu halten, wenn Assembler Routinen von C aus aufgerufen 
werden. Aber umgekehrt, von einem Assemblerprogramm aus die Umgebung zu 
herzustellen, dass die C-Funktion übernehmen kann, das kann sich zu 
einer Sysiphusarbeit ausarten.

von Peter D. (peda)


Lesenswert?


von Daniel (Gast)


Lesenswert?

Das kann sein das es nicht gerade Optimal geplant war. Hatte mega Ärger
mit der Hardware und stand bzw. stehe unter Zeitdruck aber so richtig
unter Zeitdruck. Naja wußte wie ich aus dem C File eine A51 Datei mache
nur der Aufruf von meinem Hauptprogramm mit LCALL war unklar. Aber:
Ich Trottel hab doch dann ne A51 Datei und kann doch da noch was 
einfügen
und die dann einbinden.

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.