Dienstag, 14. Juli 2015

GPIOs in C steuern

In diesem Artikel geht es darum, wie man die GPIOs des Arduino (die Pins des Arduino) mit C, programmieren kann. Um den Arduino in C zu programmieren verwende ich das Atmel Studio. Die Installation des Atmel Studio habe ich bereits hier erklärt.

In C werden alle Pins, wie bei der Port Manipulation in der Arduino IDE, über drei Register gesteuert. Das sind das DDR Register, über welches festgelegt wird, ob es sich um einen Input oder einen Output handelt, das PORT Register, über welches festgelegt wird, ob eine Output auf HIGH oder LOW gestellt werden soll, und das PIN Register, über welches man auslesen kann, ob eine Spannung an einem Eingang anliegt oder nicht. 
Die Pins des Arduino sind in sogenannte Ports aufgeteilt. Ein Port ist eine Art "Pingruppe". Der Arduino Uno besitzt drei Ports:
Jeder Port besteht aus den einzelnen Pins. Diese beginnen immer bei 0. Pin 0 eines Ports ist immer der Pin des Arduino mit der kleinsten Zahl. Also beispielsweise Port B beinhaltet die Pins 8 bis 13 des Arduino. Dementsprechend ist Pin 8 des Arduino Pin 0 des Ports B. 

Outputs in C

Um einen Pins als Output zu verwenden, muss man ihn zunächst als Output definieren. Das geht über den Befehl DDRx = (1 << y). x steht dabei für den Port und y für die Zahl des Pins. Für den Pin 5 des Ports B wäre das beispielsweise DDRB = (1 << 5); Nun kann man den Pin über PORTB |= (1<<5); anschalten und über PORTB &= ~(1 << 5); ausschalten. Die Tilde(~) invertiert das Ganze. Also wird keine 1, sondern eine 0, gespeichert. 

Inputs in C

Auch ein Input wird in C über das DDR Register definiert. Dazu verwendet man den Befehl DDRx = ~(1 << y);. Nun kann man in einer if Schleife überprüfen, ob ein Pin auf High oder LOW ist. Dazu genügt als Bedingung PINx & (1 << y). Wenn man überprüfen will, ob ein Pin auf LOW ist kehrt man die Bedingung durch ein ! um. Das sähe dann so aus: if(!(PINx & (1 << y))).

Zusammenfassung

Pin definieren:
OUTPUT: DDRx = (1 << y); Beispiel: DDRB = (1 << 5);
INPUT: DDRx = ~(1 << y); Beispiel: DDRB = ~(1 << 5);

Output schalten:
HIGH: PORTx |= (1 << y); Beispiel: PORTB |= (1 << 5);
LOW: PORTx &= ~(1 << y); Beispiel: PORTB &= ~(1 << 5); 

INPUT auslesen(für if Schleifen):
PINx & (1 << y) Beispiel: if(PINB & (1 << 5)) {} Wenn auf LOW: if(!(PINB & (1 << 5)) {}

Natürlich könnt ihr eure Pins auch "portweise" steuern:

PORTB = 0b11111111;
Das 0b gibt dabei das Format an(binär).





Keine Kommentare:

Kommentar veröffentlichen