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?
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
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
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.
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.
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
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
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 :)
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
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
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
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();
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.