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) ?
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)
Aber das analoge Signal muss ich auf RA1 -> C1IN0- führen, oder?
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).
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?
Compare17 schrieb: > INTCON.PIE2 = 1 'Comparator interrupt ein Müsste es nicht heissen PIE2.C1IE = 1
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.