Prinzipieller Aufbau eines Programmes
Bevor man sich an die Programmierung von irgendeinem Prozessor macht, muss man natürlich erst einmal wissen, wie ein Programm überhaupt aufgebaut ist.
Objektorientierte Programmierung kann man bei einem solchen kleinen Gerät natürlich mal total vergessen, hier wird ein Programm nur von ganz oben nach ganz unten abgearbeitet.
Dies nennt man das EVA-Prinzip:
Eingabe:
Der Prozessor bekommt Daten über einen Pin geliefert oder misst irgendetwas: Eine Spannung, einen Widerstand oder einfach nur ein High/Low Signal (Spannung liegt an/liegt nicht an).
Verarbeitung:
Jetzt wird mit dem Wert etwas gemacht. Eventuell muss ihn umrechnen, oder man berechnet einen Wert der auf einem Display gezeigt werden soll, oder man möchte diesen Wert mit einem gespeicherten Wert vergleichen?
Ausgabe:
Jetzt wird gehandelt! Der Prozessor schreibt etwas auf ein Display, eine Led wird vielleicht zum leuchten gebracht oder es wird etwas viel größeres gesteuert.
Nachdem diese drei Schritte abgearbeitet wurden, fängt das ganze wieder von vorne an. Es wird wieder Eingelesen, Verarbeitet und dann Ausgegeben: EVA nunmal.
Mit Sicherheit hat es jeder schon herausgefunden: Wir brauchen eine Endlosschleife. Aber schauen wir uns doch mal ein “einfaches” Programm einmal an:
#include <avr/io.h>
int main ( void ) {
//Initialisierung
while ( 1 ) {
//Hauptprogramm
}
}
Und nun die Erklärung:
– Die erste Zeile bindet einfach nur eine Header-Datei ein, die wir für die avr-Prozessorserie brauchen.
– Die zweite Zeile ist der Hauptfunktion. Ihr könnt in eurem C-Programm beliebig viele Funktionen schreiben, die erste die beim Start ausgeführt wird, ist und bliebt aber die main(void).
– Als nächstes kommt die Initialisierung. Diese wird beim Start eures Prozessors einmal durchgeführt: Hier könnt ihr bestimmen, welche Pins des Prozessors Eingänge oder Ausgänge sind. Ihr könnt euch die Variablen anlegen, die ihr braucht, oder auch eine serielle Kommunikation vorbereiten.
– Nun folgt die prophezeite Endlosschleife. “while(1)” wird garantiert niemals beendet. In dieser Endlosschleife könnt ihr jetzt eure Anweisungen hineinschreiben. Denk immer daran, wie man das macht:
– Erst liest mal Werte ein
– Dann verarbeitet man sie
– Zum Schluss erfolgt die Ausgabe.
Bevor ich jetzt aber den Begriff EVA nochmal in den Mund nehme, beende ich schnell mal dieses Kapitel. Nun wisst ihr wie ein “normales” Programm aufgebaut ist
1. wird soweit ich weis eine main genau einmal beim start aufgerufen, deswegen machts wenig sinn seinen ganzen code dareinzuschreiben, siehe callbacks.
die idee mit dem while um etwas endlos zu wiederholen ist vom ansatz gut aber trotzdem eine schlechte lösung, weil: ressourcenfressend, da die abfragen bei jeder taktung starzen würde.
man muss prioritäten setzen wenn man wenig ressourcen zur verfügung hat. weil ich bezweifels das es sinn macht immer abzufrageb ob z.b. der schalter jetzt an oder aus ist.
ein kleines beispiel mit deinem und meinem code:
wir haben eine art regensensor für eine scheibenwischanlage; du fragst in der schleife ob der sensor meldet und wenn ja dann soll der motor an gejen usw… ist bei zwei oder drei sensoren und motoren ok wobei es trotzdem besser gehen würde, fügen wir aber jetzt nochmal fünf hinzu wollen eine protokollierung und oder eine anzeige kommt er schon mehr ins schwitzen. und das nur mit sowenigen aufgaben.
eleganter wäre es einen regelmäsigen timer zu erstellen der alle 2000ms sekunden mithilfe einer for schleife die sensoren abfragt… was locker reicht.
mit einem timer spart man richtig viel an ressourcen.
ansonsten passt schon,
wünschenswert wäre eben die erklärung der basics wie, variablen, includes,callbacks usw..
mfg