Exkurs: Vergleich mit herkömmlicher MC-Programmierung in C
Professionelle MC-Programmierung kann in Assembler oder in C erfolgen.
Hier wird demonstriert, an welche zusätzlichen Dinge herkömmliche C-Entwicklung im Vergleich zur Arduino-Programmierung am Beispiel der blinkenden LED berücksichtigen muss:
Betrachten wir zunächst eine sogenannte Header-Datei, die vom Hauptprogramm inkludiert, d.h. eingebunden wird:
- #ifndef LED_H // damit diese Datei in größeren Projekten
- #define LED_H // ohne Fehler auch mehrfach inkludiert werden könnte
- // Pins der angeschlossenen LEDs
- // (Quasi-Konstante wird durchgehend groß geschrieben)
- #define LED1 6
- #define ON 1
- #define OFF 0
- #endif /* LED_H */
Quellcode led.h
Hier wird neben ON und OFF der Pin an dem die LED angeschlossen wird, definiert. (So muss man sich keine Pin-Nummern merken.)
Nun folgt das Hauptprogramm, dass unter anderem diese Header-Datei einbindet:
- // Header-Dateien einbinden
- #include <avr/io.h> // allg. MC-Definitionen
- #include "../../led/led/led.h" // unsere Definitionen
- #define F_CPU 12000000UL // Taktfrequenz, des MC
- #include <util/delay.h> // damit hier die richtige Länge des Delay bereichnet werden kann
- // Das Richtungsregister des PIN wird auf Ausgang geschaltet
- void ledInit()
- {
- DDRD |= (1 << LED1);
- }
- // Schaltet die LED ein oder aus
- void ledSwitch(int led, int onOff)
- {
- if (onOff == ON)
- PORTD |= (1 << led);
- else
- PORTD &= ~(1 << led);
- }
- // Hauptprogramm
- int main(void)
- {
- ledInit();
- while(1) // Endlosschleife
- {
- ledSwitch(LED1,ON);
- _delay_ms(1000);
- ledSwitch(LED1,OFF);
- _delay_ms(1000);
- }
- }
Im Vergleich zum Arduino-Programm erspart man sich
- Probleme mit dem Heraussuchen und Konfigurieren der richtigen Header-Dateien (delay)
- die Hauptfunktion (wird automatisch generiert)
- die Konfigurierung des PIN auf Ausgang und das Schalten des PIN sind viel einfacher, weil dies Funktionen größtenteils schon vordefiniert sind.
Eine Erklärung dieser Konfiguration mit Hilfe der Bit-Operatoren folgt für fortgeschrittene Programmierer weiter unten.
Bit-Operatoren
|
Operator |
Beispiel |
Bedeutung |
<<
|
i << 2
|
2x Linksschieben (Multiplikation mit 2er-Potenzen) |
>>
|
i >> 1
|
1x Rechtsschieben (Division durch 2er-Potenzen) |
&
|
i & 7
|
bitweises
UND mit 0000 00111 |
^
|
i ^ 7
|
bitweises XOR |
|
|
i | 7
|
bitweises ODER |
~
|
~7
|
Bitweise Negation |
<<=
|
i <<= 3
|
i = i << 3 |
>>=
|
i >>= 3
|
i = i >> 3 |
&=
|
i &= 3
|
i = i & 3 |
^=
|
i ^= 3
|
i = i ^ 3 |
|=
|
i |= 3
|
i = i | 3 |
Beispiel:
#include <avr/io.h>
#define MEINBIT 2PORTA |= (1 << MEINBIT); // Setzt Bit 2 an Port A auf 1 (ohne die anderen Bits zu beeinflussen)
PORTA &= ~(1 << MEINBIT); // löscht Bit 2 an Port A
Mit dieser Methode lassen sich auch mehrere Bits eines Registers gleichzeitig setzen und löschen:
#include <avr/io.h> DDRA &= ~((1<<PA0) | (1<<PA3)); // PA0 und PA3 als Eingaenge |