PIC24F128GA006 ADC

(Firma: student) #2210193
Lesenswert?

Hi,
ich programmiere gerade den PIC24. Ich versuche seit Tagen den ADC 
converter zu programmieren ohne Erfolg. Hier ist mein code:
unsigned int ADCValue2;
TRISB=0x1000;      //AN12 configure as input
AD1PCFG=0xEFFF;            // all PORTB = Digital;

AD1CON1=0x00E0;      // SSRC<3:0> = 111 implies internal
                          // counter ends sampling and starts

AD1CHS=0x00C;       //  AN12 is the input
AD1CSSL = 0;

AD1CON3 = 0x1F61;               // sample time 31TAD, TAD= 46 Tcy
AD1CON2 = 0;
AD1CON1bits.ADON=1;     // turn ADC ON
AD1CON1bits.ASAM=1;   // start sampling then...
      // after 31Tad go to conversion

while(!IFS0bits.AD1IF); // conversion done?
   AD1CON1bits.ASAM=0; //
ADCValue2=ADC1BUF0;    // yes then get ADC value

Beim debugging, wenn ich  den haltepunkt über while-schleife halte dann 
kriege ich richtige Werte ansonsten liefert mir den Code nur falsche 
Werte.
Ich vermute, dass es ein Timing problem gibt, kann jemand mir hier 
helfen?
#2210298
Lesenswert?

Hi,

ich hab mal so gut wie keine Ahnung von Hochsprachen für µC's :)

Deshalb mal ne Frage:

marguerite Yonkou schrieb:
> while(!IFS0bits.AD1IF); // conversion done?
>    AD1CON1bits.ASAM=0; //
> ADCValue2=ADC1BUF0;    // yes then get ADC value

wo ist das Ende o. der Anfang der Schleife, ich seh nix wo ran ich das 
als "Leihe" erkennen könnte?



mfg
(Firma: student) #2210368
Lesenswert?

Hi,

ich hab mal so gut wie keine Ahnung von Hochsprachen für µC's :)

Deshalb mal ne Frage:

marguerite Yonkou schrieb:
> while(!IFS0bits.AD1IF); // conversion done?
>    AD1CON1bits.ASAM=0; //
> ADCValue2=ADC1BUF0;    // yes then get ADC value

wo ist das Ende o. der Anfang der Schleife, ich seh nix wo ran ich das
als "Leihe" erkennen könnte?


while(!IFS0bits.AD1IF); // conversion done?
Hier wird darauf gewartet, dass das flag AD1IF gesetzt wird. Es passiert 
wenn
die Konvertierung fertig ist. wenn der Flag nicht gesetzt ist, ist der 
Flag auf 0, d.h. wir haetten dann (while(!0);) was eigentlich 
(while(1);) entspricht, eine Endloseschleife. und wenn der flag auf eins 
gesetzt wird haben wir (while(!1);) was eigentlich (while(0);) ist. in 
dem fall ist die bedingung nicht erfüllt dann läuft das programm weiter 
oder springt das Programm auf die naechste Zeile d.h AD1CON1bits.ASAM=0; 
wird ausgeführt.

Danke für die Meldung
mfg
#2210461
Lesenswert?

Danke für die vielen Worte :)
Leider beantwortet mir keines meine Frage :(

Was eine Do-While/While-Do Schleife ist weiß ich!

Das das in der klammer hinter While die Abbruch Bedingung ist, geh ich 
mal  von aus.

Nun hier noch mal's meine Frage:
Was begrenzt die Schleife oder wo ist das "Do" oder klammern etc.
was den Code Innerhalb der Schleife einschließt?

Sorry das ich nerve aber das lässt mir keine Ruhe, das ich das nicht 
erkennen kann.


mfg
#2213874
Lesenswert?

Moin,

Der Wendelvorgang wird eventuell durch den Prozessortakt gestört, die 
durch den Haltepunkt weitgehend ausgeschaltet werden.
Wie wäre es  statt der Schleife den µC während der Wandlung in den 
Sleepmode zu schicken und per ADC-Int zu wecken.
Sind die Werte dann auch OK, sollten es wirklich die elektrischen 
Störungen gewesen sein.


mfg
#2214036
Lesenswert?

Hi,

einfach mit dem Befehl Sleep.
Wie genau man den Interrupt bei Deinem Pic Konfigurieren musst weiß ich 
nicht. Hab nur Erfahrung mit 16Fxxx Pic's. Ist aber sicher im Datasheet 
gut beschrieben.

Eine kurte Einführung in das Thema Interrupt kannst Du bei Sprut's Seite 
finden.
http://www.sprut.de/electronic/pic/index.htm


mfg
Manfred

PS: im allgemeinen Duzen wir uns hier alle :)
(Firma: student) #2215298
Lesenswert?

Hi,
PWRSAV #SLEEP_MODE ; Put the device into SLEEP mode

