AVR Embedded Tutorial - Simple GPIO on and off output/de
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