Forum: Mikrocontroller und Digitale Elektronik PIC24F128GA006 ADC


von Margo M. (Firma: student) (yoma)


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?

von M. J. (manfred-64)


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

von Margo M. (Firma: student) (yoma)


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

von M. J. (manfred-64)


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

von Michael H. (morph1)


Lesenswert?

es gibt kein "do"

normal

while(y==1)
{
};

kann man kurz auch

while(y==1);

schreiben.

@op: welches Debug-Pin-Paar verwendest du? Es gibt ein Errata das viele 
PIC24 betrifft. Da funzt die Analoge Referenz nur wenn man PGC/PGD1 
nutzt.

von Margo M. (Firma: student) (yoma)


Lesenswert?

Hi
wie kann ich PGC/PGD1 in meinem code benutzen? Danke für den hinweis

mfg

von Michael H. (morph1)


Lesenswert?

Das sind die Programmierleitungen.

Jeder PIC24 hat davon 3 Paar, die eigentlich gleichwertig sein sollten. 
Dummerweise tritt eben besagter Fehler auf wenn der Hardwaredesigner das 
Paar 2 oder 3 verwendet.

von Margo M. (Firma: student) (yoma)


Lesenswert?

Hi Michael,
in meinem code werden diese Pins nicht verwendet und trotzdem 
funktioniert der Code nicht.
Wie am Anfang erklärt, wenn ich in debug mode einen haltepunkt am 
while-schleife ansetze, dann kriege ich richtige Werte. Können Sie mir 
in den Hinsicht weiterhelfen?
Danke im voraus
mfg

von M. J. (manfred-64)


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

von Margo M. (Firma: student) (yoma)


Lesenswert?

HI John,

ich bin neu in der PIC-programmierung. Wie könnte ich den PIC im 
Sleepmode schicken und per ADC-Int wecken?
Entschuldigen Sie die Rückfrage....
Danke für Ihre Meldung

mfg

von M. J. (manfred-64)


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 :)

von Margo M. (Firma: student) (yoma)


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

von M. J. (manfred-64)


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

von Klaus (Gast)


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

von PICfan (Gast)


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();

von Margo M. (Firma: student) (yoma)


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

von Margo M. (Firma: student) (yoma)


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

von Margo M. (Firma: student) (yoma)


Lesenswert?

Hi,
kann jemand mir, der sich mit den PIC24 Programmierung auskennt helfen?

von Erich (Gast)


Lesenswert?

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.

von Margo M. (Firma: student) (yoma)


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

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.