Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Shiftregister/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Schieberegister
22
33Der Beispielcode ist für ein ATtiny44.
44
55Schieberegister werden folgende verwendet:
66
77- Lesen: 74HC165
88- Schreiben: 74HC595.
99
1010> **Warning:** Die Leseroutine ist **nicht** kompatibel mit Arduino **shiftIn(...** ! Die Arduino Lesefunktion ist für andere Schieberegister. Der Clock muss anders angesteuert werden.
1111
1212Will man **MSB** und **LSB** vertauschen, dann muss man dementsprechend einfach **to** mit **downto** austauschen.
1313
1414## Portzugriffe
1515
1616Wie die Schieberegisterbefehle auf die Ports zugreifen, siehe hier: [[AVR Embedded Tutorial - Simple GPIO on and off output/de|GPIO-Ausgabe]].\
1717Nicht vergessen die Ausgänge auch als Ausgang einzustellen (DDRx).
1818
1919## Port-Konstanten
2020
2121Die 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.
2222
23-<table>
2423<thead>
25-<tr>
26-<th>IC</th>
27-<th colspan="2">Attiny44</th>
28-<th colspan="2">74HC165</th>
29-<th colspan="2">74HC595</th>
30-</tr>
24+
3125</thead>
3226<tbody>
33-<tr>
34-<td></td>
35-<td>PinNr</td>
36-<td>Bezeichnung</td>
37-<td>PinNr</td>
38-<td>Bezeichnung</td>
39-<td>PinNr</td>
40-<td>Bezeichnung</td>
41-</tr>
42-<tr>
43-<td>dataOutPin</td>
44-<td>13</td>
45-<td>PA0</td>
46-<td></td>
47-<td></td>
48-<td>14</td>
49-<td>DS</td>
50-</tr>
51-<tr>
52-<td>dataInPin</td>
53-<td>12</td>
54-<td>PA1</td>
55-<td>10</td>
56-<td>DS</td>
57-<td></td>
58-<td></td>
59-</tr>
60-<tr>
61-<td>latchPin</td>
62-<td>11</td>
63-<td>PA2</td>
64-<td>1</td>
65-<td>PL</td>
66-<td>12</td>
67-<td>ST_CP</td>
68-</tr>
69-<tr>
70-<td>clockPin</td>
71-<td>10</td>
72-<td>PA3</td>
73-<td>2</td>
74-<td>CP</td>
75-<td>11</td>
76-<td>SH_CP</td>
77-</tr>
27+
7828</tbody>
79-</table>
8029
8130Für den Port wird eine Variable deklariert, dies hat den Vorteil, das man nicht alle Ports in den Shiftregister-Funktionen ändern muss.
8231
8332``` pascal
8433var
8534 shiftPORT: byte absolute PORTA;
8635 shiftDDR: byte absolute DDRA;
8736 shiftPIN: byte absolute PINA;
8837const
8938 dataOutPin = 0;
9039 dataInPin = 1;
9140 latchPin = 2;
9241 clockPin = 3;
9342```
9443
9544## Schieberegister schreiben 74HC595
9645
9746``` pascal
9847procedure shiftOut595(val: Byte);
9948var
10049 i: Byte;
10150begin
10251 for i := 7 downto 0 do begin // MSBFIRST
10352 if (val and (1 shl i)) <> 0 then begin
10453 shiftPORT := shiftPORT or (1 shl dataOutPin);
10554 end else begin
10655 shiftPORT := shiftPORT and not (1 shl dataOutPin);
10756 end;
10857 shiftPORT := shiftPORT or (1 shl clockPin);
10958 shiftPORT := shiftPORT and not (1 shl clockPin);
11059 end;
11160end;
11261```
11362
11463## Schieberegister lesen 74HC165
11564
11665``` pascal
11766function ShiftIn165: Byte;
11867var
11968 i: Byte;
12069begin
12170 Result := 0;
12271 for i := 0 to 7 do begin // LSBFIRST
12372 Result := (Result shl 1) or ((shiftPIN and (1 shl dataInPin)) shr dataInPin);
12473 shiftPORT := shiftPORT or (1 shl clockPin);
12574 shiftPORT := shiftPORT and not (1 shl clockPin);
12675 end;
12776end;
12877```
12978
13079## Schieberegister Arduino
13180
13281Diese Version entspricht dem **shiftIn** von Arduino.
13382
13483``` pascal
13584function ShiftIn: Byte;
13685var
13786 i: Byte;
13887begin
13988 Result := 0;
14089 for i := 0 to 7 do begin // LSBFIRST
14190 shiftPORT := shiftPORT or (1 shl clockPin);
14291 Result := (Result shl 1) or ((shiftPIN and (1 shl dataInPin)) shr dataInPin);
14392 shiftPORT := shiftPORT and not (1 shl clockPin);
14493 end;
14594end;
14695```
14796
14897## Beispiel für die Verwendung der Schieberegister
14998
15099### Lesen von einem Schieberegister
151100
152101Bevor man das Schieberegister auslesen kann, muss der Portzustand in das Latchregister geschrieben werden, dies geschieht über den LatchPin.
153102
154103#### Beispiel für ein 74HC165
155104
156105``` pascal
157106var
158107 b: Byte;
159108begin
160109
161110 // Daten in Latch
162111 shiftPORT := shiftPORT and not (1 shl latchPin);
163112 shiftPORT := shiftPORT or (1 shl latchPin);
164113
165114 // Schieberegister auslesen
166115 b := ShiftIn74HC165;
167116```
168117
169118#### Beispiel für kaskadierte 74HC165
170119
171120``` pascal
172121var
173122 b0, bn: Byte;
174123begin
175124
176125 // Daten in Latch
177126 shiftPORT := shiftPORT and not (1 shl latchPin);
178127 shiftPORT := shiftPORT or (1 shl latchPin);
179128
180129 // Schieberegister auslesen
181130 b0 := ShiftIn74HC165;
182131 //...
183132 bn := ShiftIn74HC165;
184133```
185134
186135### Schreiben in ein Schieberegister
187136
188137Wen die Daten in das Schieberegister geschrieben sind, muss man noch den Latch Takten, das die aktuellen Ausgänge aktiv werden.
189138
190139#### Beispiel für ein 74HC595
191140
192141``` pascal
193142var
194143 b: Byte;
195144begin
196145 b := 123;
197146
198147 // Schieberegister schreiben
199148 shiftOut595(b);
200149
201150 // Daten in Latch
202151 shiftPORT := shiftPORT and not (1 shl latchPin);
203152 shiftPORT := shiftPORT or (1 shl latchPin);
204153```
205154
206155#### Beispiel für kaskadierte 74HC595
207156
208157``` pascal
209158var
210159 b0, bn: Byte;
211160begin
212161 b0 := 123;
213162 //...
214163 bn := 789;
215164
216165 // Schieberegister schreiben
217166 shiftOut595(b0);
218167 // ...
219168 shiftOut595(bn);
220169
221170 // Daten in Latch
222171 shiftPORT := shiftPORT and not (1 shl latchPin);
223172 shiftPORT := shiftPORT or (1 shl latchPin);
224173```
225174
226175# Siehe auch
227176
228177- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorials]]
229178- [[AVR Embedded Tutorial - SPI Shiftregister/de|SPI Schieberegister]] - Schieberegister 74HC595 über SPI ansteuern (starke Beschleunigung).
230179
231180Autor: Mathias
232181
233182---
234183*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](/wiki-contact).*
235184Category: AVR/de
236185Category: Arduino/de
237186Category: Deutsch
238187Category: Embedded/de
239188Category: Tutorials/de

Back to history