Arduino C Program LED Blink

I wrote a little example Arduino C Program that lets the LEDs blink in 5 different ways. You could download the Software from Arduino – Software.

 

Perl Constant Benchmark

Today we want to take a look about constant and the speed vs vars.

 

The Benchmark result look like this:

We see Perl optimizes our code and so we should use constants if we could, for more constant tricks see Benchmark Debug Perl.

It is also possible fore use modules, take a look at Perl use module only for debugging.

Benchmark Debug Perl

today we want to take a look whats the fastest way to debug our code in Perl:

and the Benchmark result is this:

We see that the best solution in both ways is to use a constant with “and”.It seems to me the compiler remove the constant and the print, becaus if you dont have the print after the command it ends in a infinite loop.

Programmier-Einleitung in C/C++

Diese Einleitung ist auf Grund eines Wunsches entstanden und soll die Basics beim Programmieren von C und C++ zeigen, es soll nur Basics in den sprachen zeigen keine OOP, Klassen, FileHandler oder Ausgabe Formatierung.

 

Vorbereitung

Bevor wir beginnen können brauchen wir einen C Compiler und C++ Compiler…..

Wer unter Linux ist ist klar im Vorteil und sollte den gcc und g++ bereits besitzen notfalls installieren mit:

unter Windows und Linux kann ich auch den Online C Compiler bzw. den Online C++ Compiler empfehlen!

Beide können das gleiche nur wenn ich den Compiler lokal habe kann ich meine Programme auch lokal nutzen, bei beiden speichere ich mein Programm unter “main.c”, um es zu übersetzen tippe ich:

nun können wir es auch starten mit:

(Der Online Compiler hat links oben einen Compile-Button der das für uns automatisch macht !)

 

Kommentare

Kommentare sind Notizen für mich oder andere Programmierer und sollten den Code gut dokumentieren, es gibt zwei arten von Kommentaren Einzeilige und Mehrzeilige.

Einzeilige:

Mehrzeilige:

 

Variablen

variablen sind Platzhalter für werte mit denen unser Programm arbeiten kann.Variablen liegen auf Grund der Geschwindigkeit im Arbeitsspeicher insofern genug zu Verfügung steht und das System nicht ins swap(GNU/Linux) oder Auslagerungsdatei(Windows) schreiben muss und sich das Programm verlangsamt mehr dazu hier.Um Ressourcen zu schonen und aus dem vorhin genannten Bereich ist es notwendig sich zu überlegen wie viel Speicherplatz ich benötige, sinvoll kann es hier auch sein auf negative Zahlen zu verzichten und nur Vorzeichenlose oder unsigned Typen zu verenden.

 

TYP Größe Wertebereich
char 1 Byte = 8 Bit -128…+127
unsigned char 1 Byte = 8 Bit 0…255
short 2 Byte = 16 Bit -32768…+32767
unsigned short 2 Byte = 16 Bit 0…65535
int 4 Byte = 32 Bit -2147483648…+2147483648
unsigned int 4 Byte = 32 Bit 0…4294967295
long 4 Byte = 32 Bit -2147483648…+2147483648
unsigned long 4 Byte = 32 Bit 0…4294967295
float 4 Byte = 32 Bit 3.4*10-38…3.4*1038
double 8 Byte = 64 Bit 1.7*10-308…1.7*10308
long double 10 Byte = 80 Bit 3.4*10-4932…3.4*104932

 

Die Tabelle sollte man in etwa wissen da sie sehr wichtig ist !

Eine einfache Variable anzulegen sieht in etwa so aus :

[TYP] [VARIABLEN_NAME];

Beispiele:

Möglich ist es auch mehre Variablen des gleichen Datentyps gleichzeitig anzulegen oder auch gleich einen Wert zuzuweisen da die Variable sonst undefiniert ist!

(Es empfiehlt sich den Variablen gleich Werte zu geben um nicht zu vergessen, sprechende Namen wie “Port”, “Zeit” oder “Ort” im Gegensatz zu x, y oder z! )

 

