PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übersicht aller C- Befehle



frankensteins-freund
31.08.2011, 11:34
Hey,

Ich habe jetzt den Einstieg in die c-programmierung begonnen, bin aber nun auf der Suche nach einer Seite, auf der Sämtliiche befehle, die der Hobbyanwender braucht mit beispielen aufgeführt sind. Gibt es da etwas?

MfG
Michael

radbruch
31.08.2011, 11:49
http://www.rn-wissen.de/index.php/Avr-gcc
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://de.wikibooks.org/wiki/C-Programmierung_mit_AVR-GCC

http://www.nongnu.org/avr-libc/user-manual/index.html

Viel Spaß beim Lesen.

mic

markusj
31.08.2011, 12:40
Deine Frage ist nur bedingt sinnvoll, und zwar aus folgendem Grund:
Es gibt einerseits Sprachelemente, davon gibt es nicht viele, sie sind im Standard festgeschrieben und gehören eben zur Sprache. Und dann gibt es Bibliotheksfunktionen, die teilweise zum Standard gehören, teilweise aber auch AVR-spezifische Erweiterungen und damit nicht standardisiert sind. Und diese Erweiterungen (wie auch viele andere Bibliotheksfunktionen) sind einfach nur in normalem C geschrieben, es gibt daher streng genommen "Unendlich" viele mögliche "Befehle", du musst sie nur programmieren.

Daher: Nimm dir ruhig die verlinkten Tutorials/Quellen vor, du bekommst neben der Sprachstruktur auch noch einen Einblick in die Bibliotheksfunktionen die du benötigst.

mfG
Markus

frankensteins-freund
31.08.2011, 13:35
Hey,

Also ich habe einen tutorial angefangen und ich muss agen, ich verstehe jetzt eben wieder weniger als zuvor. vorallem finde ich es komisch, dass auf jeder seite anderst beschrieben wird, wie ich eine funktion programmieren kann (Zumindest sehen die befehle anderst aus)

Das das ganze so kompliziert und spärlich dokumentiert ist hätte ich nicht gedacht...

MfG
Michael

radbruch
31.08.2011, 13:37
Bei den wikibooks war noch ein nettes C-Tutorial versteckt:
http://de.wikibooks.org/wiki/C-Programmierung

Ceos
31.08.2011, 14:35
kompliziert und spärlich dokumentiert ? ohne Grundwissen kommt man eben nicht weit, der Punkt iss, deine Frage kan nicht beantwortet werden, wie markusj schon sagte, es gibt für C definierte Standards, darin enthalten die Erklärung der Syntax und welche Keywords es gibt und was diese tun, so z.B. der begriff "for" steht für den Beginn einer kopfgestuerten Schleife, nach der Syntax "for(<Initialisierung>;<Wiederholbedingung>;<Schleifenendfunktion>)" gefolgt vom Schleifenkörper.

Alles was jetzt tiefer in die Materie eintaucht, was schon bei derf Textausgabe auf der Konsole anfängt für das berühmte "Hello World" sind nur Bibliotheken angefüllt mit Methoden, die wiederum selbst nur eine Ansammlung von generischen Ausdrücken und (Betriebsystemspezifisch) Assemblercode um die gewünschte Reaktion (Textausgabe am Monitor) herbeizuführen.

Mein Rat an dich, beschäftige dich erst einmal mit einfacher Konsolenprogrammierung (Hello World) um ein Gefühl für die Sprache zu bekommen, wenn du dich mit dem Compiler auseinandersetzen willst und verstehen willst was welches Zeichen an welcher Stelle im Code bewirkt empfehle ich nach den C-Standards zu googlen wobei du dann gleich einen eigenen Compiler entwerfen kannst ^^

Aber eine allgemeingültige Liste für C gibt es nicht nur eine brauchbare Dokumentation über die Sprache und die Anwendungn und dann learning by doing.

PS @ radbruch top-link das iss einfach genial!!!

SprinterSB
31.08.2011, 21:15
Alle C-Schlüsselwörter:
http://tigcc.ticalc.org/doc/keywords.html

