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