Literaturtipps für Programmiersprache C

Hallo zusammen,

welche (Deutschsprachige) Literatur wäre zur Erlernung der Programmiersprache C, speziell für die ATMEL-AVR, zu empfehlen?
Ich möchte gerne ein wenig die Hintergründe der ARDUINO-Bibliotheken verstehen um später auch Anpassungen an meine Bedürfnisse vornehmen zu können.

Wenn ich es richtig verstanden habe, ist ja die dem ARDUINO-Projekt zu Gunde liegende Programmiersprache gewissermaßen 'abgespecktes' C.

Gibt es auch eine, evtl. sogar freie, IDE, welche mit dem Compiler für die AVR-Controller zusammenarbeitet?

Danke schon mal.

Grüße

Martin

Gibt es auch eine, evtl. sogar freie, IDE, welche mit dem Compiler für die AVR-Controller zusammenarbeitet?

-->die Arduino IDE verwendet avr gcc
( gibt auch noch andere, z.B. einen Eclipse-Plugin, aber diese hier ist am einfachsten zum reinkommen )

Wenn ich es richtig verstanden habe, ist ja die dem ARDUINO-Projekt zu Gunde liegende Programmiersprache gewissermaßen 'abgespecktes' C.

Es ist "richtiges C", eher ein abgespecktes C++.

Du könntest den Code der Bibliotheken, die dich interessieren auch direkt in deine Sketch-Ordner packen und innerhalb der Arduino IDE in Extra-Tabs anzeigen und modifizieren.

(Deutsche Literaturtipps muss ich passen ...)

Das Standartwerk für C ist
Programmieren in C von Dennis M. Ritchie (Autor), Brian W. Kernighan (Autor)
zB http://www.amazon.de/Programmieren-C-Reference-Manual-deutscher-Sprache/dp/3446154973
Dennis M. Ritchie und Brian W. Kernighan sind die Entwickler von C
Dennis Ritchie – Wikipedia
C++ ist eine objektorientierte "Erweiterung" von C.

Arduino versteckt viele Internas und es gibt eigentlich keine halbwegs (umfassende) Erklärung wie und welche Bibiotheken, Definitionen und wie die Hardware angesprochen wird.

Grüße Uwe

Die Standardwerke sind "Kernighan and Ritchie" auch bekannt als "K&R" sowie "stroustrup".

Davon abgesehen empfehle ich mein Lernpaket http://www.amazon.de/gp/product/3645651306/?ie=UTF8&camp=1638&creative=6742&linkCode=ur2&site-redirect=de&tag=wwwblinkenlig-21. Im Buch gibt es ein Kapitel "Hinter den Kulissen" in dem ich sehr detailiert darauf eingehe wie die Arduino IDE die Sketches zu C Programmen umfrisiert.

Hallo Martin,

hast du denn schon Erfahrung in der Programmierung? Falls ja, welche Sprachen?

Rudi

Die Programmiersprache für den Arduino beschränkt sich auf ein Subset von C++. Das finde ich ganz gut und im allgemeinen, braucht man den Stroustrup wohl nicht gelesen zu haben.
Hier mal ein Beispiel aus der Arduino Welt:
Beim Übergang von 0023 auf 1.0 wurde der Prototyp einer virtuellen Memberfunktion der Print Klasse geändert. Das führte dazu, dass einige Libs nicht mehr funktionierten.

Wer den Stroustrup gelesen hat, den Vererbungsmechanismus und die virtuellen Funktionen verstanden hat, kann das Problem anhand der IDE Fehlermeldung eingrenzen und leicht selbst lösen.
Wer den Stroustrup nicht gelesen hat, dem wird aber auch gerne hier im Forum geholfen (gerade bei solchen Fragen).

Ein anderes Beispiel ist die PROGMEM Thematik. Gerade im Zusammenhang mit dem neu eingeführten F() Makro werden hier gnu-Compiler und C++ mäßig alle Register gezogen. Ein Buch gibt es da wohl nicht, am besten: Ausprobieren. Und ich finde die Beischreibungen auf den Arduino Seiten gar nicht so schlecht (wenn auch etwas knapp):

You can pass flash-memory based strings to Serial.print() by wrapping them with F(). For example :
Serial.print(F(“Hello World”))

Am Schluß doch noch von mir eine Buchempfehlung. Da das Buch mittlerweile im Netz steht, kann man auch gleich anfangen zu lesen:

Leider in Englisch...

Grüße,
Oliver

Schau mal hier, wen es nur um allgemeines C geht:

Galileo Computing stellt einige Bücher zum freien
Download ins Internet.

Addi