ich habe diese Anweisung in dem Datenblatt gelesen. Dies sollte den 
Gerät in Schlaf setzen. Ich habe einen Problem dabei, und zwar beim 
compilieren kriege ich einen Fehler. Diese Anweisung ist im Assembler 
geschrieben, can das sein dass die Ursache für den Fehler ist? Wenn ja 
wie kann ich das unter C schreiben. Bis jetzt habe nichts hilfreiches im 
Datenblatt gelesen.

mfg
#2215321
Lesenswert?

Moin,

tut mir Leid ab hier kann ich Dir nicht mehr weiter helfen.
Die Pic 24er Typen unterscheiden sich doch erheblich von den 16er und 
von Hochsprachen für µC's hab ich (momentan) noch weniger Ahnung :/

Hast Du schon mal in folgendes Forum geguckt:

http://www.fernando-heitor.de/

Das is auf Pic's spezialisiert, musst eventuell aber a bisserl warten 
bis Antwort kommt!


mfg
Gast #2215360
Lesenswert?

marguerite Yonkou schrieb:
> ich habe diese Anweisung in dem Datenblatt gelesen. Dies sollte den
> Gerät in Schlaf setzen. Ich habe einen Problem dabei, und zwar beim
> compilieren kriege ich einen Fehler. Diese Anweisung ist im Assembler
> geschrieben, can das sein dass die Ursache für den Fehler ist? Wenn ja
> wie kann ich das unter C schreiben. Bis jetzt habe nichts hilfreiches im
> Datenblatt gelesen.

Im Datenblatt steht wenig über C. Es gibt aber eine Menge Library 
Funktionen und Macros. Die findest du in den Direktories unter MPLAB. 
Irgendwo gibts da auch die Quellen dazu. IMHO finden sich da auch 
Funktionen für den ADC. Ich bin aber gerade am falschen Ort und kann 
nicht nachsehen.

MfG Klaus
Gast #2215372
Lesenswert?

zu finden in jeder header file zum controller:

/* ---------------------------------------------------------- */
/* Some useful macros for inline assembler instructions       */
/* ---------------------------------------------------------- */

#define Nop()    __builtin_nop()
#define ClrWdt() {__asm__ volatile ("clrwdt");}
#define Sleep()  {__asm__ volatile ("pwrsav #0");}
#define Idle()   {__asm__ volatile ("pwrsav #1");}


also, da stehts:

Sleep();
(Firma: student) #2215374
Lesenswert?

Klaus schrieb:
> marguerite Yonkou schrieb:
>> ich habe diese Anweisung in dem Datenblatt gelesen. Dies sollte den
>> Gerät in Schlaf setzen. Ich habe einen Problem dabei, und zwar beim
>> compilieren kriege ich einen Fehler. Diese Anweisung ist im Assembler
>> geschrieben, can das sein dass die Ursache für den Fehler ist? Wenn ja
>> wie kann ich das unter C schreiben. Bis jetzt habe nichts hilfreiches im
>> Datenblatt gelesen.
>
> Im Datenblatt steht wenig über C. Es gibt aber eine Menge Library
> Funktionen und Macros. Die findest du in den Direktories unter MPLAB.
> Irgendwo gibts da auch die Quellen dazu. IMHO finden sich da auch
> Funktionen für den ADC. Ich bin aber gerade am falschen Ort und kann
> nicht nachsehen.
>
> MfG Klaus

Hi Klaus,
Vielen Dank für den Hinweis. Ist sehr hilfreich...

MFG
(Firma: student) #2215564
Lesenswert?

Manfred John schrieb:
> Moin,
>
> Der Wendelvorgang wird eventuell durch den Prozessortakt gestört, die
> durch den Haltepunkt weitgehend ausgeschaltet werden.
> Wie wäre es  statt der Schleife den µC während der Wandlung in den
> Sleepmode zu schicken und per ADC-Int zu wecken.
> Sind die Werte dann auch OK, sollten es wirklich die elektrischen
> Störungen gewesen sein.
>
>
> mfg

Hi Manfred die Werte sind immer noch nicht ok.Aber was ich gemacht habe, 
ist die Versorgungsspannung Vdd  mit der ADC zu lesen und digital zu 
wandeln. Hier läuft alles wunderbar.Ich kriege richtige Werte raus. Can 
das sein, dass die Werte auch nich so richtig bei Ausgänge des 
Beschleunigungssensors weil die Schwanken?(ich will eigentlich die die 
Ausgangswerte eines Beschleunigungssensors lesen und digital wandelt). 
Könntest du mir da immer noch helfen?
danke dir im voraus
mfg
(Firma: student) #2218263
Lesenswert?

Erich schrieb:
> Vielleicht solltest du mal ein Oscilloscope an dein Signal (am A/D
> Eingang) anstöpseln.
>
> Und bitte antworte jetzt nicht es wäre keines greifbar.
> Denn dann kannste die Aufgabenstellung wohl knicken.


Hi Erich,
danke für den Typ.Das Problem lag an den Beschleunigungssensor. Der war 
die ganze Zeit nicht an.

viele Grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren