Forum: Mikrocontroller und Digitale Elektronik PIC24F08KA102 Komparator


von Maxhax (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

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.

von Maxhax (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Maxhax (Gast)


Lesenswert?

*CEVT = 0 - wird aber zu eins sobald EVPOL<1:0> ungleich eins ist

kleiner Fehler sollte heißen wenn ungleich Null ist

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

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.

von Maxhax (Gast)


Lesenswert?

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.

von Maxhax (Gast)


Lesenswert?

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.

von Maxhax (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.