Ich habe mal gerade in das Galileo Buch reingeschaut. Bis auf die Tatsache, daß es nicht arduinospezifisch ist, ist es wirklich sehr gut. Für umsonst und auf Deutsch wird man wohl kaum eine bessere Quelle finden. Zusammen mit der avr-libc Doku sollte man da schon ziemlich weit kommen.

Hi Addi

Guter Tip, Karma +.

Danke,
Oliver

Hallo zusammen,

zunächst danke für die Tipps!

Dass einem hier im Forum geholfen wird, habe ich schon lesenderweise bemerkt, ich werde das zu gegebener Zeit bestimmt noch in Anspruch nehmen!

Zur Frage von Rudi, womit ich schon Programmiererfahrungen gesammelt habe:

Ganz allgemein (auf PC): Früher (zu MS-DOS seligen Zeiten) Turbo-Pascal und später dann unter MS-Windows Delphi (ist gewissermaßen 'Visual-Pascal')
Für Microcontroller: JAL für PIC. Dies ist eine freie Entwicklungsumgebung und lehnt sich von der Sprachsyntax her stark an Pascal an.
Da diese Umgebung jedoch nur wenig verbreitet ist, werden bei weitem nicht alle Contoller der PIC-Familie unterstützt, auch gibt es nur (gemessen an der Anzahl für ARDUINO) wenige Bibliotheken, so dass man sehr viel selbst programmieren bzw. anpassen muss.

Diese Einschränkungen, die mir durch die Benutzung van JAL auferlegt wurden, haben dazu geführt, dass ich für einige in Arbeit befindliche Projekte auf den ARDUINO umgestiegen bin.
Aktuell arbeite ich an einer Steuerung für einen Vorverstärker samt Ausgabe der Betriebszustände auf ein Display.
Falls sich jemand von Euch dafür interessiert, kann ich mal das Blockschaltbild und den Funktionsumfang der Software einstellen.

Grüße

Martin

Hallo,

habe vor wenigen Monaten noch nicht programmiert und mit der Arduinoumgebung angefangen.

Da ich solche Codes in Zukunft verstehen möchte..

//2 Pins als Ausgang deklarieren und einen als Eingang 
DDRA = 0b00000011; // 6 Eingänge 2 Ausgänge

//den ersten Pin auf "High" setzen
PORTA |= (1 << PA0);
//den gleichen Pin auf "Low" setzen
PORTA &= ~(1 << PA0);

//überprüfen ob der Eingang gesetzt ist
if(PINA2) {
  //Ausgang setzen
  PORTA |= (1 << PA1);
} else {
  PORTA &= ~(1 << PA1);
}

..und mir meine ganzen schlauen Arduinobücher dabei nicht helfen können, frage ich mich nun, wie es weitergehen könnte.

Sollte ich mir nun C, C# oder C++ aneignen, um weiterzukommen?

Hab mir jedenfalls mal "Programmieren in C: Mit dem C-Reference Manual in deutscher Sprache" bestellt und lese mich momentan hier ein:

Ob das nun der "richtige" Weg ist, weiss ich nicht; vielleicht aber Ihr. :*

Gruß Chris

Chris zu Deinem Verständnisproblem:

//2 Pins als Ausgang deklarieren und einen als Eingang 
DDRA = 0b00000011; // 6 Eingänge 2 Ausgänge

DDRA ist das Register des PORT A das definiert ob ein PIN Eingang oder Ausgang ist. bei 0 Eingang und bei 1 Ausgang.

//den ersten Pin auf "High" setzen
PORTA |= (1 << PA0);
//den gleichen Pin auf "Low" setzen
PORTA &= ~(1 << PA0);

PORTA ist das Register das die Ausgangsspannung (H oder L) der Pins bestimmt.
Weil hier nur 1 Pin geändert werden soll wird zuerst PORTA gelesen und dann Binär gesetz. |: die Oderverknüpfung mit 1 setzt ein Bit auf 1. "1<<PA0" verschibt die 1 um PA0 stellen Shift. "~" negiert ein Bit, aus 1 wird 0.

Das sind alles nicht C-spezifische Programme sondern Boolean-Logik und Controller-spezifische Register.

Kapitel 6 von Rheinwerk Computing :: C von A bis Z erklärt einiges.

Grüße Uwe

Chris72622:
Sollte ich mir nun C, C# oder C++ aneignen, um weiterzukommen?

C ist schon die Richtige wahl,weil die IDE verwendet C++(C++ ist mit C kompatibel). C# würde ich
nicht lernen, weil es nur für Microsofts .Net Framework verfügbar ist. Wenn du C# lernen
möchtest wäre Gadgeteer etwas für dich.

Addi