Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Shiftregister/de

Deutsch · English

Schieberegister

Der Beispielcode ist für ein ATtiny44.

Schieberegister werden folgende verwendet:

Warning: Die Leseroutine ist nicht kompatibel mit Arduino shiftIn(... ! Die Arduino Lesefunktion ist für andere Schieberegister. Der Clock muss anders angesteuert werden.

Will man MSB und LSB vertauschen, dann muss man dementsprechend einfach to mit downto austauschen.

Portzugriffe

Wie die Schieberegisterbefehle auf die Ports zugreifen, siehe hier: GPIO-Ausgabe.
Nicht vergessen die Ausgänge auch als Ausgang einzustellen (DDRx).

Port-Konstanten

Die verwendeten Pins des ATtiny44 und der Shiftregister. Beim AVR kann man beliebige Pins nehmen. Ich habe die Ports, ausgenommen des Data-Ports, global deklariert, somit ist der Zugriff aus die Schiftregister ein wenig schneller. Wen man sie lokal übergeben würde, würde alles komplizierter werden, da wir direkten Portzugriff verwenden. Arduino macht dies anders, aber dafür ist es etwa um den Faktor 10x langsamer.

IC Attiny44 74HC165 74HC595
PinNr Bezeichnung PinNr Bezeichnung PinNr Bezeichnung
dataOutPin 13 PA0 14 DS
dataInPin 12 PA1 10 DS
latchPin 11 PA2 1 PL 12 ST_CP
clockPin 10 PA3 2 CP 11 SH_CP

Für den Port wird eine Variable deklariert, dies hat den Vorteil, das man nicht alle Ports in den Shiftregister-Funktionen ändern muss.

pascal
var
  shiftPORT: byte absolute PORTA;
  shiftDDR:  byte absolute DDRA;
  shiftPIN:  byte absolute PINA;
const
  dataOutPin = 0;
  dataInPin  = 1;
  latchPin   = 2;
  clockPin   = 3;

Schieberegister schreiben 74HC595

pascal
procedure shiftOut595(val: Byte);
var
  i: Byte;
begin
  for i := 7 downto 0 do begin  // MSBFIRST
    if (val and (1 shl i)) <> 0 then begin
      shiftPORT := shiftPORT or (1 shl dataOutPin);
    end else begin
      shiftPORT := shiftPORT and not (1 shl dataOutPin);
    end;
    shiftPORT := shiftPORT or (1 shl clockPin);
    shiftPORT := shiftPORT and not (1 shl clockPin);
  end;
end;

Schieberegister lesen 74HC165

pascal
function ShiftIn165: Byte;
var
  i: Byte;
begin
  Result := 0;
  for i := 0 to 7 do begin  // LSBFIRST
    Result    := (Result shl 1) or ((shiftPIN and (1 shl dataInPin)) shr dataInPin);
    shiftPORT := shiftPORT or (1 shl clockPin);
    shiftPORT := shiftPORT and not (1 shl clockPin);
  end;
end;

Schieberegister Arduino

Diese Version entspricht dem shiftIn von Arduino.

pascal
function ShiftIn: Byte;
var
  i: Byte;
begin
  Result := 0;
  for i := 0 to 7 do begin  // LSBFIRST
    shiftPORT := shiftPORT or (1 shl clockPin);
    Result    := (Result shl 1) or ((shiftPIN and (1 shl dataInPin)) shr dataInPin);
    shiftPORT := shiftPORT and not (1 shl clockPin);
  end;
end;

Beispiel für die Verwendung der Schieberegister

Lesen von einem Schieberegister

Bevor man das Schieberegister auslesen kann, muss der Portzustand in das Latchregister geschrieben werden, dies geschieht über den LatchPin.

Beispiel für ein 74HC165

pascal
var
  b: Byte;
begin

  // Daten in Latch
  shiftPORT := shiftPORT and not (1 shl latchPin);
  shiftPORT := shiftPORT or (1 shl latchPin);

  // Schieberegister auslesen
  b := ShiftIn74HC165;

Beispiel für kaskadierte 74HC165

pascal
var
  b0, bn: Byte;
begin

  // Daten in Latch
  shiftPORT := shiftPORT and not (1 shl latchPin);
  shiftPORT := shiftPORT or (1 shl latchPin);

  // Schieberegister auslesen
  b0 := ShiftIn74HC165;
  //...
  bn := ShiftIn74HC165;

Schreiben in ein Schieberegister

Wen die Daten in das Schieberegister geschrieben sind, muss man noch den Latch Takten, das die aktuellen Ausgänge aktiv werden.

Beispiel für ein 74HC595

pascal
var
  b: Byte;
begin
  b := 123;

  // Schieberegister schreiben
  shiftOut595(b);

  // Daten in Latch
  shiftPORT := shiftPORT and not (1 shl latchPin);
  shiftPORT := shiftPORT or (1 shl latchPin);

Beispiel für kaskadierte 74HC595

pascal
var
  b0, bn: Byte;
begin
  b0 := 123;
  //...
  bn := 789;

  // Schieberegister schreiben
  shiftOut595(b0);
  // ...
  shiftOut595(bn);

  // Daten in Latch
  shiftPORT := shiftPORT and not (1 shl latchPin);
  shiftPORT := shiftPORT or (1 shl latchPin);

Siehe auch

Autor: Mathias


From the Free Pascal wiki, page "AVR Embedded Tutorial - Shiftregister/de", as it stood on 2023-08-03 after a change by Mathias, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 3, last changed by WikiArchive .

Edited on wiki.freepascal.org by 2 people, 2017–2023

From the official wiki's backup of 26 May 2024: who edited this page there, and when. Edits made there after that date were not recorded, and the earlier versions are not shown here; the main page says why.

WhenWhoWhat changed
MathiasCreated page
MathiasSchieberegister schreiben
MathiasPortzugriffe
MathiasSchieberegister
MathiasSchieberegister lesen
MathiasSchieberegister lesen
MathiasSchieberegister schreiben
MathiasPort-Konstanten
MathiasSchieberegister schreiben
MathiasSchieberegister lesen
MathiasSchieberegister lesen 74HC165
MathiasSchieberegister Arduino
MathiasSchieberegister schreiben
MathiasPort-Konstanten
MathiasPort-Konstanten
MathiasPort-Konstanten
MathiasSchieberegister
MathiasBeispiel für die Verwendung der Schieberegister
Mathias
MathiasPort-Konstanten
MathiasSchieberegister
MathiasBeispiel für ein 74HC165
MathiasBeispiel für kaskadierte 74HC165
MathiasSchreiben in ein Schieberegister
MathiasBeispiel für kaskadierte 74HC595
MathiasPort-Konstanten
MathiasSchieberegister
MathiasPort-Konstanten
MathiasPort-Konstanten
MathiasSchieberegister schreiben 74HC595
MathiasSchieberegister lesen 74HC165
MathiasSchieberegister schreiben 74HC595
MathiasSchieberegister schreiben 74HC595
MathiasSchieberegister lesen 74HC165
MathiasPort-Konstanten
MathiasSchieberegister Arduino
MathiasBeispiel für ein 74HC165
MathiasBeispiel für kaskadierte 74HC165
MathiasBeispiel für ein 74HC595
MathiasBeispiel für kaskadierte 74HC595
MathiasBeispiel für kaskadierte 74HC595
MathiasSiehe auch
Mathias (minor)
MathiasSiehe auch
TrevFixed template loop; syntax highlighting; modded categories to German; added language category (minor)
MathiasSchieberegister
Mathias

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.