20 | 05 | 2012
Lerneinheit 5: Spannungsmessung
Sonntag, den 14. März 2010 um 18:32 Uhr

1 Einleitung

Der PIC12F675 verfügt über einen 10-Bit-Analog-Digital-Wandler. Der Analog-Digitalwandler (Kurz: AD-Wandler) übersetzt eine Spannung in ein 10-Bit Digitalwort, das dann wiederum von dem Mikrocontroller mit Hilfe eines Programmes ausgewertet werden kann. Bei einer Betriebsspannung von 5V bedeutet dies, dass eine Spannung von 5 V mit binär 1111111111 (=1023 dezimal) und 0 V mit binär 0 dargestellt wird. Der Spannungsbereich wird in 1024 Teile linear unterteilt. 2,5 V würde also der Dezimalwert 511 zugeordnet bzw. der Binärwert 0111111111. Insgesamt gibt es vier Eingangskanäle (AN0-AN3) für den Wandler. Es können hier also nacheinander 4 verschiedenen Spannungen ausgewertet werden. Damit ist es bspw. möglich mit geeigneten Sensoren vier verschiedene Temperaturen zu messen und mit Hilfe eines Programmes auf bestimmte Temperaturkonstellationen in irgendeiner Form zu reagieren.

Simuliert werden kann dies auf dem PICkit1 mit einem Regelwiderstand(RP1 auf dem Entwicklungsboard), der eine Spannung unterteilt, die an PIN AN0 anliegt (s. Beschreibung des Mikrocontrollers).

In der Realität gibt es eine Reihe von Sensoren, die abhängig von äußeren Bedingungen ihren Widerstandswert verändern. Ein Beispiel hierfür ist der Temperatursensor KTY. Ändert sich die Temperatur, so ändert sich auch der Widerstandswert des KTY. Wird durch diesen Widerstand eine Spannung beeinflusst (durch einen Spannungsteiler) so können wir mit diesem Sensor Temperaturen messen.

Durch die folgenden Programme soll die Konfiguration des AD-Wandlers und die Auswertung von Spannungswerten verdeutlicht werden.

 2 Die betroffenen Register

Die AD-Wandlung wird durch 4 Register möglich.

  • Im TISIO-Register muss eingestellt werden, welche Pins reine Eingabepins sind.

  • Im ANSEL-Register wird eingestellt, welche der möglichen Eingangskanä­le für den AD-Wandler ge­öffnet werden sollen. Vor­eingestellt sind alle mögli­chen Kanäle (AN0-AN3) als analoge Eingänge. Außerdem wird hier die Um­wandlungsgeschwindigkeit bestimmt.

  • Das ADCON0-Register ist wichtig für den Wand­lungsvorgang.

  • Die Register ADRESL und ADRESH enthalten schließlich das Umwand­lungsergebnis als 10-Bit-Wort. Zwei Register sind notwendig, da ein Register nur 8-Bit umfasst.

2.1 Einstellung der Register

Register-Analog_Digital_WandlerMerke: Der 12F675 verfügt über nur einen Ausgabe, bzw. Eingabeport. Deshalb unter­scheiden sich die Registernamen z.T. etwas von den größeren PICs. Beispielsweise kennen wir bei dem 12F675 das TRISIO-Register, da grö­ßere PICs mehrer Ports haben können, gibt es für jeden Port solch ein Tristate-Register. Entspre­chend heißen diese TRISA, TRISB usw. Ken­nen wir beim 12F675 nur das ADCON0-Register, gibt es bei größeren Pics auch noch ein ADCON1-Register.

2.2 Konfigurationsbeispiel

  • Im ANSEL-Register muss ANS0 auf 1 gesetzt werden, damit PIN AN0 seine Aufgabe als analoger Eingang erfüllt. ADSC-Bits sind 0, d.h. höchste Umwandlungsgeschwindigkeit.

  • Im ADCON0-Register ist bit7 nicht gesetzt (0), also wird das Wandlungswort in Richtung von ADRESH verschoben. Das höchste Bit des Wortes ist Bit 7 von ADRESH. Mit CHS (00) wurde AN0 als einziger AD-Wandler-Kanal gewählt. ADON ist gesetzt, also ist der Wandler eingeschaltet.

  • Im TRISIO-Register muss Bit 0 gesetzt werden (1), damit das entsprechende Pin AN0 für den analogen Eingang aktiviert ist.

