Forum: Compiler & IDEs C-Tutorial, Grundlagen ???


von Lutz (Gast)


Lesenswert?

Hallo,

als Mikrocontroller- und C-Anfänger habe ich mir die beiden C-Tutorials
hier angeschaut und natürlich mehrere Millionen Fragen, die
wahrscheinlich irgendwo stehen (AVR-GCC-Dokumentation?) und ich wohl
auch noch Nachlesen bzw. finden werde. Meine größten Probleme liegen
aber derzeit hier: So bedeutet
outp ((1 << XXX)|(1 << YYY), ZZZ)
offensichtlich, daß die beiden Bits XXX und YYY im Register ZZZ gesetzt
(=1) werden. Mit meinen C-Kenntnissen lese ich aber:
Bitweises verschieben des binären Wertes 1 um den Wert XXX nach links
(nur in welcher Variablen?) ODER (|) bitweises verschieben des binären
Wertes 1 um den Wert YYY nach links (nur in welcher Variablen?), und
das ganze im Register ZZZ, was wohl wenig Sinn macht.

Auch fragt
if (inp (USR) & (1 << RXC)) {...
vermutlich, ob das Bit RXC im Register USR gesetzt ist. In normalen C
hätte ich gefragt
if (USR.RXC=1){ ....
Hier muß anscheinend erst das USR-Register eingelesen werden ("inp
(USR)") und dann praktisch sofort danach (1 Takt ungefähr ?) mit einer
UND-Verknüpfung nach dem RXC-Bit gefragt.

Nun nicht darüber nicht totlachen, ihr habt auch mal angefangen. Wo im
Netz finde ich was, was mir diese Grundlagen verklickert?

Danke und Gruß

Lutz

von OldBug (Gast)


Lesenswert?

Hallo Lutz!

Also: inp/inb und outp/outb sind deprecated, soll heissen: nicht mehr
verwenden!

Wenn Du jetzt diese zeile:
outp ((1 << XXX)|(1 << YYY), ZZZ);

So hinschreibst:
ZZZ = (1 << XXX) | (1 << YYY);

Sollte das ganze doch klarer werden, oder?
Die 1 wird um XXX Stellen nach links verschoben in das Register ZZZ
geschrieben, zusätzlich wird noch eine 1 um YYY Stellen nach links
verschoben in ZZZ geschrieben (bitwise or, '|').

>if (inp (USR) & (1 << RXC)) {...

Gleiche vorgehensweise:
if ( USR & (1 << RXC)) { /* something */ }

Hier wird geprüft, ob das Bit, welches an der Position die mit RXC
angegeben wurde, gesetzt ist.

Wenn Du noch Fragen hast....

Gruß,
Patrick...

von Lutz (Gast)


Lesenswert?

Hallo Patrick,

besten Dank. Das mit der neuen Schreibweise ist in der Tat intuitiver.
Kannst Du mir da ´ne Quelle nennen, wo ich mich mal in aller Ruhe
durchlesen kann?

Gruß
Lutz

von Dieter B (Gast)


Lesenswert?

Hallo Lutz

Schau hier mal rein

Kapitel 9. Operatoren
http://pronix.de/modules/C/openbook/

oder hier

http://www.schellong.de/c.htm

MFG
Dieter

von Lutz (Gast)


Lesenswert?

Hallo,

Eure Links und Erklärungen haben mich ein gutes Stück weiter gebracht.
Ich (glaube) nun auch herausgefunden zu haben, daß ja viele
Codesequenzen vom Compiler abhängig sind (welche Makros, defines etc.
da drin stehen); also praktisch eine compilerabhängige
Programmiersprache entsteht. Also habe ich mir die Dokumentation des
neuen (1.0.4) AVR-GCC heruntergeladen und als Wochenlektüre vorgesehen.


Eine Frage aus meinem ersten Posting hat sich nun aber verstärkt:
  if (USR & (1 << RXC)) {...
bedeutet (nach "Rausschmiß" von deprecated "outp") ja, daß die
Bedingung lautet: Wenn Bit RXC in Register USR gleich 1 ist...
Könnte man dem Compiler die ganzen Register und Bits nicht als struct
"beibringen" und dann z.B. viel verständlicher z.B. so fragen
  if (USR.RXC=1){ ....
Es gibt wohl einen guten Grund, daß das nicht so ist.

Gruß
Lutz

von Oryx (Gast)


Lesenswert?

Hallo Lutz,

Könnte man dem Compiler die ganzen Register und Bits nicht als struct
"beibringen" und dann z.B. viel verständlicher z.B. so fragen
  if (USR.RXC=1){ ....
Es gibt wohl einen guten Grund, daß das nicht so ist.

Völlig richtig, wird bei anderen Controllern auch so gemacht. Der hier
eingeschlagene Weg ist nach kurze Eingewöhnung aber auch lesbar. Einer
der Hauptgründe ist wohl, das es in den Datenblättern von Atmel auch so
drinsteht. In welcher schreibweise der Compiler einen besseren Code
erzeugt, ist wohl auch controllerabhängig.

Noch was:
if (USR.RXC=1){
schon mal garnicht,
eher:
if (USR.RXC==1){

besser:
if (USR.RXC){


Oryx

von Lutz (Gast)


Lesenswert?

Hallo Oryx,

>Noch was:
>if (USR.RXC=1){
>schon mal garnicht,
>eher:
>if (USR.RXC==1){

>besser:
>if (USR.RXC){

da bin ich im ersten Fall ja voll auf Anfängerfehler Nr. 1
reingefallen!!!

Du schreibst, daß die Schreibweise gewöhnungsbedürftig ist und auch so
in den Atmel-Datenblättern steht. Ich habe bisher leider nur
Codefragmentbeispiele gesehen, z.B. im ATmega8-Datenblatt, also keine
richtige Deklaration, Definition oder gar "Lehrschrift". Wo kann ich
das finden?

Danke und Gruß
Lutz

von OldBug (Gast)


Lesenswert?

Das sind die Grundlegendsten C-Kenntnisse, welche Dir jedes einigermaßen
Brauchbare "C-Buch" vermitteln sollte.
Für die Puristen wäre da "The C Programming Language" von K&R zu
empfehlen - für viele ist das aber "schwere Kost".

Gruß,
Patrick...

von Lutz (Gast)


Lesenswert?

Hallo Patrick,

das war ja gerade meine Hoffnung/Erwartung, daß das Grundlagen und
deshalb überall nachlesbar sind. In bisher 3 Büchern sind zwar jedesmal
die Bitmanipulationen beschrieben, aber eben leider nicht ansatzweise
in der Art und Weise wie bei den Codebeispielen. Anscheinend kann man
sich "das" dann ja aus den Grundlagen selbst ableiten, nur ist das
gerade für mich als Anfänger schwierig, aus einigen Codefragmenten die
Systematik selbst zu entwickeln. Ich habe auch schon überlegt, mir ein
C-Buch speziell für die Mikrocontrollerprogrammierung zu gönnen (z.B.
das hier angeratene "Softwarenetwicklung in C für Mikroprozessoren und
Mikrocontroller", allerdings sind 39 &#8364; recht happig ...

Ja, das Leben ist halt nicht so einfach. Wenn man was haben will, muß
man auch was dafür tun (bzw. ausgeben).

Gruß
Lutz

von Rolf F. (Gast)


Lesenswert?

Die C-FAQs (sind als Buch ausführlicher als die Online-Version) sollte
man als C-Programmierer gelesen haben und den C99-Standard solle man
zumind. als draft-Version haben, um darin in Zweifelsfällen
nachzulesen.

von Jörg Wunsch (Gast)


Lesenswert?

Naja, der C-Standard ist sicher ziemlich trocken für einen
Programmierer.  Würde ich nicht unbedingt als Anfängerliteratur
empfehlen.

Den K&R würde ich da eher noch empfehlen, allerdings gibt's meines
Wissens noch keine Neuauflage, die C99 abdeckt.

von Oryx (Gast)


Lesenswert?

Hallo Lutz,
ich bezweifle, das dich ein weiteres Buch sonderlich weiterbringt.

Bei deiner vorgehensweise scheint es mir sinnvoller, du nimmst dir
einen Controller, das Datenbuch, ein paar Beispielprogramme und nimmst
das ganze Zeile für Zeile auseinander.
Das kritische Hinterfragen klappt ja schon.

So etwas wie eine "Lehrschrift" gibt es im C nicht. Wenn du drei
Leute fragst, wirst du 3 unterschiedliche Antworten finden. Je nach
vorkenntnissen und bisherigen Erfahrungen der Leute.

Die Definitionen stehen in C:\winavr\include\avr\iom8.h

Ansonsten: Wo wohnst du, such dir ein paar Leute, zu diskutieren. Macht
mehr Sinn, als nur zu lesen.


Oryx

von Lutz (Gast)


Lesenswert?

Hallo Oryx,

ich glaube auch, daß das der beste Weg für mich ist. Learning by doing
bzw. 1:1 Datenblätter nacharbeiten war mir schon immer um ein
vielfaches lieber als trockenen Stoff zu lesen. das bleibt auch viel
besser "hängen".

Danke und Gruß
Lutz

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.