wkrug
31.08.2011, 22:07
vorallem finde ich es komisch, dass auf jeder seite anderst beschrieben wird, wie ich eine funktion programmieren kann (Zumindest sehen die befehle anderst aus)
- Weil man es eben auf verschiedene Art und Weise in C realisieren kann.
Es gibt wirklich nur relativ wenige "Grundbefehle" in C.
z.B. switch, if, for, while usw.
Alles was über diese wenigen Befehle hinaus geht ist in Librarys versteckt.
Es gibt nun einige Standard Bibliotheken wie z.B. string.h die fast jeder C Compiler hat und es gibt spezifische Bibliotheken die speziell zum Compiler, dem Controller, oder der Peripherie ( z.B lcd.h ) gehören.
Du kannst mit einiger Erfahrung auch selber solche Bibliotheken schreiben.
Im Prinzip ist eine von Dir gewünschte Funktion in so einer Library vorhanden und Du rufst sie dann von deinem Programm aus auf.
lcd_putsf("string"); ruft zum Beispiel eine Routine auf die den Text string an ein LCD Display ausgibt.
Dazu muss vorher eine passende Library eingebunden sein.
z.B. #include <lcd.h>
Du rufst also dann in der Library lcd.h den Funktionsaufruf lcd_putsf auf und übergibst ihm den Text string.
Dieser Programmteil kümmert sich darum, das der Text string auf dem Display ausgegeben wird, ohne das Du dich weiter darum kümmern musst.

Du kannst Dir aber auch selber solche includes schreiben um vieleicht ein I²C EEPROM zu beschreiben.
Dort könnte dann eventuell ein ee_putsf("string"); Programmteil drin sein, der den ankommenden Text in ein EEPROM schreibt.
Diesen include kannst Du dann in jedem neuen Programm verwenden, in dem so eine Funktion notwendig ist.

Ich hab mir z.b. kürzlich eine lib geschrieben, in der alle Funktionen zum Ansteuern eine AD9834 ( DDS Chip ) drin sind.
Im Hauptprogramm brauch ich dann blos setftw(12345) eingeben um das Tuningword für eine bestimmte Frequenz einzustellen.

Die Sache mit den lib's ist bei "C" eigentlich genial, nur am Anfang nicht so leicht zu verstehen.

Richard
31.08.2011, 23:22
Da hast Du zwar Recht, aber ich halte ASM eigentlich für weitaus einfacher (weil ich das als erstes gelernt habe) und ASM die wenigsten Befehle "zum auswendig lernen) hat. :-) Aus oft gebrauchten Programmteilen bastelt man sich dann selber Funktionen für eine Bibliothek. Leider hat ASM einen nicht zu leugnenden Nachteil gegenüber C oder Basic, es ist immer auf einem Prozessor Typ beschränkt oder man muss "Umlernen". :-( Als wieder Einsteiger mit ASM und etwas Basic Erfahrung scheue ich vor C zurück, möglich das ich einfach zu alt b.z.w. zu faul bin. Ich habe zwar unter Linux MAL etwas mit C "gespielt" und das hat auch geklappt, aber irgendwie bin ich damit nicht "warm" geworden, auch letztendlich weil C (Klammern u.s.w.) auf einer Amerikanischen Tastatur entwickelt wurde.......Sollte ich wirklich einmal mit Bascom Timing Probleme bekommen bleibt immer noch Inline ASM. :-) ABER Für User welche einmal Beruflich mit µC's arbeiten wollen ist C UND ASM Pflicht!

Zum Thema Tabelle, selber machen und dann möglichst nach Funktionen wie Sprungbefehle, Schleifen, Mathematik, Zeiger u.s.w. das hilft allgemein am besten.
jeder arbeite da doch irgendwie anders. Ich hatte einmal einen Editor der schon beim Eintippen von Schlüssel Wörter eine Erklärung und mögliche Parameter eingeblendet hat, genial man konnte das selber erweitern. Das ist allerdings 30 Jahre her, ob es so etwas heute noch gibt? Für mich damals Anfänger war das jedenfalls sehr sehr Hilfreich. :-) Beinahe so schön wie die TAB Taste unter Linux. :-)

Gruße Richard

markusj
01.09.2011, 00:58
@wkrug: Dann aber auch nicht vergessen, dem Linker die Lib mitzuteilen ;) Wird gerne bei nicht in Quelltextform vorliegenden Bibliotheken vergessen ... (dass du das weißt ist mir klar, aber andere eben nicht)
@Richard: Darüber kann man vortrefflich streiten. Wer Sprachen mit mehr "Drumherum" gewohnt ist, findet ASM (nicht unbedingt) unbequemer, sicher aber Umständlicher. Ich persönlich Nutze ASM dort wo ich es für sinnvoll erachte (also primär Tuning, oder Bootloader) und mache sonst einen großen Bogen außenrum. In der Regel kann man mit Hochsprachen schneller, sauberer, einfacher und portabler arbeiten. Und wenn ich AVRs mit BASCOM programmieren müsste, käme ich mir vor wie in einem Ferrari der auf 30km/h gedrosselt wurde ...