Register-Analog_Digital_Wandler2

3 Programm 05_00

Ist das hochwertige Bit (Bit 9) des AD-Wandler-Worte auf 1 gesetzt, dann soll D1 leuchten, ansonsten D0. Den AD-Wandler-Wert beeinflussen wir durch den Regelwiderstand RP1. Ist der Pfeil auf der Einstellscheibe ungefähr in der Mitte, so geht die LED D1 an ansonsten leuchtet D0.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
;**************************************************************************
;Autor buh 23.03.08
;Programm 05_00 Leds manipulieren mit analogem Eingang. Ist das höchste Bit gesetzt
; geht D1 an, ansonsten leuchtet D0.
;Entwicklungsboard Pickit1 (pic12f675)
;**************************************************************************
;
;Die AD-Eingangskanäle stimmen überein mit GP0-GP3.
;Es handelt sich 10-Bit-AD-Wandler. Das Ergebnis liegt in den Registern ADRESH und ADRESL (1Eh und 9Eh).
;Die Funktionalität des AD-Wandlers wird durch zwei Register bestimmt: 1. ADCONO und 2. ANSEL.
;
;ADCONO (Bank0)
;
;Bit 7 6 5 4 3 2 1 0
; ADFM VCFG x x CHS1 CHS0 GO/Done ADON
 
 
;ADON : 1 A/D-Converter ist bereit, ansonsten nicht
;GO : 1 Die Umwandlung wird gestartet. Ist der Wert 0, so ist die Umwandlung abgeschlossen.
;CHS1 CHS0 : Es wird der AD-WandlerKanal ausgesucht.
;VCFG : 0 Die Referenzspannung ist die Versorgungsspannung, bei 1 ist es der VREF-Pin.
;ADFM : 1 ADRESH und ADRESL . Das 10-Bit-Wort belegt 7Bit ADRESL und 2 Bit ADRESH ansonsten
umgekehrt.

 
; ANSEL (Bank 1)
;
;Bit 7 6 5 4 3 2 1 0
; x ADCS2 ADCS1 ADCS0 ANS3 ANS2 ANS1 ANS0
;
; ANS0 - ANS3 : 1 entspricht ANALOG-INPUT, 0 DIGITAL-INPUT

 
; Entsprechend muss der Inputmodus im TRISIO-Register gesetzt werden.
 
; ADCS0-ADCS2 : hiermit wird die Umwandlungsgeschwindigkeit bestimmt (s.S.40 Handbuch)
 
;
; Merke: Voreingestellt ist der pic12f675 mit 4 analogen Eingängen.
 
list p=12F675
#include <p12f675.inc> ; Dieses File wird eingebunden, es enthält
; Bezeichner für Statusregister u.ä.
; Bspw. sind TRISIO, ADCON0 u.ä. Register, deren Namen
; hier vorbelegt wurden. Siehe auch Inhalt von p12f675.inc.
 
; Hier folgen grundlegende Einstellung, bsp Watchdog aus u.ä.
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
 
;**************************************************************************
;Definitionen
;**************************************************************************
#define Bank0 0x00
#define Bank1 0x80
#define led_pins B'11001111' ; RA4 und RA5 sind als Ausgabe gesetzt, um die PINS zur Led_Ausgabe
; ansteuern zu können.
Alle anderen PINS auf Eingang. Abhängig vom
; Register ANSEL sind diese Eingänge AD_Eingänge

; (möglich für RA0 bis RA3) oder digitale Eingänge
; RA3 ist auf Eingabe gesetzt (Taster) und RA0 auf Eingabe (AD-Wandler).
 