Operatoren

Um unseren Programm den Ablauf zu regeln müssen wir ihm sagen was passieren muss damit ein gewisser Ablauf gestartet wird.Angenommen in unserem Programm dürfen nur positive Zahlen verwendet werden, dafür müssen wir das auch prüfen damit keine Fehler auftreten.Zu beachten wenn ein logischer Ausdruck bestehend aus Operatoren ausgewertet wird ist das Ergebnis immer wahr oder falsch sein, auch mit 1 oder 0 gleichzusetzen.

Relationale Opeatoren
Operator
Beschreibung
Beispiel
>
Größer als 10 > 5 //wahr
>=
Größer oder gleich 1 >= 1 //wahr
<
Kleiner als 10 < 1 //falsch
<=
Kleiner oder gleich 10 <= 1 //falsch
= =
Gleich 1 == 1    // wahr
!=
Nicht gleich; ungleich  1 != 1 //falsch
Logische Opeatoren
Operator
Beschreibung
Beispiel
&&
AND (1 == 1) && (2 == 6) //falsch
||
OR (1 == 1) || (2 == 6) //wahr
!
NOT ! (1==7) //wahr

 

So nun aufgepasst! Die Relationalen Operatoren sollten klar sein, unklar wird es dann bei den logischen im ersten Beispiel haben wir folgendes: “(1 == 1) && (2 == 6)” wir wenden immer die Klammerregel an zuerst die klammern lösen dann geht es weiter, also ganz klar sollte sein das 1 gleich 1 ist, und auch das 2 nicht 6 ist womit wir nun folgendes Resultat haben “1 && 0” oder auch für noch nicht Programmierer “wahr && falsch”, für das logische && müssen beide Seiten wahr sein, sonst liefert es hier wieder falsch zurück!

So nochmal aufgepasst, nun haben wir folgendes “(1 == 1) || (2 == 6)” wir lösen wieder die Klammern auf, nun haben wir folgendes Ergebnis “1 || 0”, dem oder Operator reicht es wenn eines der beiden 1 zurück gibt egal ob links, rechts oder beide Seiten.

Nun zum Letzten, ganz klar klammern auflösen das können wir ja und haben nun “!(0)” das entspricht “nicht falsch” somit wahr, es macht aus wahr falsch und umgekehrt, ein “!(!(1))” wäre eine doppelte Verneinung wie ich mache keine Pause also mache ich eh weiter.Eher Theoretisch aber zum Verständnis noch Wichtig.

Zu sagen ist noch das Verschachtelten beliebig möglich sind und Zahlen auch durch Variablen zu ersetzen sind.

 

Ausgabe

Es kann durchaus sinnvoll sein sich Informationen oder Variablen ausgeben zu lassen um den Verlauf des Programms oder auch das Ergebnis zusehen.Hier unterschieden sich C und C++ deutlich, ich behandle den Bereich nur kurz da er sehr spezifisch ist und ich es eher generell halten möchte.

In C:

In C habe ich einen String welchen ich durch Steuerzeichen sage wo meine übergebenen Werte hingehören, mein Steuerzeichen ist hier “%d” und mein Wert “30”, mit “n” mache ich einen Zeilenumbruch.

In C++:

In C++ muss ich die Werte zusammenfügen mittels “<<“, Steuerzeichen benötige ich hier nicht genauso wie oben ist hier mein Wert 30 und mit “n” mache ich eine neue Zeile.

Beide Ausgaben sind:

Weitere Beispiele finden sich in den Erklärungen weiter unten.

 

Eingabe

Natürlich kann es auch sinnvoll sein Werte einzulesen und hier unterscheiden sich C und C++ wieder voneinander, auch hier beschreibe ich es nur kurz.

In C:

In C++:

Beide Programme ergeben das selbe Resultat.

Zeile 1: Variable anlegen.

Zeile 2: Aufforderung an den Nutzer etwas einzugeben.

Zeile 3: Eingabe vom Nutzer abfangen und in x speichern.

