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
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...
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
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
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
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
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
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...
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 € 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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.