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

From Free Pascal wiki
Jump to navigationJump to search
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.
 +
* Pin auf Ausgabe:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
DDRx := DDRx  or (1 shl Pinx);
 
DDRx := DDRx  or (1 shl Pinx);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Pin auf HIGH:
+
* Pin auf HIGH:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
PORTx := PORTx or (1 shl Pinx);
 
PORTx := PORTx or (1 shl Pinx);
 
</syntaxhighlight>
 
</syntaxhighlight>
Pin auf LOW:
+
 
 +
* Pin auf LOW:
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
PORTx := PORTx and not (1 shl Pinx);
 
PORTx := PORTx and not (1 shl Pinx);
 +
</syntaxhighlight>
 +
 +
* Pin umschalten:
 +
<syntaxhighlight lang="pascal">
 +
PORTx := PORTx xor (1 shl Pinx);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Line 29: Line 36:
 
Dazu werden 2 LEDs an Pin 0 und 1 von PortD angeschlossen.
 
Dazu werden 2 LEDs an Pin 0 und 1 von PortD angeschlossen.
  
==Beispiel ATtiny2313==
+
===Wechselblinker ATtiny2313===
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
program Project1;
 
program Project1;
Line 57: Line 64:
 
     PORTD := PORTD or (1 shl DP1);      // Pin1 ein
 
     PORTD := PORTD or (1 shl DP1);      // Pin1 ein
 
     PORTD := PORTD and not (1 shl DP0); // Pin0 aus
 
     PORTD := PORTD and not (1 shl DP0); // Pin0 aus
 +
    mysleep(sl);                        // Pause
 +
  until 1 = 2;
 +
end.
 +
</syntaxhighlight>
 +
 +
===Pin Umschalten ATtiny2313===
 +
Wen man den Pin umschalten will, egal wie sein Ursprungs zustand ist, kann man die mit einer '''xor''' Verknüpfung lösen.
 +
Das es auch einen Wechselblinker, wird '''DP0''' zuerst auf HIGH gestellt.
 +
<syntaxhighlight lang="pascal">
 +
begin
 +
  // Pin 0 und 1 von PortD auf Ausgabe.
 +
  DDRD := DDRD  or (1 shl DP0) or (1 shl DP1);
 +
  PORTD := PORTD or (1 shl DP0);        // Pin0 ein
 +
 +
  repeat
 +
 +
    // LED wechseln
 +
    PORTD := PORTD xor (1 shl DP0);    // Pin0 umschalten
 +
    PORTD := PORTD xor (1 shl DP1);    // Pin1 umschalten
 
     mysleep(sl);                        // Pause
 
     mysleep(sl);                        // Pause
 
   until 1 = 2;
 
   until 1 = 2;
Line 63: Line 89:
  
 
==Vereinfachung Portzugriffe==
 
==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.
+
Wen man auf Ports zugreift und nicht immer die '''and''', '''or''' und '''xor''' Verknüpfungen schreiben will, kann auch folgende Proceduren/Funktionen verwenden. Die Beispiele zeigen dies für '''PORTD'''. Für andere Ports kann man diese sehr einfach anpassen.
 +
 
 
===pinMode===
 
===pinMode===
 
Entspricht in etwa '''pinMode(...''' von Arduino.
 
Entspricht in etwa '''pinMode(...''' von Arduino.
Line 87: Line 114:
 
     PORTD := PORTD and not (1 shl Pin);
 
     PORTD := PORTD and not (1 shl Pin);
 
   end;
 
   end;
 +
end;
 +
</syntaxhighlight>
 +
 +
===digitalSwitch===
 +
Schaltet den Pin um, gibt es nicht beim Arduino.
 +
<syntaxhighlight lang="pascal"> 
 +
procedure WritePortD(Pin: byte);
 +
begin
 +
  PORTD := PORTD xor (1 shl Pin);
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 17:40, 6 December 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.

  • Pin auf Ausgabe:
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);
  • Pin umschalten:
PORTx := PORTx xor (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.

Wechselblinker 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 asm nop 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.

Pin Umschalten ATtiny2313

Wen man den Pin umschalten will, egal wie sein Ursprungs zustand ist, kann man die mit einer xor Verknüpfung lösen. Das es auch einen Wechselblinker, wird DP0 zuerst auf HIGH gestellt.

begin
  // Pin 0 und 1 von PortD auf Ausgabe.
  DDRD := DDRD  or (1 shl DP0) or (1 shl DP1);
  PORTD := PORTD or (1 shl DP0);        // Pin0 ein

  repeat

    // LED wechseln
    PORTD := PORTD xor (1 shl DP0);     // Pin0 umschalten
    PORTD := PORTD xor (1 shl DP1);     // Pin1 umschalten
    mysleep(sl);                        // Pause
  until 1 = 2;
end.

Vereinfachung Portzugriffe

Wen man auf Ports zugreift und nicht immer die and, or und xor Verknüpfungen schreiben will, kann auch folgende Proceduren/Funktionen verwenden. Die Beispiele zeigen dies für PORTD. 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;

digitalSwitch

Schaltet den Pin um, gibt es nicht beim Arduino.

  
procedure WritePortD(Pin: byte);
begin
  PORTD := PORTD xor (1 shl Pin);
end;

digitalRead

Entspricht in etwa digitalRead(... von Arduino.

  
function ReadPortB(bit: byte): Boolean;
begin
  Result := PINB and (1 shl bit) <> 0;
end;

Siehe auch