Forum: Mikrocontroller und Digitale Elektronik ADC für PIC16F1823 funktioniert nicht


von Oliver K. (ollik)


Lesenswert?

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
}

von dsfhg (Gast)


Lesenswert?

>adc_result = temp || ADRESL;
Falsch. Logisches statt binärem Oder.

von Oliver K. (ollik)


Lesenswert?

Danke für die schnelle Rückmeldung!

Habe es ausgebessert, aber es gibt mir immer noch 0 zurück..

von Tom L. (xedux)


Lesenswert?

musst du nicht das DONE-bit abfragen anstatt des GO-bits?

von Oliver K. (ollik)


Lesenswert?

aja! mich hat es verwirrt da es kein ADCON0.GODONE bit gibt, sondern es 
heißt ADCON0.GO_NOT_DONE. jz habe ich immer nur GO geschrieben da es mir 
hier keinen Fehler gab.

Jz funktioniert er!! DANKE DANKE DANKE :-) ich war schon am verzweifeln

von Tom L. (xedux)


Lesenswert?

:) sehr gut!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.