Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Multiplex/de: what changed

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

Title: AVR Embedded Tutorial - Multiplex/de

OldNewLine
1+# Multiplex
2+
3+## Portzugriffe
4+
5+Wie die Schieberegisterbefehle auf die Ports zugreifen, siehe hier:
6+
7+- [[AVR Embedded Tutorial - Simple GPIO on and off output/de|GPIO]]
8+- [[AVR Embedded Tutorial - Shiftregister/de|Schieberegister]]
9+
10+## Beispiel
11+
12+Bei jedem Timerdurchlauf, wird ein anderes Segment angesteuert. Somit muss der Timer 4 mal durchlaufen, bis ein Frame aktualisiert ist. Für eine konstante Wiederholfrequenz, ist der Timer am besten geeignet, da er regelmässig aufgerufen wird. Man könnte ein Multiplex auch in der Hauptloop machen, aber wen dort eine kleine Pause vorkommt, dann fängt die Anzeige an zu flackern.
13+
14+Die Ausgabe erfolgt über zwei Schieberegister (74HC595). Wen der AVR genügend GPIO hat, kann man dies auch über diese machen.
15+
16+#### Digits Konstante für 7-Segmentanzeige
17+
18+In dieser Konstante sind die LED-Kombinationen der Ziffern gespeichert. Zusätzlich sind noch HEX-Zeichen gespeichert.
19+
20+``` pascal
21+const
22+ digits: packed array[0..15] of byte = (
23+ %00111111, // = 0
24+ %00000110, // = 1
25+ %01011011, // = 2
26+ %01001111, // = 3
27+ %01100110, // = 4
28+ %01101101, // = 5
29+ %01111101, // = 6
30+ %00000111, // = 7
31+ %01111111, // = 8
32+ %01100111, // = 9
33+ %01110111, // = a Für Hex-Ausgabe
34+ %01111100, // = b
35+ %00111001, // = c
36+ %01011110, // = d
37+ %01111001, // = e
38+ %01110001); // = f
39+```
40+
41+#### Werte der einzelnen Segmente
42+
43+Als Beispiel wird eine 4-stellige 7-Segmentanzeige angesteuert. Wen man einen grösseren Multiplex will, muss man dies Zahl erhöhen.
44+
45+``` pascal
46+const
47+ DigitCount = 4;
48+var
49+ Number: array[0..DigitCount - 1] of byte;
50+```
51+
52+#### Multiplex
53+
54+Das ist das Herz des Multiplexes. Bei jedem Durchlauf des Timers, wird das Segment gewechselt. Wen man dies sehen will, muss man die Timerfrequenz reduzieren, das man dies von Auge sieht. Für dieses Beispiel wird der **Timer0** verwendet.
55+
56+``` pascal
57+ procedure Timer0_Interrupt; public Name 'TIM0_COMPA_ISR'; interrupt;
58+ const
59+ segPos: byte = 0;
60+ begin
61+ segPos := segPos + 1;
62+ if (segPos > DigitCount - 1) then begin
63+ segPos := 0;
64+ end;
65+
66+ WritePortA(latchPin, False);
67+ WritePortA(latchPin, True);
68+
69+ shiftOut595(digits[Number[segPos]]); // Aktuelle Ziffer im Segment ansteuern.
70+ shiftOut595(1 shl segPos); // Aktuelles Segment aktivieren.
71+ end;
72+```
73+
74+#### Delay
75+
76+Ein einfaches Delay. dies wird beim Zifferwechsel in der Hauptschleife benötigt.
77+
78+``` pascal
79+procedure delay;
80+var
81+ i: integer;
82+begin
83+ for i := 0 to 200 do asm Nop end;
84+end;
85+```
86+
87+#### Initialisierung und Hauptschleife
88+
89+Hier der Timer0 für den Mutiplex initialisiert, auch werden die benötigten Port auf Ausgabe geschalten.
90+
91+Genaueres über Timer hier:
92+
93+- [[AVR Embedded Tutorial - Timer, Counter/de|Timer]]
94+
95+Dieses Beispiel gibt Abwechselnd 1234 und 5678 aus.
96+
97+``` pascal
98+begin
99+ // Interrupt sperren.
100+ asm cli end;
101+
102+ // Ports auf Ausgabe schalten.
103+ DDRA := (1 shl dataOutPin) or (1 shl latchPin) or (1 shl clockPin);
104+
105+ // -- Timer initialisieren
106+ TCCR0A := (1 shl 1);
107+ TCCR0B := TCCR0B or %101;
108+ TIMSK0 := TIMSK0 or (1 shl OCIE0A);
109+
110+ // Interrupt frei geben.
111+ asm sei end;
112+
113+ // Hauptschleife
114+ repeat
115+ Number[0] := 1;
116+ Number[1] := 2;
117+ Number[2] := 3;
118+ Number[3] := 4;
119+ delay;
120+
121+ Number[0] := 5;
122+ Number[1] := 6;
123+ Number[2] := 7;
124+ Number[3] := 8;
125+ delay;
126+ until 1 = 2;
127+end;
128+```
129+
130+# Siehe auch
131+
132+- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
133+
134+Autor: Mathias
135+
136+---
137+*From the Free Pascal wiki, page "AVR Embedded Tutorial - Multiplex/de", as it stood on 2020-02-02 after a change by Trev, 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).*
138+Category: AVR/de
139+Category: Arduino/de
140+Category: Deutsch
141+Category: Embedded/de
142+Category: Tutorials/de

Back to history