Forum: Mikrocontroller und Digitale Elektronik Übersetzen von Basic zu C


von svan s. (svanschu)


Lesenswert?

Aloha zusammen,

ich hab grad die glorreiche Aufgabe eine Atmega Programmierung von Basic 
in C zu übersetzten.

Wir haben config Dateien, in denen die einzelnen Gruppen ihre 
Pinbelegungen und verwendeten Register angeben und diese werden dann im 
vorgefertigten Code verwendet um das System zu testen.

In Basic wurde das durch ALIAS bewerkstelligt.

Dig_fs Alias Pina.6
Pwm_al Alias Ocr1al
Pwm_bl Alias Ocr1bl
Cw_ccw_a Alias Portc.5
Cw_ccw_b Alias Portc.4

Was ja eigentlich nichts anderes ist wie einen Pointer auf dieses 
Register/Pin zu legen.

Ich frag mich jetzt wie ich in C das am geschicktesten umsetzten kann? 
Im Programmcode wird dann halt irgendwann zum Beispiel Pwm_al = 255 
gesetzt und das sollte dann am Ocr1al ankommen.

Ich weiß wie ich in ein Register direkt schreib, aber ich hab grad keine 
Ahnung wie ich das über einen pointer machen soll und hab bisher über 
google nichts gefunden was mich dahin bringen würde.

Es dankt der Neuling der bestimmt wieder eine Frage stellt die 100 
beantwortet wurde, aber die Antwort nicht findet.

von cccccc (Gast)


Lesenswert?

#define?

von svan s. (svanschu)


Lesenswert?

Damit definier ich doch ne symbolische Konstante und Konstanten kann man 
doch keine Werte zuweisen oder denk ich da jetzt falsch?

von Oliver (Gast)


Lesenswert?

Sven Schultschik schrieb:
> Damit definier ich doch ne symbolische Konstante und Konstanten kann man
> doch keine Werte zuweisen oder denk ich da jetzt falsch?

Da denkst du fast richtig, ein define definiert eine Textersetzung, 
keine Konstante. Das ist halt das Verfahren, mit dem man so etwas in C 
macht. Die Zuweisung steht dann später im Programm.

Du wirst nicht drumherum kommen, C richtig zu lernen, und dann das 
Basic-Programm in C neu zu schreiben. Nicht als 1:1-Übersetung der 
Basic-Anwweisungen, sondern als C-Programm, das das gleiche macht.

Oliver

von Meister E. (edson)


Lesenswert?

Sven Schultschik schrieb:
> ich hab grad die glorreiche Aufgabe eine Atmega Programmierung von Basic
> in C zu übersetzten.

Ist doch eine schöne Aufgabe.

Sven Schultschik schrieb:
> Damit definier ich doch ne symbolische Konstante und Konstanten kann man
> doch keine Werte zuweisen oder denk ich da jetzt falsch?

Falsch. Ein #define sorgt für Textersetzung, da werden nicht zwingend 
Konstanten definiert. Das selbe macht das Alias, es sagt dem 
Preprozessor/Compiler dass er den linken Text im Programm durch den Text 
rechts vom "Alias" ersetzen soll. Ist dieser Text nicht identisch mit 
irgendeinem gültigen Ausdruck oder Symbol, kommt es zu Fehlermeldungen. 
d.h. in deinem Fall muss z.B. Pina6 irgendwo anders definiert sein.

Gruß,
Edson

von svan s. (svanschu)


Lesenswert?

Danke für eure Antworten. Ich lerne Sprachen immer ganz gerne an 
Projekten um die Motivation und den Druck aufrecht zu erhalten ;)

Hab mir jetzt auch das openbook was hier empfohlen wird mal gezogen. Da 
ist define auch besser erklärt wie in dem Teil was ich besser hab.

Mein vorgehen ist im Moment das Basic programm verstehen, überlegen wie 
ich es umsetzten will um es ggf einfacher zu gestalten und zu schauen wa 
sich in C tun muss um den gewünschten Effekt zu erhalten.
1:1 kopieren geht nicht, da noch ne Menge Bascom kram mit drin rum 
hängt, was ich eh selber implementieren muss ^^

von Karl H. (kbuchegg)


Lesenswert?

svan schu schrieb:
> Danke für eure Antworten. Ich lerne Sprachen immer ganz gerne an
> Projekten um die Motivation und den Druck aufrecht zu erhalten ;)

Alles schön und gut.
Nur funktioniert das nur dann, wenn du bereits einen Grundstock an 
Fähigkeiten in einer Sprache hast.
Man kann so vorgehen, dass man die Details erst dann 'dazulernt', wenn 
die Notwendigkeit dazu besteht. Aber ohne den erst mal notwendigen 
generellen Unterbau steht man auf verlorenem Posten.


Im Prinzip kann man

Dig_fs Alias Porta.6
Dig_fs = 1

durch

#define SET_BIT( port, bit )    ( port |= ( 1 << bit ) )

#define DIG_FS_PORT   PORTA
#define DIG_FS_BIT    PA6


   SET_BIT( DIG_FS_PORT, DIG_FS_BIT );

ersetzen. Man kann das auch noch weiter treiben und zb mittels 
Strukturen schönere Syntax erzielen, so dass man auch in C wieder 
schreiben kann

     Dig_fs = 1;

aber dazu muss man dann schon C ganz gut intus haben.

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.