Difference between revisions of "AVR Embedded Tutorial - Simple GPIO on and off output/de"

From Lazarus wiki
Jump to navigationJump to search
(Blanked the page)
(Undo revision 113656 by Mathias (talk))
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

Template: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.

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;