mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC24F08KA102 Komparator


Autor: Maxhax (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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ß

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxhax (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxhax (Gast)
Datum:

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

kleiner Fehler sollte heißen wenn ungleich Null ist

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxhax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxhax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maxhax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.