Zeile 4: Ausgabe wie bereits gewohnt.

 

IF / ELSE

Nun kommen wir zu einem der wichtigsten Befehle überhaupt dem IF zu deutsch “Wenn”.Das IF wird mit dem Wort IF eingeleitet, in Klammern kommt die Bedingung anschließend in geschwungenen Klammern der Codeblock falls das Ergebnis wahr ist.Optional kann ein else Zweig kommen mit einem Codeblock in geschwungenen Klammern falls das Ergebnis falsch war.Das hört sich jetzt kompliziert an aber mit einer Symbol Aufschlüsselung und Beispielen geht es bestimmt.

Code wird nur ausgeführt wenn Bedingung wahr ist:

 

CODE1 wird ausgeführt wenn Bedingung wahr ist, falls nicht CODE2:

Beispiele:

 

Schleifen

Bei Schleifen unterscheiden wir unter zwei verschiedenen Schleifen Typen, den Kopf und den Fuß gesteuerten.Der unterschied zwischen den Typen ist das bei kopfgesteuerten Schleifen wie For und While die Bedingung vor dem durchlaufen geprüft wird und bei fußgesteuerten erst nachher, das heißt das fußgesteuerte mindestens einmal durchlaufen werden und kopfgesteuerte gar nicht.Was mich zum nächsten Punkt bringt hier sind die Logikoperatoren wieder sehr wichtig wer falsche setzt verhindert ein durchlaufen oder sogar eine Endlosschleife und das Programm hängt.Einen besonderen Fall stellt die kopfgesteuerte For schleife dar sie kann mehr als ihr Partner die While Schleife, in der For Schleife ist es am besten möglich zu zählen und das Programm eine bestimmte Anzahl zu durchlaufen.

 

while schleife:

Unsere Ausgabe:

Wie erwartet wird die Bedingung für x nicht erfüllt uns es bleibt 0,hingegen bei i wird i solange erhöht bis es 11 ist !

 

do while:

 

Unsere Ausgabe:

Wie auch hier erwartet wird die Schleife durchlaufen obwohl die Bedingung falsch ist,im Zweiten Teil macht die Schleife keinen Unterschied.

 

for schleife:

Unsere Ausgabe:

In C ist es nicht möglich eine Variable in dem Kopf der Schleife anzulegen wie in C++. Aber nun zu unserer schleife sie sieht im prinzip so aus:

for( [INITIALISIERUNG] ; [BEDINGUNG] ; [REINITIALISIERUNG] ){ [CODE] }

in der INITIALISIERUNG kann man eine Variable auf 0 setzen um zB. von einer anderen For schleife hochgezählte werte wieder zurück zu setzen, genauso können wir den Wert auch auf 2 oder einen anderen gewünschten Wert setzen. Dann kommt unsere BEDINGUNG sie sagt wie lange unsere Schleife läuft, zuletzt kommt die REINITIALISIERUNG nach jedem Durchlauf wird sie ausgeführt um in unserem Beispiel etwas hochzuzählen, würde das nicht passieren würde sie endlos laufen weil i immer kleiner als 10 ist!

 

Unsere Ausgabe:

In C++ ist es möglich in in der Schleife anzulegen, das hat den Nachteil ich kann i nach der letzten geschwungenen Klammer und somit in der Ausgabe nicht verwenden! Der Vorteil ist aber ich kann i nicht versehentlich wo anders ausgeben oder verändern dazu braucht i nachher keinen Speicherplatz mehr.Ich habe hier die Kurzschreibweise “i++” verwendet die werdet Ihr öfters sehen sie ist das gleiche wie “i = i +1”.

Beispiele:

Beide geben 10 aus, dieses Beispiel zeigt das die zweite Schleife wie eine While schleife arbeitet.

Unsere Ausgabe:

