Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Shiftregister/de: what changed

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

Title: AVR Embedded Tutorial - Shiftregister/de

OldNewLine
1+# Schieberegister
2+
3+Der Beispielcode ist für ein ATtiny44.
4+
5+Schieberegister werden folgende verwendet:
6+
7+- Lesen: 74HC165
8+- Schreiben: 74HC595.
9+
10+> **Warning:** Die Leseroutine ist **nicht** kompatibel mit Arduino **shiftIn(...** ! Die Arduino Lesefunktion ist für andere Schieberegister. Der Clock muss anders angesteuert werden.
11+
12+Will man **MSB** und **LSB** vertauschen, dann muss man dementsprechend einfach **to** mit **downto** austauschen.
13+
14+## Portzugriffe
15+
16+Wie die Schieberegisterbefehle auf die Ports zugreifen, siehe hier: [[AVR Embedded Tutorial - Simple GPIO on and off output/de|GPIO-Ausgabe]].\
17+Nicht vergessen die Ausgänge auch als Ausgang einzustellen (DDRx).
18+
19+## Port-Konstanten
20+
21+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.
22+
23+<table>
24+<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>
31+</thead>
32+<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>
78+</tbody>
79+</table>
80+
81+Für den Port wird eine Variable deklariert, dies hat den Vorteil, das man nicht alle Ports in den Shiftregister-Funktionen ändern muss.
82+
83+``` pascal
84+var
85+ shiftPORT: byte absolute PORTA;
86+ shiftDDR: byte absolute DDRA;
87+ shiftPIN: byte absolute PINA;
88+const
89+ dataOutPin = 0;
90+ dataInPin = 1;
91+ latchPin = 2;
92+ clockPin = 3;
93+```
94+
95+## Schieberegister schreiben 74HC595
96+
97+``` pascal
98+procedure shiftOut595(val: Byte);
99+var
100+ i: Byte;
101+begin
102+ for i := 7 downto 0 do begin // MSBFIRST
103+ if (val and (1 shl i)) <> 0 then begin
104+ shiftPORT := shiftPORT or (1 shl dataOutPin);
105+ end else begin
106+ shiftPORT := shiftPORT and not (1 shl dataOutPin);
107+ end;
108+ shiftPORT := shiftPORT or (1 shl clockPin);
109+ shiftPORT := shiftPORT and not (1 shl clockPin);
110+ end;
111+end;
112+```
113+
114+## Schieberegister lesen 74HC165
115+
116+``` pascal
117+function ShiftIn165: Byte;
118+var
119+ i: Byte;
120+begin
121+ Result := 0;
122+ for i := 0 to 7 do begin // LSBFIRST
123+ Result := (Result shl 1) or ((shiftPIN and (1 shl dataInPin)) shr dataInPin);
124+ shiftPORT := shiftPORT or (1 shl clockPin);
125+ shiftPORT := shiftPORT and not (1 shl clockPin);
126+ end;
127+end;
128+```
129+
130+## Schieberegister Arduino
131+
132+Diese Version entspricht dem **shiftIn** von Arduino.
133+
134+``` pascal
135+function ShiftIn: Byte;
136+var
137+ i: Byte;
138+begin
139+ Result := 0;
140+ for i := 0 to 7 do begin // LSBFIRST
141+ shiftPORT := shiftPORT or (1 shl clockPin);
142+ Result := (Result shl 1) or ((shiftPIN and (1 shl dataInPin)) shr dataInPin);
143+ shiftPORT := shiftPORT and not (1 shl clockPin);
144+ end;
145+end;
146+```
147+
148+## Beispiel für die Verwendung der Schieberegister
149+
150+### Lesen von einem Schieberegister
151+
152+Bevor man das Schieberegister auslesen kann, muss der Portzustand in das Latchregister geschrieben werden, dies geschieht über den LatchPin.
153+
154+#### Beispiel für ein 74HC165
155+
156+``` pascal
157+var
158+ b: Byte;
159+begin
160+
161+ // Daten in Latch
162+ shiftPORT := shiftPORT and not (1 shl latchPin);
163+ shiftPORT := shiftPORT or (1 shl latchPin);
164+
165+ // Schieberegister auslesen
166+ b := ShiftIn74HC165;
167+```
168+
169+#### Beispiel für kaskadierte 74HC165
170+
171+``` pascal
172+var
173+ b0, bn: Byte;
174+begin
175+
176+ // Daten in Latch
177+ shiftPORT := shiftPORT and not (1 shl latchPin);
178+ shiftPORT := shiftPORT or (1 shl latchPin);
179+
180+ // Schieberegister auslesen
181+ b0 := ShiftIn74HC165;
182+ //...
183+ bn := ShiftIn74HC165;
184+```
185+
186+### Schreiben in ein Schieberegister
187+
188+Wen die Daten in das Schieberegister geschrieben sind, muss man noch den Latch Takten, das die aktuellen Ausgänge aktiv werden.
189+
190+#### Beispiel für ein 74HC595
191+
192+``` pascal
193+var
194+ b: Byte;
195+begin
196+ b := 123;
197+
198+ // Schieberegister schreiben
199+ shiftOut595(b);
200+
201+ // Daten in Latch
202+ shiftPORT := shiftPORT and not (1 shl latchPin);
203+ shiftPORT := shiftPORT or (1 shl latchPin);
204+```
205+
206+#### Beispiel für kaskadierte 74HC595
207+
208+``` pascal
209+var
210+ b0, bn: Byte;
211+begin
212+ b0 := 123;
213+ //...
214+ bn := 789;
215+
216+ // Schieberegister schreiben
217+ shiftOut595(b0);
218+ // ...
219+ shiftOut595(bn);
220+
221+ // Daten in Latch
222+ shiftPORT := shiftPORT and not (1 shl latchPin);
223+ shiftPORT := shiftPORT or (1 shl latchPin);
224+```
225+
226+# Siehe auch
227+
228+- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorials]]
229+- [[AVR Embedded Tutorial - SPI Shiftregister/de|SPI Schieberegister]] - Schieberegister 74HC595 über SPI ansteuern (starke Beschleunigung).
230+
231+Autor: Mathias
232+
233+---
234+*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).*
235+Category: AVR/de
236+Category: Arduino/de
237+Category: Deutsch
238+Category: Embedded/de
239+Category: Tutorials/de

Back to history