mfG
Markus

PS: Der Tipp mit dem Tabelle-Selbst-Machen ist übrigens empfehlenswert, erstens hat man ein Nachschlagewerk das auf die eigenen Bedürfnisse und Denkweisen zugeschnitten ist und zweitens lernt man dadurch besser.

wkrug
01.09.2011, 08:20
Zum Thema Tabelle:
Manche C Compiler haben sog. Code Templates, die man auch selber erweitern kann.
Man macht dann einen klick darauf und fügt das Code Schnipsel in den eigenen Quellcode ein.
Also es gibt noch so was!
Ich mach das z.B. gerne mit switch / case Anweisungen, weil es da doch so einiges zu tippen gibt.

markusj
01.09.2011, 09:19
Ist das nicht eher ein Merkmal der Entwicklungsumgebung?

mfG
Markus

Richard
01.09.2011, 10:07
@wkrug:Und wenn ich AVRs mit BASCOM programmieren müsste, käme ich mir vor wie in einem Ferrari der auf 30km/h gedrosselt wurde ...



Na ja, bei einem Basic mit Interpreter mag das stimmen, Bascom arbeitet aber mit einem Compiler und der generiert wie auch C letztendlich auch nur Maschinencode. wie effizient der Code wird liegt dann eher am Compiler selber als an der Hochsprache an sich. Ich habe allerdings noch keine Vergleiche einzelner Befele compiliert und die Zeit b.z.w. den Code (Länge/Laufzeit) verglichen....

Gruß Richard

markusj
01.09.2011, 10:30
Ich habe allerdings noch keine Vergleiche einzelner Befele compiliert und die Zeit b.z.w. den Code (Länge/Laufzeit) verglichen...
Wenn sich seit dem Zeitpunkt, an dem ich mich das letzte Mal damit auseinandergesetzt habe, noch nichts geändert hat, ist der Compiler von BASCOM immer noch ... beschränkt. Damals (tm) hat BASCOM Register direkt nach jeder Operation freigeräumt und die Ergebnisse wieder ins SRAM gespeichert, was die 32 verfügbaren Register doch etwas ad-absurdum führt und einiges an Leistung kostet.

mfG
Markus

danimath
01.09.2011, 11:26
Dazu muss vorher eine passende Library eingebunden sein.
z.B. #include <lcd.h>
Du rufst also dann in der Library lcd.h den Funktionsaufruf lcd_putsf auf und übergibst ihm den Text string.
Dieser Programmteil kümmert sich darum, das der Text string auf dem Display ausgegeben wird, ohne das Du dich weiter darum kümmern musst.


Vorsicht: lcd.h ist nicht die Library, sondern die Include-Datei zur Library, in der die Funtionen deklariert und Konstanten definiert werden. Die Library ist sowas wie liblcd.a, in der die einzelnen Funktionen als Objektcode versammelt sind und vom Linker (bei Bedarf) an die ausführbare Datei angebunden werden.

@frankensteins-freund: Lass Dich von den Begriffen erstmal nicht verwirren - das verständnis kommt nach einer Weil fast von alleine ;)

viele Grüße
Andreas

frankensteins-freund
28.09.2011, 16:07
Hey, so ich lasse mal wieder was von mir hören. ich habe mir mit der zeit einen eigenen kleinen ordner angelegt, in den ich funktionierende Programme eingetragen habe und die bedeutung jedes satzes hinzugefügt habe. Somit kann ich jetzt selbstständig kleinere if-else funktionen etc zusammenbauen.

Wie muss ich eine library dann verstehen? kann man das mit einem PC vergleichen? Die library ist somit das windows, das die sprache und funtionen vorgibt und der programmtext das, wie die software, die auf windows basierend dann verschiedene schritte und befehle ausführt?

Ich hab da dann noch eine frage: ich werde mir eine kleine steuerung mit 4 ausgängen bauen. allerdings brauche ich dazu die funktion, dass nach dem wiedereinschalten die ausgänge so geschaltet sind wie vor dem ausschalten. gibt es da eine speicherfunktion, die die aktiven pins immer wieder zwichenspeichert und sie beim wiedereinschalten aufruft?

MfG
Michael

wkrug
28.09.2011, 16:49
Eine Möglichkeit des Speicherns ist das interne EEPROM des Controllers.
Ich würde da ein Relais in die Versorgungsspannung des Controllers einbauen, und das Ausschalten über einen Taster machen der am Controller hängt.
Also Taste betätigen. Der Controller weiß, das Du abschalten willst und springt in eine Sicherungsroutine die die gewünschten Werte in das EEPROM schreibt. Erst dann wirft der Controller das Relais ab und macht die Schaltung stromlos.
Zum Einschalten muß natürlich dieser Relaiskontakt überbrückt werden, da sich sonst der Controller nie mehr einschalten lässt.
Das EEPROM kann nicht unendlich oft beschrieben werden. ATMEL gibt da Controllerabhängig zwischen 10000 und 1Mio Schreibzyklen an.
Wär also sinnvoll vorher nachzuschauen ob überhaupt was neues in das EEPROM geschrieben werden soll, bevor Du einen Schreibzyklus anstösst.
Lesen kannst Du aber meines Wissens beliebig oft.

frankensteins-freund
28.09.2011, 17:13
Hey

Mhm den avr "vorwarnen" is nich, oder nur bedingt. ich habe das darauf bezogen falls die stromversorgung durch steckerziehen ausfällt. oder man könnte den avr mit einem großen kondensator noch 1-2s laufen lassen und ihn dann runterfahren. von dem her mit etwas "bastelaufwand" möglich. 10.000 zyklen sind etwas wenig. 100.000 würden reichen. wer garantiert mir da eine ziemlich genaue aussage?

MfG
Michael

markusj
28.09.2011, 21:24
10.000 zyklen sind etwas wenig. 100.000 würden reichen. wer garantiert mir da eine ziemlich genaue aussage?
Das Datenblatt ist dein Freund und Helfer. Typischerweise verspricht Atmel 10.000 Zyklen für den Flash (Programmspeicher) und 100.000 Zyklen beim EEPROM. Sauberer wäre aber die Lösung mit einem Pufferkondensator und Sicherung des Zustandes vor einer Abschaltung.

mfG
Markus

frankensteins-freund
29.09.2011, 15:40
Hey,

Okay, dann werde ich das mit dem kondensator mal versuchen...

wie schreibe ich den zustand in c auf einen eprom?

Kann ich mir auch meine eigene library schreiben, falls ja, wie funkt das?
MfG
Michi

wkrug
29.09.2011, 17:24
Ich nehm für solche Zwecke immer gerne einen Gold Cap Kondensator.
Guck mal hier: http://www.reichelt.de/Gold-Cap-Speicher-Elkos/SPK-100-000-10/index.html?;ACTION=3;LA=444;GROUP=B318;GROUPID=314 8;ARTICLE=43281;START=0;SORT=artnr;OFFSET=16;SID=1 2ToSbNX8AAAIAAAnmnu47e0d3106afdb6ba9e7c42c245e6780 ed .
Spannung und Datenblatt so eines Kondensators beachten !

frankensteins-freund
29.09.2011, 17:39
Hey,

und dann würdest du vor den kondensator eine diode hängen, damit der strom nicht abhaut? oder wie verkabelt man sowas am cleversten?

MfG
Michi

markusj
29.09.2011, 19:07
Stromanschluss -> Diode -> Kondensator -> AVR

Um die Abschaltung mitzubekommen würde es reichen, einen Pin (bevorzugt mit externem Interrupt) vor der Diode anzuschließen. Geht der Pin auf Low (0) ist der Strom weg.

@Bibliothek: How to build a library (http://www.nongnu.org/avr-libc/user-manual/library.html). Das macht für deinen Einsatzzweck aber eigentlich keinen Sinn.

mfG
Markus

frankensteins-freund
29.09.2011, 20:39
hey,

Stromanschluss -> Diode -> Kondensator -> AVR

Um die Abschaltung mitzubekommen würde es reichen, einen Pin (bevorzugt mit externem Interrupt) vor der Diode anzuschließen. Geht der Pin auf Low (0) ist der Strom weg.

--> genauso habe ich es mir auch vorgestellt. was meint ihr, wie groß muss der cap dimensioniert sein? wie lange sollte der avr "nachlaufen"?

MfG
Michael

Richard
30.09.2011, 03:33
hey,


--> genauso habe ich es mir auch vorgestellt. was meint ihr, wie groß muss der cap dimensioniert sein? wie lange sollte der avr "nachlaufen"?

MfG
Michael

Gute Frage. Ich würde die Zeit messen welche gebraucht wird um die Daten ins Eprom zu schieben und noch etwas Sicherheit drauf geben. Multipliziert mit der dabei gemessenen Stromaufnahme und Du hast den Wert. :-)

Gruß Richard