Hi, Ich benutze den PIC24F08KA102 und habe das Problem, dass der Komparator nicht geht. Der Plan war wenn ein Signal an C2INC anliegt das größer als CVREF ist, dann soll C2OUT high gehen, einen Interrupt auslösen und RA4 gleich high setzen. Wenn ich z.B. statt 0V, 1V an C2INC anlege passiert nichts. Das Programm sieht so aus #include <p24f08ka102.h> void __attribute__((interrupt, auto_psv)) _CompInterrupt(void) { _LATA4 = 1; //RA4 = high, when _CMIF = 0; } int main (void) { _TRISA4 = 0; _TRISB3 = 1; //C2INC = analog input CM2CON = 0xa0f1; CVRCON = 0x0080; //Vref is on - Vref = 1/4*Vdd=0,825V _CMIF = 0; _CMIE = 1; _LATA4 = 0; while (1) { } } Die Register CMxCON und CVRCON sind auf Seite 181 im Datenblatt zu finden. Nach der Befehlszeile CM2CON = 0xa0f1; wird das Registerbit C2EVT(CEVT) high gesetzt und es bleibt auch high. Dürfte aber erst high gehen wenn C2INC größer wird als CVref. Vielen Dank falls einer mal ne Erklärung dafür haben könnte. Gruß
Ich habe mal groß reingesehen... C2OUT wäre RA6. Mir kommt es vor, daß Du evtl. die Polarität vertauscht hast. Ich würde die Register erneut genau prüfen und das analoge Eingangssignal evtl. als analog-Port definieren (AD1PCFG) ? In der INT-Routine sollte CEVT gelöscht werden - siehe dort.
Hallo Bernd, vielen Dank für die Antwort. Ich habe die beiden Register CM2CON und CVRCON die für den 2. Komparator zuständig sind xmal kontrolliert und nichts gefunden. Also die Einstellung für CM2CON sind folgendermaßen aus: CM2CON = 0xa0f1; CON = 1 - Komparator ein COE = 0 - C2OUT wird nicht an C2OUT/RA6 Pin herausgeführt CPOL = 1 - invertierung des Ausgangs CLPWR = 0 - kein lowpower-mode CEVT = 0 - wird aber zu eins sobald EVPOL<1:0> ungleich eins ist COUT = x - wird zu eins wenn C2INC > Vref(0,825V) EVPOL<1:0> = 01 event sollte nur bei positiver Flanke von C2out high werden CREF = 1 - CVref(0,825V) an V+ Eingang des Komparators CCH<1:0> = 01 C2INC an V- Eingang des Komparators so sollte es richtig sein meiner Meinung nach. Meine Beobachtung ist sobald EVPOL<1:0> ungleich 0 gesetzt wird, wird CEVT = 1, dies führt sofort zu einem Interrupt, wenn CMIE=1 ist. Komisch ist, dass das CEVT Bit nicht Null wird im ISR. Also in dieser Reihenfolge: _CMIF = 0; _CMIE = 1; CM2CON = 0xa0f1; //---->hier springt es in die ISR CVRCON = 0x0080; //Vref is on - Vref = 1/4*Vdd=0,825V Beim CVRCON Register kann man eigentlich kaum was falsch machen. CVref wird enabled und CVref wird auf 0,825V gesetzt mit CVR3 bis CVR0 = 0. Ich weiß nicht genau was du meinst mit C2OUT Polarität, das muss ja nicht unbedingt herausgeführt werden an den Pin, sondern kann auch intern bleiben. Ebenfalls ist das Pin C2INC(RB3, AN5) auf analog gesetzt.
*CEVT = 0 - wird aber zu eins sobald EVPOL<1:0> ungleich eins ist kleiner Fehler sollte heißen wenn ungleich Null ist
Der Referenz-Spannungs-Modul braucht etwas Zeit zum Einschwingen, evtl. kommt es da schon zu den ersten INTs. Ich denke, CEVT muß in der Software gelöscht werden, um folgende INTs freizugeben.
Leider lässt sich CEVT nicht löschen, wenn ich z.B. irgendwo im Programm CM2CON = 0x80f1; wieder eingebe. Außerdem kommt es schon zum Interrupt bevor CVref enabled wird. Also folgendermaßen: _CMIF = 0; _CMIE = 1; CM2CON = 0xa0f1; //---->hier springt es in die ISR CEVT lässt sich nicht löschen (CM2CON = 0x80f1;) noch im ISR noch sonstwo im Programm springt zurück: CVRCON = 0x0080; //Vref is on - Vref = 1/4*Vdd=0,825V ein paar wartezyklen hier bringen leider auch nichts. Das Problem bleibt das CEVT bit das gleich 1 wird sobald EVPOL ungleich null gesetzt wird.
Auch folgende Befehlszeile CM2CONbits.CEVT = 0; hat nichts gebracht. Ich denke, dass das CEVT bit nicht überschreibbar ist und es nur ausgelesen werden kann, auch wenn im Datenblatt Read/Write steht.
das Problem hat sich doch noch gelöst, vielen Dank für den Hinweis CEVT zu löschen. Es gab da ein paar Probleme im Debugmodus. Das CEVT muss nochmal nachdem Vref gestartet wird gelöscht werden.
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.