Difference between revisions of "AVR Embedded Tutorial - Shiftregister/de"

From Free Pascal wiki
Jump to navigationJump to search
Line 53: Line 53:
 
begin
 
begin
 
   Result := 0;
 
   Result := 0;
   for i := 0 to 7 do begin
+
   for i := 0 to 7 do begin // LSBFIRST
 
     Result := (Result shl 1) or Byte(ReadPortB(dataInPin));
 
     Result := (Result shl 1) or Byte(ReadPortB(dataInPin));
 
     WritePortD(clockPin, True);
 
     WritePortD(clockPin, True);

Revision as of 21:13, 6 November 2017

Template:Translate

Warning-icon.png

Warnung: In Arbeit


Schieberegister

Der Beispielcode ist für ein ATtiny2313. Zum Lesen habe einen 74HC165 genommen, zum Schrieben einen 74HC595. Achtung, die Leseroutine ist nicht kompatibel mit Arduinos shiftIn(... ! Die Arduino Lesefunktion ist für andere Schieberegister.

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

Ich habe folgende Pins des ATtiny2313 genommen. Man kann aber beliebige Pins dafür nehmen.

const
  // PortB
  dataInPin = 0;  // PB0

  // PortD
  dataOutPin = 0; // PD0
  latchPin = 1;   // PD1
  clockPin = 2;   // PD2

Schieberegister schreiben

  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
        WritePortD(dataOutPin, True);
      end else begin
        WritePortD(dataOutPin, False);
      end;
      WritePortD(clockPin, True);
      WritePortD(clockPin, False);
    end;
  end;

Schieberegister lesen

function ShiftIn74HC165: Byte;
var
  i: Byte;
begin
  Result := 0;
  for i := 0 to 7 do begin  // LSBFIRST
    Result := (Result shl 1) or Byte(ReadPortB(dataInPin));
    WritePortD(clockPin, True);
    WritePortD(clockPin, False);
  end;
end;