Hier habe ich gleich mehre Tricks benutzt zum einen Variablen draußen anlegt um sie auszugeben, beide in der INITIALISIERUNG zurück gesetzt.Dann in der REINITIALISIERUNG zähle ich i um eins höher und x um 2 (Kurzschreibweise!), und dann habe ich ein IF genutzt um zu verhindern das x weiter als 140 zählt, das IF war dann wahr und hat mit “break” die Schleife verlassen.

 

Funktionen

Funktionen sind wichtig wenn eine Aufgabe mehrmals gebraucht wird, es spart damit Platz und macht ein Programm übersichtlich es gibt zwei arten von Funktionen mit und ohne Rückgabewert.

 

Rückgabewert:

Unsere Ausgabe:

Von Zeile 5 bis 9 haben wir unser Main Programm es wird beim Ausführen als erstes gestartet, in Zeile 1 bis 3 habe ich eine eiserne Funktion erstellt, das sieht im Prinzip so aus:

[RÜCKGABEWERT] [NAME]( [PARAMETER1],…. ){[CODE] [RETURN]}

Zu sagen ist hier das der Rückgabe wert ein Datentyp sein muss wie oben oder void, void bedeutet das nichts zurück kommt dann gibt es aber auch kein return! Der Name sollte selbsterklärend sein, die Parameter sind optional und können beliebig erweitert werden, zuletzt wird das Ergebnis mit return an das Hauptprogramm zurück gegeben.

Referenzen:

Das Ergebnis ist identisch mit dem vorherigen Beispiel, hier übergebe ich die Adressen und meine Funktion übernimmt diese und Arbeitet direkt mit den Variablen das Spart etwas Zeit ist aber schwieriger und für den Anfang nicht zu empfehlen darum erläutere ich es nur kurz.Man kann sich das ganze vorstellen als würde ich eine Verknüpfung übergeben er arbeitet aber mit den Original Werten.Referenzen sind praktisch wenn ich große Datenmengen habe aber nicht jedes mal alles in eine Funktion und wieder zurück schaufeln möchte, so übergebe ich nur die Speicheradresse und fertig.

 

Felder/Arrays

Felder oder Arrays gehören zu den Datentypen jedoch benötigt man etwas Vorkenntnis um zu verstehen was sie können und auch um sie einsetzen zu können darum stehen sie hier unten.Angenommen wir brauchen mehre Variablen um zB. mehre Werte eingeben zu lassen und dann damit zu rechnen wie zB. Rundenzeiten, Preisverläufe oder auch Optionen in Form von Adressen abzulegen, das hört sich jetzt vielleicht komisch an aber beim Entwickeln werdet Ihr euch dann daran Erinnern.Das anlegen sieht so aus:

[DATENTYP] [NAME][ [LÄNGE] ];

siehe Beispiel:

Unsere Ausgabe:

In Zeile 1 setzen wir die Werte gleich, in Zeile 2 hat das Array noch keine Werte, zu beachten ist das mein Index eine durchlaufende Nummer von 0 bis länge-1 ist, das hat den Grund das Arrays mit 0 beginnen. Der Grund ist folgender damit der Computer die Position der Werte findet muss er die Position berechnen im Speicher sieht das bei 4Bit Datein so aus:

[0000][0001][0010][0011]

er findet sie mit DatentypBit x Index, unser erster wert ist 4 mal 0 also ganz links, der zweite ist 4 mal 1 also muss er 4 stellen von links zum zweiten wert in unserem Fall hat er den Wert 1. Um den letzten wert zu finden muss er 4 mal 3 rechnen (3 = länge-1) das ist 12 und wenn wir nun 12 stellen von links gehen ist unser letzter wert 4 (Binär gesehen!).

Aber genug dazu in der schleife setzen wie die Werte nun selbst mit dem Namen des Arrays und den eckigen klammern kann ich den Index ansprechen und ihm einen wert zuweisen(Zeile 6) genauso kann ich aber auch den wert verwenden (Zeile 7).

 

Nachtrag

Vielen Dank fürs lesen, bei Fragen,Anregungen oder Tipp/Rechtschreibfehlern bitte Kommentieren.