Forum: Mikrocontroller und Digitale Elektronik dsPIC / ADC Wandlung


von schnudl (Gast)


Lesenswert?

Ich weiss nicht, in welches Forum dies reingehört, im Elektronikforum 
sind mehr Leute als im DS Forum, und es hat ja auch nix mit DS zu tun:

Ich möchte eine Serie aufeinanderfolgender manueller Conversions 
durchführen, und nach jeder Conversion zwischen MUXA und MUXB wechseln.

Init Code ist wie folgt:

1
 void ADC_Init(void)
2
 {
3
     ADCON1bits.ADON = 0;         // Turn ADC OFF
4
     
5
     ADPCFG = 0b1111111111110000; // AN0-AN3 configured as analog input
6
     
7
     ADCON1bits.FORM = 0b00;      // integer form
8
     ADCON1bits.SAMP = 0;         // Set sampling off at begin
9
     ADCON1bits.SSRC = 0b111;     // clock based convert
10
     ADCON1bits.ASAM = 0;         // no auto sampling
11
     
12
     ADCON2bits.VCFG = 0b111;     // Reference AVdd, AVss
13
     ADCON2bits.CSCNA = 0;        // No input scan
14
     ADCON2bits.SMPI = 0;         // Interrupt every conversion
15
     ADCON2bits.BUFM = 0;         // one 16 bit buffer
16
     ADCON2bits.ALTS = 1;         // alternate MUXA/B sampling
17
     
18
     ADCHSbits.CH0NA = 0;         // Vref- as negative reference
19
     ADCHSbits.CH0SA = 2;         // MUXA = AN2
20
     ADCHSbits.CH0NB = 0;         // Vref- as negative reference
21
     ADCHSbits.CH0SB = 0;         // MUXB = AN0
22
     
23
                                  // TCY = 10MHZ * 4  / 4 = 10MHZ
24
     ADCON3bits.ADCS = 9;         // Tad = (ADCS+1) * TCY/2
25
     ADCON3bits.SAMC = 2;         // 2 Tad autosample time
26
                                  // 16 Tad cycles per channel = 8µs
27
                                  
28
     ADCON1bits.ADON = 1;         // Turn ADC ON
29
     
30
     
31
     
32
     
33
     ADCInterrupt_Init();
34
     
35
     
36
 }
37
 
38
 
39
 
40
 void ADCInterrupt_Init(void)
41
 {  
42
     IFS0bits.ADIF = 0;      // clear the U2RXIF interrupt flag
43
     IPC2bits.ADIP = 6;      // set ADC priority to 6
44
     IEC0bits.ADIE = 1;      // enable ADC Interrupt Service Routine
45
 }


Leider sieht es so aus, als ob nur MUXA verwendet würde, jedenfalls 
bekomme ich nur Messwerte von AN2, und keine von AN0. Beschaltung ist 
richtig.



Konversionen starte ich mit ADCON1bits.SAMP = 1;

Wieso geht das nicht ???

Wieso geht ausserdem

ADCON2bits.SMPI = 1;

nicht? Hier sollte doch, wie beim Wert SMPI=0 jede Konversion zu einem 
IR führen, oder? Leider passiert dies aber nur einmal (beim ersten mal), 
dann nie mehr!

**** dsPIC-BUG ???

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Hallo Glaskugel,

kannst Du mir bitte sagen, welchen dsPIC der  schnudl verwendet ?

Danke,
bis zum nächsten Mal,
lauf aber nicht so weit weg, ich glaube es werden höchstens 2-3 Posts 
bis ich Dich wieder brauche !!

von schnudl (Gast)


Lesenswert?

Sorry: es ist ein dsPIC30F4013

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Aus meiner kurzen Erfahrung mit dem dsPIC33F sage ich mal, daß es 
mindestens 2 Methoden gibt, den ADC zu betreiben:

   - Single-Conversion, da steht 1 Ergebnis im Buffer
   - Mehrfach-Conversion, da wird dann gleich ein Array gefüllt.
   und diese Conversion kann man noch mittels SCAN oder anders 
bewerkstelligen. Scan sieht einfacher aus...
Es gibt dsPICs, die können Mehrfach-Ergebnisse nur über DMA ausliefern.

Mein brandheißer Tip: Datenblatt lesen, Wort-für-Wort !

von Benedikt K. (benedikt)


Lesenswert?

Und nicht nur das was da steht, sondern auch das was nicht da steht.
Ich habe mich über die dsPICs auch schon oft aufgeregt. Meist gibt es 
irgendwo einen versteckten Hinweis irgendwo anderst bei einer anderen 
Peripherie. Ich bleib daher bei den AVRs, die laufen wenigstens und 
kosten weniger Nerven.

von schnudl (Gast)


Lesenswert?

Das mit dem Wort für Wort lesen hab ich schon hinter mir...

Und alles was jetzt kommt ist möglicherweise schon Betriebsblindheit.

Vielleicht lese ich nochmal genau, aber das Problem ist, dass sich in 
diesen Datenblättern des dsPICs vieles unnötig über dutzende Seiten 
hinweg wiederholt, oft nur mit anderen Worten, aber grundlegende Dinge 
offen bleiben.

Scan-mode kann ich nicht verwenden, da ich dazu zwei Konversionen 
hintereinander anstossen müsste, aber ohne Interrupt nicht weiss, wann 
die erste fertig ist (pollen will ich nicht, da ich andere Dinge auch 
erledigen muss). Bei einem Scan über 2 Kanäle muss nämlich eingestellt 
sein, dass nur alle zwei Konversionen ein Interrupt generiert wird.

Daher die Idee, das wie beschrieben zzu machen. Sollte gehen, ... aber 
leider nicht bei mir :-)

von C. H. (_ch_)


Lesenswert?

Das "Programmers Reference Manual" für die dsPIC-Serie ist nach meinen 
Erfahrungen vieel aussagekräftiger als das Datenblatt. Von dem her ist 
man von Atmel schon verwöhnt...

Gruß
Christian

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.