Forum: Mikrocontroller und Digitale Elektronik Frage bezüglich Comparator beim PIC12F1572


von Compare17 (Gast)


Angehängte Dateien:

Lesenswert?

Hey Leute,

Kurz mein Aufgabenziel:
Ich möchte den PIC12F1572 aber möglichst stromsparend nutzen.
Der PIC12F1572 befindet sich also im SleepMode.
An einem PIN des PIC12F1572 hängt ein analogen Signal. (0-1V)
Diese soll mittels Comparator mit einem EINSTELLBAREN Wert verglichen 
werden.
Ist das angelegt analoge Signal grösser als der eingestellte Wert, 
schaltet der Comparator durch.
Der Comparator wiederum löst einen Interrupt aus.
Danach werden so schnell wie möglich die Werte des Angelegten Signals 
per ADC eingelesen (selber Pin wie Comparatoreingang) und per Uart 
ausgegeben.
Erfolgt ein Break, legt sich der PIC wieder schlafen.


Daher dachte ich, ich stelle einen Wert X am negativen Eingang C1IN- des 
Comparators
über den integrierten DAC ein.
Am Positiven Eingang des Comparators kommt danach der zu überwachende 
Analogeingang C1IN+.
Wird der Analogeingang RA0 grösser als der eingestellte negative 
Comparatoreingang (kommt von DAC),
so schaltet der Comparator durch und löst einen Interrupt aus.
Dieser wiederum weckt meinen kleinen PI aus der Nachruhe.

ABER:
Ich kann den Negativen Eingang C1IN- nicht mit dem DAC verbinden.

Muss ich nun den zu überwachenden Analogwert auf RA1 (C1IN+) führen?
Dann könnte ich den DAC an C1IN- anknüpfen.
Muss ich danach das Bit CxOUT auf Inverted(1) setzen, damit meine 
schaltung wieder
genauso funktioniert, wie es mal angedacht war?
Oder muss ich das CxPOL Bit auch invertieren 1 setzen) ?

von ATiny13 (Gast)


Lesenswert?

Nimm einen ATtiny13.
Nicht dem Microchip Müll.

von Volker S. (vloki)


Lesenswert?

Compare17 schrieb:
> Muss ich nun den zu überwachenden Analogwert auf RA1 (C1IN+) führen?
> Dann könnte ich den DAC an C1IN- anknüpfen.
> Muss ich danach das Bit CxOUT auf Inverted(1) setzen, damit meine
> schaltung wieder
> genauso funktioniert, wie es mal angedacht war?
> Oder muss ich das CxPOL Bit auch invertieren 1 setzen) ?

Wenn du den CxOUT nicht verwendest, sollte CxPOL eigentlich egal sein, 
weil du dir ja noch aussuchen kannst, ob der Interrupt bei einer 
negativen oder eine positiven auslösen soll. (wenn ich das Diagramm 
richtig verstehe)

von Compare17 (Gast)


Lesenswert?

Aber das analoge Signal muss ich auf RA1 -> C1IN0- führen, oder?

von X4U (Gast)


Lesenswert?

Compare17 schrieb:
> Ich möchte den PIC12F1572 aber möglichst stromsparend nutzen.
Dann sollte die Eingangsimpedanz deines comapators beachtet werden.

> Der PIC12F1572 befindet sich also im SleepMode.
Was dem Comparator (sofern aktiv) egal ist.

> An einem PIN des PIC12F1572 hängt ein analogen Signal. (0-1V)
Am besten wohl an einem Eingang des Comparators.
Welche Betriebsspannung hat der Pic?



> Diese soll mittels Comparator mit einem EINSTELLBAREN Wert verglichen
> werden.
Eins aus dem internen DAC oder ein externes?

> Ist das angelegt analoge Signal grösser als der eingestellte Wert,
> schaltet der Comparator durch.

Da der DAC (falls verwendet auf dem positiven Eingang liegt) muss den 
Signal auf den negativen. Die Polarität dreht sich damit um.

> Der Comparator wiederum löst einen Interrupt aus.
Wenn der Wert die Comparatorschwelle durchläuft

> Danach werden ...

die Daten verarbeitet

> Ich kann den Negativen Eingang C1IN- nicht mit dem DAC verbinden.
Nein spielt aber keine Rolle da du ja den Umschaltepunkt brauchst

> Muss ich nun den zu überwachenden Analogwert auf RA1 (C1IN+) führen?
Würde ich auf  nen Cx-In legen s.o.

Compare17 schrieb:
> der muss ich das CxPOL Bit auch invertieren 1 setzen) ?

Kannst du machen, ist aber relativ wurscht weil du ja den Interrupt 
(sozusagen comparator output on change) nutzt. Da sind zwei von 
vorhanden und es ist wurst welche Polarität du nimmst (evtl beide zum 
testen)

Wichtiger für mich wäre dass der DAC bei pic's 5 Bit hat. Das sind 32 
stufen und wenn du den mit 5 V betreibst sind das (5 / 32) ~ 0,16 V pro 
Step. Von null kannst du auch imho auch nicht messen. Da bleiben nicht 
viele Steps übrig.

Die Stromaufnahme von DAC und COMP spielt dann auch noch ne Rolle. Ob 
der COMP ne Hysterese hat wäre auch noch wichtig (wg jitter).

von Compare17 (Gast)


Lesenswert?

Habe mir jetzt mal einen Testaufbau realisiert:
1
program DAC_Test
2
3
sub procedure InitMain
4
    ANSELA = %00000010    'RA1 = Analog
5
    TrisA.0 = 0           'RA0 = Output
6
    FVRCON.3 = 1          'Buffer einstellen
7
    FVRCON.2 = 0          'Buffer einstellen
8
    FVRCON.7 = 1          'FVR aktivieren
9
    DACCON0.3 = 1         'FVR_buffer2
10
    DACCON0.2 = 0         'FVR_buffer2
11
    DACCON0.7 = 1         'DAC Enabled
12
    DACCON1 = 16          '(64mV * DACCON1)
13
    CM1CON0.7 = 1         'Comparator 1 ein
14
    CM1CON1.6 = 1         'Comparator Interrupt bei fallender Flanke
15
    CM1CON1.5 = 0         'Comparator + ist DAC
16
    CM1CON1.4 = 1         'Comparator + ist DAC
17
    CM1CON1.2 = 0         'Comparator - ist RA1
18
    CM1CON1.1 = 0         'Comparator - ist RA1
19
    CM1CON1.0 = 0         'Comparator - ist RA1
20
    INTCON.PIE2 = 1       'Comparator interrupt ein
21
    INTCON.PEIE = 1       'Pheripheral interrupt on
22
    INTCON.GIE = 1        'Interrupts ein
23
24
end sub
25
26
sub procedure Interrupt()
27
    If INTCON.C1IF then
28
       ClearBit(INTCON,C1IF)  'Clear Interrupt Flag
29
       PortA.0 = NOT PortA.0  'Toogle RA0 for debugging
30
    end if
31
end sub
32
33
main:
34
     InitMain              'Setup Hardware
35
     while(1)              'Endless Loop
36
             nop
37
     wend
38
end.

Leider funktioniert es nicht.
Es sieht so aus, als ob der Interrupt nicht ausgelöst wird.
Wenn ich folgende Main einfüge:
1
main:
2
     InitMain              'Setup Hardware
3
     while(1)              'Endless Loop
4
             PortA.0 = NOT CMOUT   'DEBUG
5
     wend
6
end.

Wird der Pin ohne Problem gesetzt/ rückgesetzt.

Woran kann das noch liegen?

von Witkatz :. (wit)


Lesenswert?

Compare17 schrieb:
> INTCON.PIE2 = 1       'Comparator interrupt ein

Müsste es nicht heissen
PIE2.C1IE = 1

von Compare17 (Gast)


Lesenswert?

Witkatz :. schrieb:
> Compare17 schrieb:
>> INTCON.PIE2 = 1       'Comparator interrupt ein
>
> Müsste es nicht heissen
> PIE2.C1IE = 1

DAS, genau DAS war es :-D
Kapier zwar nicht, warum es der Compiler zulässt (INTCON.PIE2 = 1), aber 
es funktioniert :-D

Werde mich dann nochmals in einem separaten Tread melden, bezüglich den 
leidigen Thema Strom sparen.

Vorerst: Danke, du hast meinen (Hobbyarbeits)Abend erheblich verkürzt.

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.