Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Analog Read/de: what changed

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

Title: AVR Embedded Tutorial - Analog Read/de

OldNewLine
1+# Analog Read
2+
3+## Vorwort
4+
5+Dieser Code ist für einen Atmega328/Arduino mit 16MHz.
6+
7+Wie man die UART ansteuert, steht hier:
8+
9+- [[AVR Embedded Tutorial - UART/de|UART]] *UARTInit* und *UARTSendString(...*
10+
11+Der ATmega328 kann mit 10Bit Genauigkeit messen, somit wird ein Wert zwischen 0..1023 ausgegeben.
12+
13+## Polling-verfahren
14+
15+### ADC Initialisieren
16+
17+Analoges Einlesen konfigurieren. Als Referenzspannung wird AVcc genommen, dies ist der einfachste Weg. Dies mus an **ADMUX** übergeben werden.
18+
19+Folgende Referenzspannungen kann man mit ADMUX konfigurieren:
20+
21+| Bit 7 | Bit 6 | Beschreibung |
22+|-------|-------|--------------|
23+| 0 | 0 | Pin AREF |
24+| 0 | 1 | von AVcc |
25+| 1 | 0 | \- |
26+| 1 | 1 | 2.56V |
27+
28+Mit **ADCSRA** wird der Wandler gestartet.
29+
30+``` pascal
31+ procedure ADC_Init;
32+ begin
33+ ADMUX := (1 shl REFS); // AVcc als Referenz.
34+ ADCSRA := (1 shl ADEN) or // Wandler einschalten.
35+ %111; // Teiler 128.
36+ end;
37+```
38+
39+### Auslesen
40+
41+Der Ablauf bei Messen ist folgendermassen.
42+
43+- Port angeben.
44+- Warten bis Messung ferig.
45+- Messwert auslesen.
46+
47+Bei **ADMUX** muss man die Referenzspannung nochmals angeben, weil es das Register mit Referenz teilt, man könnte auch eine or-Verknüpfung mit **ADMUX** machen.
48+
49+``` pascal
50+ function ADC_Read(Port: byte): integer;
51+ begin
52+ ADMUX := (1 shl REFS) or (Port and $0F); // Port angeben.
53+ ADCSRA := ADCSRA or (1 shl ADSC); // Messen einleiten.
54+ while (ADCSRA and (1 shl ADSC)) <> 0 do begin // Warten bis gemessen.
55+ end;
56+
57+ Result := ADC; // Messwert auslesen.
58+ end;
59+```
60+
61+Wen man immer vom gleiche Port einliest, muss man die **ADMUX**-Zeile nur einmal aufrufen. Auch kann man dann das Messen einleiten direkt nach der *'while*-Schleife machen. Die spart ein paar Takte.
62+
63+### Über UART ausgeben
64+
65+Variablen für Zwischenspeicher für die Messdaten.
66+
67+``` pascal
68+var
69+ Data: integer;
70+ s: string[10];
71+```
72+
73+In einer Endlosschelife werden dann die Messdaten ausgegeben.
74+
75+``` pascal
76+begin
77+
78+ // UART inizialisieren
79+ UARTInit;
80+
81+ // ADC inizialisieren
82+ ADC_Init;
83+
84+ // Interrupt erlauben
85+ asm Sei end;
86+
87+ // Messwerte ausgeben.
88+ repeat
89+ Data := ADC_Read(0);
90+ str(Data: 6, s);
91+ UARTSendString(s);
92+ until 1 = 2;
93+end.
94+```
95+
96+## Interrupt gesteuert
97+
98+Bei dem Interruptgesteuerten Verfahren, hat man den Vorteil, das man nicht warten muss, bis die Messung fertig ist, somit hat man Zeit für Anderes.
99+
100+### Inizialisieren
101+
102+Der Unterschied:
103+
104+- Bei **ADMUX** gibt man am Anfang schon den Eingangs-Port an.
105+- Bei **ADCSRA** muss man mit **ADSC** die erste Messung gestartet werde.
106+- Mit **ADIE** teilt man mit das die Wandlung Interrupt gesteuert ist.
107+
108+``` pascal
109+ procedure ADC_Init;
110+ const
111+ Port = 0;
112+ begin
113+ ADMUX := (1 shl REFS) or (Port and $0F);
114+ ADCSRA := %111 or (1 shl ADEN) or (1 shl ADSC) or (1 shl ADIE);
115+ end;
116+```
117+
118+### Messwert im Interrupt ausgeben
119+
120+``` pascal
121+ procedure ADC_Ready public Name 'ADC_ISR'; interrupt;
122+ var
123+ Data: integer;
124+ s: string[10];
125+ begin
126+ Data := ADC;
127+ ADCSRA := ADCSRA or (1 shl ADSC);
128+ str(Data: 6, s);
129+ UARTSendString(s);
130+ end;
131+```
132+
133+### Hauptprogramm
134+
135+Da das Messen Interruptgesteuert ist, bleibt die Hauptschleife leer. Wichtig, das man mit **sei** die Interrupts einschaltet.
136+
137+``` pascal
138+begin
139+
140+ // UART inizialisieren
141+ UARTInit;
142+
143+ // ADC
144+ ADC_Init;
145+
146+ // Interrupt erlauben
147+ asm Sei end;
148+
149+ // Hauptschleife
150+ repeat
151+ // Mache Irgendwas
152+ until 1 = 2;
153+end.
154+```
155+
156+## Siehe auch
157+
158+- Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
159+
160+Autor: Mathias
161+
162+---
163+*From the Free Pascal wiki, page "AVR Embedded Tutorial - Analog Read/de", as it stood on 2020-01-22 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).*
164+Category: AVR
165+Category: Arduino
166+Category: Deutsch
167+Category: Embedded

Back to history