Difference between revisions of "AVR Embedded Tutorial - Simple GPIO on and off output/de"
(Blanked the page) |
|||
Line 1: | Line 1: | ||
+ | {{Translate}} | ||
+ | =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. | ||
+ | <syntaxhighlight lang="pascal">DDRx := DDRx or (1 shl Pinx);</syntaxhighlight> | ||
+ | |||
+ | Pin auf HIGH: | ||
+ | <syntaxhighlight lang="pascal">PORTx := PORTx or (1 shl Pinx);</syntaxhighlight> | ||
+ | Pin auf LOW: | ||
+ | <syntaxhighlight lang="pascal">PORTx := PORTx and not (1 shl Pinx);</syntaxhighlight> | ||
+ | |||
+ | Lässt man DDRx auf LOW, dann wird mittels PORTx ein PulUp-Widerstand aktiviert. Dies wird gebraucht, um einen Taster gegen GND anzuschließen. Somit kann man auf einen physikalischen PulUp-Widerstand verzichten. | ||
+ | |||
+ | 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> | ||
+ | |||
+ | ==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== | ||
+ | <syntaxhighlight lang="pascal"> | ||
+ | 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. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==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. | ||
+ | <syntaxhighlight lang="pascal"> | ||
+ | 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; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===digitalWrite=== | ||
+ | Entspricht in etwa '''digitalWrite(...''' von Arduino. | ||
+ | <syntaxhighlight lang="pascal"> | ||
+ | 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; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===digitalRead=== | ||
+ | Entspricht in etwa '''digitalRead(...''' von Arduino. | ||
+ | <syntaxhighlight lang="pascal"> | ||
+ | function ReadPortB(bit: byte): Boolean; | ||
+ | begin | ||
+ | Result := PINB and (1 shl bit) <> 0; | ||
+ | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | [[Category:AVR]] {{AutoCategory}} |
Revision as of 00:21, 6 November 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 PulUp-Widerstand aktiviert. Dies wird gebraucht, um einen Taster gegen GND anzuschließen. Somit kann man auf einen physikalischen PulUp-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;