Forum: Mikrocontroller und Digitale Elektronik ADC Problem mit dsPIC30F40


von Stefan (Gast)


Lesenswert?

N' Abend,

ich bekomme den ADC meines dsPIC30F4011 einfach nicht zum laufen. Habe 
bereits zweimal das gesamte Datenblatt des ADCs gelesen und hab langsam 
das Gefühl, dass ich ein Brett vor dem Kopf habe.

Mein Ziel ist folgendes:

- 1 Kanal ADC Wandlung
- ADC Eingang: AN8(PB8)
- Manuelles Starten des Samplevorgangs
- Automatisches Beenden des Samplevorgangs und Starten der AD Wandlung
- Tad von Tcy abgeleitet(Tad=Tcy*32)
- Interrupt nach 16 Sample/Wandlungs Sequenzen

Ich nutze den CCS Compiler.


Meine Vermutung ist, dass irgendwas in der Konfiguration schief läuft, 
sprich falsch ist. Aber ich habe es mitlerweile fünf mal überprüft und 
finde den Fehler einfach nicht. Es löst nichtmal der Interrupt aus und 
wenn ich das ganze ohne Interrupt versuche spuckt der ADC ununterbrochen 
den Wert 0 aus. Es liegt aber eine Spannung von ca. 2,5V an.

Hier mal die entscheidenen Ausschnitte aus dem Quellcode
1
//...
2
3
//==================================================================
4
// ISR ADC
5
6
#INT_ADC1 LEVEL=1
7
void isr_adc(void)
8
{  
9
  new_data_available = TRUE;
10
  ADIF=0;  // clear interrupt flag
11
}
12
13
//...
14
15
//==================================================================
16
// ADC configuration (Teil der init() )
17
  
18
  ADCON1 = 0x00E0;  // auto sample
19
  ADCON2 = 0x003C;  // 16 samp./conv. sequences per interrupt
20
  ADCON3 = 0x023F;  // AD conv. clk = 32*Tcy
21
            // AD conv. clk source is derivated from system clk, auto sample time = 2 TAD, 
22
23
  ADCHS = 0x0008;    // AN8 = channel 0 pos. input,  channel 0 neg. input = Vref-
24
  ADPCFG = 0xFEFF;  // configure analog input pin as analog input
25
26
  ADIF =0;  // clear ADC interrupt flag
27
  ADIE =1;  // enable ADC iterrupts
28
  ADON =1;  // enable ADC unit
29
30
//...
31
32
//==================================================================
33
// Wert auslesen (Teil der main() )
34
35
//...
36
37
SAMP =1; // start samp./conv. sequence
38
39
//...
40
41
42
  if(new_data_available)  
43
      {
44
        ADCBUF_ptr =&ADCBUF0; // initiate pointer
45
        ADC_res =0;    
46
        for(i=0; i<16;i++) ADC_res += *ADCBUF_ptr++;  // read conv. result from ADC Buffers  
47
        ADC_res =ADC_res >> 4 ;  // mean
48
        ADC_conversion_done =FALSE;  // clear flag
49
        SAMP = 1;    // start new samp./conv. sequence
50
      }

Vielleicht hat einer von Euch die Muße mal darüber zu schauen oder 
Erfahrung mit der Programmierung des ADCs vom dsPIC30.

Über Anregungen und Hifestellungen würde ich mich sehr freuen!

Viele Grüße und einen schönen Abend noch

Stefan

von Stefan (Gast)


Lesenswert?

In der unteren if Struktur muss es heißen:

Stefan schrieb:
> if(new_data_available)
>       {
>         ADCBUF_ptr =&ADCBUF0; // initiate pointer
>         ADC_res =0;
>         for(i=0; i<16;i++) ADC_res += *ADCBUF_ptr++;  // read conv. result from 
ADC Buffers
>         ADC_res =ADC_res >> 4 ;  // mean

>         new_data_available =FALSE;  // <== nicht "ADC_conversion_done"

>         SAMP = 1;    // start new samp./conv. sequence
>       }

War aber nicht der Fehler.

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.