PIC 16F886 ADC Problem

OP #2281143
Hallo miteinander

Ich habe eine kleines Problem mit der Wandlung von ADC-Werten. Dabei 
verwende ich diese Funktion (mit HI-Tech PICC Compiler):
1
// ADC setup
2
VCFG = 0;                                              // Use Vdd as Ref  
3
ADFM = 1;                                              // Right justified A/D result
4
ADCS0 = 1;                                             // 16 TOSC prescale
5
ADCS1 = 0;
6
ADCS2 = 1;
7
CHS0 = 0;                                              // Channel select AN0
8
CHS1 = 0;
9
CHS2 = 0;
10
ADON = 1;                                              //Turn A/D on
11

12
unsigned int read_a2d(unsigned char channel){          // ADC channel
13
  channel &= 0x0F;                                     // Truncate channel to 4 bits
14
  ADCON0 &= 0b11000001;                                // Terminate and clear current channel select
15
  ADCON0 |= (channel << 2);                            // Apply the new channel select
16
  GO = 1;                                              // Initiate conversion on the selected channel
17
  while(GO) continue;                                  // Wait for ADC conversion to complete
18
  return((ADRESH << 8) + ADRESL);                      // Return result
19
}
20

21
void get_error(int desired){
22
  int adc = read_a2d(0)
23
  int error = desired - adc;
24

25
  if(error > 0){
26
    RC0 = 1;
27
    RC1 = 0;
28
  }
29
  else{
30
    RC0 = 0;
31
    RC1 = 1;
32
  }
33
  if(adc == 0)  RC2 = 1;
34
  else          RC2 = 0;
35
}

Dabei habe ich bemerkt, dass das Resultat nicht immer gleich ist. Laut 
Datenblatt sollte +- 1LSB sein, aber zum Teil wird der Wert '0' 
ausgegeben. Und dies umso häuffiger je extremer der AD Wert vom von 0 
Abweicht.
Soll heissen, wenn 'desired' grösser ist als der momentane Wert, 
leuchtet die Led an RC0. Ist der Wunschwert kleiner als der momentane 
Wert, so flackern alle LEDs, wobei die LEDs an RC1 und RC2 genau gleich 
gepulst werden. Die Frequenz von RC1 und RC2 wird mit zunehmendem 
Unterschied immer grösser.

Habt ihr eine Idee, woran dies liegen könnte, da das Phänomen nur in 
eine Richtung existiert?

Besten Dank für die Unterstützung,
MFG
Patrick
OP #2281428
Neue Erkenntnis:
Sobald ich den Kanal fix bestimme und immer nur diesen abfrage, läuft es 
perfekt. Wechsle ich aber die Kanäle (z.B. 0-2) und wandle diese 
nacheinander, so bekomme ich bei jeder ~10-14 Wandlung ein Fehler, wobei 
das Resultat 0 ist, egal welche Spannung angelegt ist.

Ist der PIC nicht für das Abfragen mehrerer Kanäle ausgelegt?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.