PIC12F683 - Comparator funktioniert nicht

OP #5229403
Lesenswert?

Hi,

ich wollte ein Programm schreiben an der ich ständig einen Pin überwache 
ob die Spannung dort größer ist als die eingestellte Referenzspannung. 
Nach einer gewissen Zeit soll eine LED angehen.

Daher dachte ich, den Comparator des PICs zu benutzen (PIC12F683) und 
habe bisher folgendes geschrieben.
Im Debugmodus allerdings komme ich nicht über die Abfrage hinaus ob die 
Spannung nun größer ist am Eingangspin. Dort habe ich auch bemerkt das 
er gar keinen Wert in das CMCON0 Register schreibt.

Teil vom Programm:
Leider als Foto, da die Textkonvertierung das zu unübersichtlich macht

___

Habt Ihr eine Idee was ich hier falsch gemacht hab?
Angehängte Dateien:
OP #5229468
Lesenswert?

Meinte jetzt lediglich die Softwaredebug Methode.

Die IOs sind doch richtig configuriert, den COUT nehm ich nicht vom Pin, 
sondern vom internen Register.
Cin- ist meine Referenzspannung.
Cin+ Pin als IO, da auf Cin+ für den Comparator die interne 
Referenzspannung von 1,88V anliegt (zumindest glaub ich das, so richtig 
eingestellt zu haben)

aber wenn ich jetzt in den Softwaredebugmodus, also Simulator des MPLAB 
X gehe, schreibt er mir wenn er die Config durchläuft in jedes Register 
einen Wert, nur in das CMCON0 register nichts, das bleibt auf 00000000.

Daher glaube ich, das er eventuell deshalb bei der Abfrage des Cout, des 
CMCON0 Registers nicht weiterkommt da er gar nicht Startet aufgrund der 
nicht Konfiguration.
Oder muss ich den Vorab irgendwie aktivieren, bevor ich Konfigurieren 
kann?
#5229484
Lesenswert?

@Markus

Schaden, dass Du nicht Dein gesamtes Programm als Anlage beigefuegt 
hast. So kann man halt nur raten.

Im Debug-Modus sind nicht immer alle Funktionen verfuegbar, da musst Du 
dann schon mit dem Stimulus (vgl. Debugger-Menue MPLAB) arbeiten.

Diese Configuration solltest Du beruecksichtigen:
;configure Comparator with Output and Internal Reference
;page 2 and page 53 datasheet
;GP0 comparator Input + (CIN+) configur as input
;GP1 "          Vref    (CIN-) "           "
;GP2 "          Output  (COUT) "           output
;
banksel GPIO          ;bank0
clrf    GPIO          ;clear output latches
BANKSEL  ANSEL         ;bank1 ->page 33
clrf    ANSEL         ;b7:4 unused (ADC)
bsf     ANSEL,GP0     ;b3:0 = 0011  inputs
bsf     ANSEL,GP1
BANKSEL TRISIO
clrf  TRISIO
bsf  TRISIO,GP0    ;set Pin as Input  CIN+
bsf     TRISIO,GP1    ;"   "   "  "      CIN- (CVref)
bcf     TRISIO,GP2    ;"          Output COUT
;
banksel CMCON0        ;page 56
clrf  CMCON0
   ;b7,5 unimplemented     b6=0 Output-flag (read only)
   ;b4=0  Output non inverted
   ;b3=1  CIN+connects to VIN-
   ;b2:0 =100 Vref connected to VIN+
movlw   b'00001100'
movwf   CMCON0
;
banksel VRCON         ;page 58
clrf    VRCON
bsf     VRCON,VREN    ;b7=1 Vref circuit powered ON
bcf     VRCON,VRR     ;b5=0 High range
bsf     VRCON,VR3     ;Vref=(Vdd/4) + (15/32) *Vdd(5V)
bsf     VRCON,VR2     ;       3,75V
bsf     VRCON,VR1
bsf     VRCON,VR0
banksel 0

mfG Ottmar
OP #5229488
Lesenswert?

Ne habs da nur fix reinkopiert, da bloß die paar Zeilen mMn wichtig 
sind.

Hab auch im Simulator mal den Wert den ich oben in das CMCON0 Register 
reinschreiben möchte, per Hand eingetippt und dann würde alles soweit 
wie geplant funktionieren.

Daher ist momentan halt mein bisheriges einziges Problem, dass er den 
Wert nicht in das Register übernimmt.

Sorry, die Codeeingabe vorher hatte nicht funktioniert ^^
1
#include    "p12F683.inc"
2
 __CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF
3
 Errorlevel -302
4
 LIST
5
   
6

7
RES_VECT  CODE    0x0000             ;Prozessor Vector Reset  
8
    GOTO    Ini                      ;Gehe zur Initialisierung
9

10
Ini
11
    Banksel  OSCCON      ;500kHz Interne Frequenz
12
    movlw  B'00110111'
13
    movwf  OSCCON    
14
    Banksel  ANSEL      ;Analogsignal auf Interne Frequenz
15
    movlw  B'00110010'
16
    movwf  ANSEL
17
    Banksel  TRISIO      ;Einstellung Input/Output
18
    movlw  B'00011111'
19
    movwf  TRISIO
20
    Banksel  CMCON0      ;Comparator aktiv und auf VRef Intern
21
    movlw  B'00010100'    ;COUT invertiert
22
    movlw  CMCON0      ;Vin > Vref = COUT High
23
    Banksel  VRCON      ;Comparatorreferenz 1,88V
24
    movlw  B'10101001'
25
    movwf  VRCON
26
    Banksel  GPIO
27
    clrf  GPIO      ;Reset Aus-/Eingänge
28
    goto  Start
29

30
  
31
Start          ;Abfrage Spannung zu hoch
32
    btfss   CMCON0,6
33
    goto    Start
OP #5229500
Lesenswert?

Im Simulator am PC kann ich doch die IO manuell verwalten.


Wie gesagt, mein einziges Problem mit dem ich nicht zurecht komme oder 
es verstehe ist, dass ich alle Register ändern kann um meine 
Konfiguration durchzuführen - Nur das CMCON0 Register übernimmt nicht 
den Wert 00010100 den ich hineinschreiben will sondern bleibt stur auf 
00000000

Wenn ich manuell in der Simulation den gewollten Wert in CMCON0 
eintippe, funktioniert zumindest dort auch meine restliche Schaltung. 
Aber warum übernimmt er für dieses Register den Wert nicht?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren