1. Datentypen C-Grundlagen zur Programmierung des MicroControllersystems MiCoWi Die Grafiken und Beispiele wurden dem Buch C von A bis z von Jürgen Wolf entnommen. Es werden hier die ANSI-Festlegungen genannt. Auf anderen Systemen können sie sich durchaus unterscheiden. Typ Größe in Byte Wertebereich char 1-128 127 unsigned char 1 0 255 Int 2 32768 +32767 unsigned int 2 0 65535 long 4 2147483648 +2147483647 Auf Floating-Point-Typen sollte bei der Mikrocontrollerprogrammierung grundsätzlich verzichtet werden. Bei Mikrocontrollern gibt es noch den speziellen Typ sbit, der einem Hardwarebit zugeordnet werden kann. Es ist immer Vorsicht geboten, wenn während einer Berechnung ein Zwischenergebnis auftreten kann, das nicht mehr in den Zieltyp passt. 2. Ganzzahlarithmetik Bei einer Ganzzahldivision ist das Ergebnis eine ganze Zahl, der Divisionsrest entfällt. Der Rest kann mit dem Modulo-Operator (%) ermittelt werden. int x=5; int y=2; x=x%y; // Rest der Division: x=1 3. Kurzform bei arithmetischen Ausdrücken Darstellung Entsprechung += a+=b ist gleichwertig zu a=a+b -= a-=b ist gleichwertig zu a=a-b *= a*=b ist gleichwertig zu a=a*b /= a/=b ist gleichwertig zu a=a/b %= a%=b ist gleichwertig zu a=a%b C-Grundlagen Seite 1
4. Kontrollstrukturen 1: Verzweigungen Einfache if-anweisung if(alter < 18) printf("noch nicht volljährig\n"); Zwischen den geschweiften Klammern können beliebig viele Anweisungen stehen. else if-anweisung if(bedingung1 == wahr) Anweisung1; else if(bedingung2 == wahr) Anweisung2; Verzweigung mit else if(bedingung == wahr) Anweisung1; else Anweisung2; Fallunterscheidung mit switch switch(a) case 1: printf("das war eins \n"); case 2: printf("das war zwei \n"); case 3: printf("das war drei \n"); case 4: printf("das war vier \n"); case 5: printf("das war fünf \n"); default: printf("fehler!); /* Ende switch */ return 0; Bitte nicht das break vergessen! C-Grundlagen Seite 2
5. Kontrollstrukturen 2: Schleifen while-schleife Die Anweisungen werden solange ausgeführt, wie die Bedingung wahr ist. do while Schleife while(bedingung == wahr) /* Abarbeiten von Befehlen, bis Bedingung ungleich wahr */ int zahl=1, tmp=0; while(zahl <= 10) tmp=tmp+zahl; printf(tmp); Im Gegensatz zur While-Schleife wird die Bedingung nicht am Anfang der Schleife überprüft sondern am Ende. do /* Anweisungen */ while(bedingung == wahr); for-schleife for(initialisierung; Bedingung; Reinitialisierung) /* Anweisungen */ int n; for(n = 0; n <= 60; n = n + 10) printf("%d\n",n); C-Grundlagen Seite 3
6. Funktionen Mit Funktionen lässt sich der Quellcode besser lesen. Der Code kann durch Erstellen einer Funktionsbibliothek wiederverwertet werden. Ständig sich wiederholende Routinen können in eine Funktion gepackt werden und müssen nicht immer wieder neu geschrieben werden. Fehler und Veränderungen lassen sich daher auch schneller finden bzw. ausbessern, da der Code nur an einer Stelle bearbeitet werden muss. Definition Rückgabetyp Funktionsname(Parameter) /* Anweisungsblock mit Anweisungen */ int summe(int a, int b) Aufruf Su = summe(23, x); // Addition von 23 und der Variable x Rückgabe Soll eine Funktion einen Wert zurückgeben, wird dieser mit der return- Anweisung zurückgegeben. return(a+b); // Funktionsergebnis: Summe von a und b 7. Variablengültigkeit Der Gültigkeitsbereich einer Variablen hängt von der Stelle deren Deklaration ab. Globale Variablen werden am Anfang des Programms (vor der ersten Funktion) deklariert. Auf sie kann aus allen Funktionen zugegriffen werden. Lokale Variablen, die nur in einer Funktion gelten sollen, werden am Anfang der Funktion (vor der ersten Anweisung) deklariert. Sie gelten nur in dieser Funktion und werden beim Verlassen der Funktion verworfen (Ausnahme: static-variablen). In anderen Funktionen können problemlos Variablen gleichen Namens verwendet werden. Bei Namensgleichheit mit einer globalen Variablen wird die lokale Variable verwendet. Es ist guter Stil, nur diejenigen Variablen global zu deklarieren, die wirklich überall verwendet werden müssen. Übergabevariablen einer Funktion werden bereits in der Funktionsdeklaration deklariert und sind auch nur in dieser Funktion bekannt. Die Änderung einer Übergabevariable ändert hat keinerlei Auswirkungen außerhalb der Funktion. Konstanten: Durch Voranstellung des Schlüsselwortes const wird aus einer Variablendeklaration eine Konstante, die nicht im Programm geändert werden kann. const int wert = 10; C-Grundlagen Seite 4
8. Arrays Mit arrays ist es möglich, mehrere Werte eines Typs systematisch abzulegen und über einen Index auf die einzelnen Elemente zugreifen zu können. Datentyp Arrayname[Anzahl]; int i[5]; Die Größe eines Arrays ist nicht dynamisch, sie muss bei der Compilierung bekannt sein. Achtung: C-Arrays beginnen grundsätzlich mit dem Index 0. D.h. für das obige Beispiel sind Indizes zwischen 0 und 4 zulässig. Die Überschreitung der zulässigen Arraygrenzen kann zur Laufzeit zu großen Problemen bis hin zum Programmabsturz führen. int bigarray[1000]; for(i = 0; i < 1000; i++) bigarray[i] = 0; Es können auch mehrdimensionale Arrays verwendet werden. int Matrix[4][5] = 10,20,30,40,50, 15,25,35,45,55, 20,30,40,50,60, 25,35,45,55,65; Achtung: Denken Sie an die Arbeitsspeicherbeschränkungen des Mikrocontrollers. Bei der Übergabe an Funktionen sollte nicht die übliche Methode des Call-by-Value verwendet werden, sondern ein Call-by-Reference (Pointer auf das Array, siehe Literatur), um einen Stackoverflow zu verhindern. C-Grundlagen Seite 5