#define ADCON0_Byte B'00000001' ; 10Bit-linksbündig,d.h. Referenz ist die Versorgungsspannung,
; Eingangskanal ist AD0, Startbit nicht gesetzt,
; AD-Wandler ist startbereit
; 0 ist die Zahl 0 am Ende von ADCON
 
#define ANSEL_Byte B'00000001' ; AD-Wandler arbeitet mit ca 400ns Geschwindigkeit bei einer Taktfrequenz
; von 4MHz,

; A0 ist der einzige analoge Eingang.
 
#define schalter GPIO,3
#define out_4 GPIO,4
#define out_5 GPIO,5
 
 
 
;**************************************************************************
;ab hier beginnt das Programm. 1. Eintrag in Speicherstelle 0000h
;**************************************************************************
; Initialisierung
;**************************************************************************
ORG 0x000
BANKSEL Bank1 ; Notwendig, damit die Pio richtig initialisert wird.
movlw ANSEL_Byte
movwf ANSEL
movlw led_pins ; TRISIO ist das Register mit dem Ein- bzw. Ausgabe-
movwf TRISIO ; richtung der Pins eingestellt wird.
 
BANKSEL Bank0 ; Notwendig, damit mit Register GPIO die Ausgabe
; verändert werden kann.
movlw ADCON0_Byte
movwf ADCON0
 
 
;***************************************************************************
;Hauptprogramm
;***************************************************************************
 
go call ad_wandle
call werte_aus
goto go
 
;***************************************************************************
;Unterprogramme
;***************************************************************************
 
d0_an
bcf out_5 ;setze in GPIO das Bit 5 auf 0
bsf out_4 ;setze in GPIO das Bit 4 auf 1
return
 
d1_an
bcf out_4 ; s.o. nur vertauscht
bsf out_5
return
 
 
 
ad_wandle
bsf ADCON0,1
 
ad_wandle_l BTFSC ADCON0,1
goto ad_wandle_l
return
 
werte_aus
btfss ADRESH,7 ;da linksbündig muss das MSB das Bit7 im ADRESH-Register sein.
;Hier wird also der Wertebereich geteilt.
goto d0_an;
goto d1_an ;werte_aus wird als Unterprogramm aufgerufen, die zugehörige Returnanweisung
;wird durch d0_an bzw. d1_an erreicht.
 
;return
 
 
end ;Hier ist das Assemblerfile zu ende.
 
 

4 Programm 05_01

Das folgende Programm stellt das Ergebnis einer fortlaufenden Überprüfung des AD-Wandler_Eingangs AN0 in einem 8-Bit -Wort dar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
;**************************************************************************
;Autor buh 08.01.06
;Programm 05_01 Jedes 8-Bit-Wort kann mit Hilfe der LEDs angezeigt
;werden. Der Inhalt der Speicherzelle 'ausgabe' bestimmt das Wort.
;Das UP 'led_ausgabe' gibt dann den Inhalt der Speicherzelle aus.
;Hier wird der AD-Wandler aufgerufen und die 8 höchstwertigen Bits werden angezeigt.
;Entwicklungsboard Pickit1
;**************************************************************************
 
 
;list p=12F675
 
; Dieses File wird eingebunden, es enthält
; Bezeichner für Statusregister u.ä.
; Bspw. ist TRISIO ein Register mit dem
; das Ein- oder Ausgabeverhalten der PIO
; definiert wird.
#include <p12f675.inc>
 
; Hier folgen grundlegende Einstellung, bsp Watchdog aus u.ä.
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
 
 
;**************************************************************************
;Definitionen
;**************************************************************************
#define Bank0 0x00
#define Bank1 0x80
 
#define p4 B'00010000' ; RA0 bis RA3 ist egal, da Eingänge. RA4 ist auf
; 1 gesetzt, also 5V und RA5 auf 0V also leuchtet D0,
; falls dieser Wert in GPIO eingetragen wird
 
#define p5 B'00100000' ; Jetzt leuchtet D1, falls dieses Wort in GPIO einge-
; getragen wird.
 
#define p1 B'00000010'
#define p2 B'00000100'
#define pcl B'00000000'
#define TRIS_d0_d1 B'11001111' ;Die Werte für das TRISIO-Register: TRISTATE-IN-OUT
#define TRIS_d2_d3 B'11101011'
#define TRIS_d4_d5 B'11011011'
#define TRIS_d6_d7 B'11111001'
#define TRIS_dx_dy_cl B'11001001'
#define ADCON0_Byte B'00000001' ; 10Bit-linksbündig,d.h. Referenz ist die Versorgungsspannung,
; Eingangskanal ist AD0, Startbit nicht gesetzt,
; AD-Wandler ist startbereit
; 0 ist die Zahl 0 am Ende von ADCON
 
#define ANSEL_Byte B'00000001' ; AD-Wandler arbeitet mit ca 400ns Geschwindigkeit bei einer Taktfrequenz
; von 4MHz,

; A0 ist der einzige analoge Eingang.
cblock 0x20 ; ab hier in den Datenspeicher
ausgabe
endc ; Hier ist der Definitionsblock zu Ende
 
;**************************************************************************
;ab hier beginnt das Programm. 1. Eintrag in Speicherstelle 0000h
;**************************************************************************
ORG 0x000
BANKSEL Bank1 ; Notwendig, damit die Pio richtig initialisert wird.
movlw TRIS_dx_dy_cl
movwf TRISIO ; TRISIO ist das Register mit dem Ein- bzw. Ausgabe-
; richtung der Pins eingestellt wird. Liegt in Bank1
; Speicheradresse: 85h
movlw ANSEL_Byte
movwf ANSEL
BANKSEL Bank0
movlw ADCON0_Byte
movwf ADCON0
 
 
 
;*****************************************************************************
;**************Hauptprogramm**************************************************
;*****************************************************************************
 
movlw B'11111111'
movwf ausgabe
go
call ad_wandle
movf ADRESH,0 ;Inhalt von ad-Wort (high) nach W
movwf ausgabe ;von W ins Ausgaberegister
call led_ausgabe ;Anzeige von Register 'ausgabe'
 
goto go
;*****************************************************************************
 
led_ausgabe
btfsc ausgabe,0
call d0
btfsc ausgabe,1
call d1
btfsc ausgabe,2
call d2
btfsc ausgabe,3
call d3
btfsc ausgabe,4
call d4
btfsc ausgabe,5
call d5
btfsc ausgabe,6
call d6
btfsc ausgabe,7
call d7
return
 
d0
call dx_cl
BANKSEL Bank1
movlw TRIS_d0_d1
movwf TRISIO
BANKSEL Bank0
movlw p4
movwf GPIO
 
return
 
d1
call dx_cl
BANKSEL Bank1
movlw TRIS_d0_d1
movwf TRISIO
BANKSEL Bank0
movlw p5
movwf GPIO
return
 
d2
call dx_cl
BANKSEL Bank1
movlw TRIS_d2_d3
movwf TRISIO
BANKSEL Bank0
movlw p4
movwf GPIO
return
 
d3
call dx_cl
BANKSEL Bank1
movlw TRIS_d2_d3
movwf TRISIO
BANKSEL Bank0
movlw p2
movwf GPIO
return
 
d4
call dx_cl
BANKSEL Bank1
movlw TRIS_d4_d5
movwf TRISIO
BANKSEL Bank0
movlw p5
movwf GPIO
return
 
d5
call dx_cl
BANKSEL Bank1
movlw TRIS_d4_d5
movwf TRISIO
BANKSEL Bank0
movlw p2
movwf GPIO
return
 
d6
call dx_cl
BANKSEL Bank1
movlw TRIS_d6_d7
movwf TRISIO
BANKSEL Bank0
movlw p2
movwf GPIO
return
 
d7
call dx_cl
BANKSEL Bank1
movlw TRIS_d6_d7
movwf TRISIO
BANKSEL Bank0
movlw p1
movwf GPIO
return
 
dx_cl
BANKSEL Bank0
movlw pcl
movwf GPIO
return
 
ad_wandle
bsf ADCON0,1
nop
BTFSC ADCON0,1
goto ad_wandle
 
return
 
end