Difference between revisions of "AVR Embedded Tutorial - Shiftregister/de"
From Free Pascal wiki
Jump to navigationJump to searchLine 6: | Line 6: | ||
=Schieberegister= | =Schieberegister= | ||
Der Beispielcode ist für ein ATtiny2313. | 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== | ==Portzugriffe== | ||
Wie die Schieberegisterbefehle auf die Ports zugreifen, siehe hier: [[AVR Embedded Tutorial - Simple GPIO on and off output/de|GPIO-Ausgabe]].<br>Nicht vergessen die Ausgänge auch als Ausgang einzustellen (DDRx). | Wie die Schieberegisterbefehle auf die Ports zugreifen, siehe hier: [[AVR Embedded Tutorial - Simple GPIO on and off output/de|GPIO-Ausgabe]].<br>Nicht vergessen die Ausgänge auch als Ausgang einzustellen (DDRx). | ||
Line 25: | Line 30: | ||
==Schieberegister schreiben== | ==Schieberegister schreiben== | ||
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
− | + | procedure shiftOut595(val: byte); | |
var | var | ||
− | |||
i: byte; | i: byte; | ||
begin | begin | ||
− | + | for i := 7 downto 0 do begin // MSBFIRST | |
− | for i := 0 | + | if (val and (1 shl i)) <> 0 then begin |
− | + | WritePortD(dataOutPin, True); | |
+ | end else begin | ||
+ | WritePortD(dataOutPin, False); | ||
+ | end; | ||
WritePortD(clockPin, True); | WritePortD(clockPin, True); | ||
− | |||
WritePortD(clockPin, False); | WritePortD(clockPin, False); | ||
− | |||
end; | end; | ||
− | |||
end; | end; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 50: | Line 54: | ||
begin | begin | ||
mysleep(20); | mysleep(20); | ||
− | for i := 0 to 7 do begin | + | for i := 0 to 7 do begin // LSBFIRST |
Data := (Data shl 1) or Byte(ReadPortB(dataInPin)); | Data := (Data shl 1) or Byte(ReadPortB(dataInPin)); | ||
WritePortD(clockPin, True); | WritePortD(clockPin, True); |
Revision as of 19:49, 6 November 2017
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
Data: byte = 0;
i: byte;
begin
mysleep(20);
for i := 0 to 7 do begin // LSBFIRST
Data := (Data shl 1) or Byte(ReadPortB(dataInPin));
WritePortD(clockPin, True);
mysleep(20);
WritePortD(clockPin, False);
mysleep(20);
end;
Result := Data;
end;