Difference between revisions of "AVR Embedded Tutorial - Simple GPIO on and off output/de"
Line 5: | Line 5: | ||
==Direkte Portmanipulation== | ==Direkte Portmanipulation== | ||
Bevor man einen GPIO-Pin auf '''HIGH''' schalten kann, muss man diesen als Ausgang konfigurieren. Dies geht über DDRx. | Bevor man einen GPIO-Pin auf '''HIGH''' schalten kann, muss man diesen als Ausgang konfigurieren. Dies geht über DDRx. | ||
− | <syntaxhighlight lang="pascal">DDRx := DDRx or (1 shl Pinx);</syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
+ | DDRx := DDRx or (1 shl Pinx); | ||
+ | </syntaxhighlight> | ||
Pin auf HIGH: | Pin auf HIGH: | ||
− | <syntaxhighlight lang="pascal">PORTx := PORTx or (1 shl Pinx);</syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
+ | PORTx := PORTx or (1 shl Pinx); | ||
+ | </syntaxhighlight> | ||
Pin auf LOW: | Pin auf LOW: | ||
− | <syntaxhighlight lang="pascal">PORTx := PORTx and not (1 shl Pinx);</syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
+ | PORTx := PORTx and not (1 shl Pinx); | ||
+ | </syntaxhighlight> | ||
− | Lässt man DDRx auf LOW, dann wird mittels PORTx ein | + | Lässt man DDRx auf '''LOW''', dann wird mittels PORTx ein '''PullUp'''-Widerstand aktiviert. Dies wird gebraucht, um einen Taster gegen GND anzuschließen. Somit kann man auf einen externen '''PullUp'''-Widerstand verzichten. |
Den Status des GPIO-Pins kann man mittels PINx abfragen. | Den Status des GPIO-Pins kann man mittels PINx abfragen. | ||
− | <syntaxhighlight lang="pascal">if PINx and (1 shl Pinx) > 0 then Pin_ist_HIGH;</syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
+ | if PINx and (1 shl Pinx) > 0 then Pin_ist_HIGH; | ||
+ | </syntaxhighlight> | ||
==Blink-Beispiel== | ==Blink-Beispiel== |
Revision as of 22:01, 1 December 2017
Einfache GPIO Ein und Aus-gabe
Direkte Portmanipulation
Bevor man einen GPIO-Pin auf HIGH schalten kann, muss man diesen als Ausgang konfigurieren. Dies geht über DDRx.
DDRx := DDRx or (1 shl Pinx);
Pin auf HIGH:
PORTx := PORTx or (1 shl Pinx);
Pin auf LOW:
PORTx := PORTx and not (1 shl Pinx);
Lässt man DDRx auf LOW, dann wird mittels PORTx ein PullUp-Widerstand aktiviert. Dies wird gebraucht, um einen Taster gegen GND anzuschließen. Somit kann man auf einen externen PullUp-Widerstand verzichten.
Den Status des GPIO-Pins kann man mittels PINx abfragen.
if PINx and (1 shl Pinx) > 0 then Pin_ist_HIGH;
Blink-Beispiel
Dieses Beispiel zeigt, wie man mit einem ATtiy2313 ein GPIO anspricht. Dazu werden 2 LEDs an Pin 0 und 1 von PortD angeschlossen.
Beispiel ATtiny2313
program Project1;
const
DP0 = 0; // Pin0 PortD
DP1 = 1; // Pin1 PortD
sl = 150000; // Verzögerung
procedure mysleep(t: int32); // Ein einfaches Delay.
var
i: Int32;
begin
for i := 0 to t do begin
asm
NOP;
end;
end;
end;
begin
// Pin 0 und 1 von PortD auf Ausgabe.
DDRD := DDRD or (1 shl DP0) or (1 shl DP1);
repeat
// LED wechseln
PORTD := PORTD or (1 shl DP0); // Pin0 ein
PORTD := PORTD and not (1 shl DP1); // Pin1 aus
mysleep(sl); // Pause
// LED wechseln
PORTD := PORTD or (1 shl DP1); // Pin1 ein
PORTD := PORTD and not (1 shl DP0); // Pin0 aus
mysleep(sl); // Pause
until 1 = 2;
end.
Vereinfachung Portzugriffe
Wen man auf Ports zugreift und nicht immer die and und or Verknüpfungen schrieb will, kann auch folgende Proceduren/Funktionen verwenden. Für andere Ports kann man diese sehr einfach anpassen.
pinMode
Entspricht in etwa pinMode(... von Arduino.
procedure ModePortD(Pin: byte; Value: Boolean);
begin
if Value then begin
DDRD := DDRD or (1 shl Pin);
end else begin
DDRD := DDRD and not (1 shl Pin);
end;
end;
digitalWrite
Entspricht in etwa digitalWrite(... von Arduino.
procedure WritePortD(Pin: byte; Value: Boolean);
begin
if Value then begin
PORTD := PORTD or (1 shl Pin);
end else begin
PORTD := PORTD and not (1 shl Pin);
end;
end;
digitalRead
Entspricht in etwa digitalRead(... von Arduino.
function ReadPortB(bit: byte): Boolean;
begin
Result := PINB and (1 shl bit) <> 0;
end;
Siehe auch
- Übersichtseite AVR Embedded Tutorial/de