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. Voreingestellt sind alle möglichen Kanäle (AN0-AN3) als analoge Eingänge. Außerdem wird hier die Umwandlungsgeschwindigkeit bestimmt.
-
Das ADCON0-Register ist wichtig für den Wandlungsvorgang.
-
Die Register ADRESL und ADRESH enthalten schließlich das Umwandlungsergebnis als 10-Bit-Wort. Zwei Register sind notwendig, da ein Register nur 8-Bit umfasst.
2.1 Einstellung der Register
Merke: Der 12F675 verfügt über nur einen Ausgabe, bzw. Eingabeport. Deshalb unterscheiden 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. Entsprechend heißen diese TRISA, TRISB usw. Kennen 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.

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
|
|