Hallo,
ich will für den PIC16F1823 den ADC ausporgrammieren, doch er
funkioniert einfach nicht! :(
Versuche schon verzweifelt den Fehler zu finden, doch ich weis nicht was
ich falsch gemacht habe.
Die Read-Funktion gibt mir immer den Wert 0 zurück... egal was ich für
eine Spannung an dem AD-Pin anlege..
Bitte kann mir jemand helfen. Danke schon mal im Voraus.
Hier ist mein Quellcode:
1 |
|
2 | void init_ADC();
|
3 | unsigned int read_ADC(unsigned char channel);
|
4 |
|
5 |
|
6 | void init_ADC()
|
7 | {
|
8 | //Select ADC conversion clock, Frc (from a intern Oscillator) 1us - 6us
|
9 | ADCON1.ADCS0 = 1;
|
10 | ADCON1.ADCS1 = 1;
|
11 | ADCON1.ADCS2 = 1;
|
12 |
|
13 | //select interne Vref
|
14 | ADCON1.ADPREF0 = 1;
|
15 | ADCON1.ADPREF1 = 1;
|
16 |
|
17 | //select Vref = 2.048V
|
18 | FVRCON.ADFVR0 = 0;
|
19 | FVRCON.ADFVR1 = 1;
|
20 |
|
21 | //adc result format selection --> right justified
|
22 | ADCON1.ADFM = 1;
|
23 | }
|
24 |
|
25 | unsigned int read_ADC(unsigned char channel)
|
26 | {
|
27 | unsigned int adc_result; //variable for adc-result
|
28 | unsigned int temp;
|
29 |
|
30 | ADCON0=0x00;
|
31 |
|
32 | /*channel selection*/
|
33 | switch(channel)
|
34 | {
|
35 | case 0:
|
36 | ADCON0.CHS0 = 0;
|
37 | ADCON0.CHS1 = 0;
|
38 | ADCON0.CHS2 = 0;
|
39 | ADCON0.CHS3 = 0;
|
40 | break;
|
41 | case 1:
|
42 | ADCON0.CHS0 = 1;
|
43 | ADCON0.CHS1 = 0;
|
44 | ADCON0.CHS2 = 0;
|
45 | ADCON0.CHS3 = 0;
|
46 | break;
|
47 | }
|
48 |
|
49 | /*enable ADC-Module*/
|
50 | ADCON0.ADON = 1;
|
51 |
|
52 | /*start of ad-convertion*/
|
53 | ADCON0.GO = 1;
|
54 |
|
55 | /*wait until finish of ad-convertion*/
|
56 | while(ADCON0.GO);
|
57 |
|
58 | /*write adc restult in adc_result*/
|
59 | temp = ADRESH <<8;
|
60 | adc_result = temp || ADRESL;
|
61 |
|
62 | /*disable ADC-Module*/
|
63 | ADCON0.ADON = 0;
|
64 |
|
65 | return adc_result;
|
66 | }
|
67 |
|
68 | void main()
|
69 | {
|
70 | unsigned int voltage = 0;
|
71 |
|
72 | TRISC = 0x00;
|
73 | PORTC = 0b000000;
|
74 |
|
75 | TRISA = 0xFF;
|
76 | ANSELA = 0xFF;
|
77 |
|
78 | init_ADC();
|
79 |
|
80 | while(1){
|
81 | voltage = read_ADC(0);
|
82 |
|
83 | if(voltage == 0)
|
84 | PORTC = 0b000101;
|
85 | else if(voltage > 349 && voltage < 700)
|
86 | {
|
87 | PORTC = 0b000001;
|
88 | }
|
89 | else if(voltage > 699 && voltage < 1000)
|
90 | {
|
91 | PORTC = 0b000011;
|
92 | }
|
93 | else if(voltage > 999)
|
94 | {
|
95 | PORTC = 0b000111;
|
96 | }
|
97 | else{
|
98 | PORTC = 0b000000;
|
99 | }
|
100 | }
|
101 | }
|