PIC24F128GA006 ADC

OP (Firma: student) #2210193
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?
OP (Firma: student)
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
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
OP (Firma: student)
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
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
OP (Firma: student)
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
Gast
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
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();
OP (Firma: student)
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
OP (Firma: student)
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
Gast
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.
OP (Firma: student)
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.