Forum: Mikrocontroller und Digitale Elektronik PIC12F683 - Comparator funktioniert nicht


von Markus B. (death_monkey)


Angehängte Dateien:

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?

von Kkkk (Gast)


Lesenswert?

Schau mal in das Errata sheet. Da steht was mit demkomperator

von Markus B. (death_monkey)


Lesenswert?

In dem 6-Seiten Dokument? Da würd ich jetzt nichts erkennen was mir 
hilft leider.

von Helfer (Gast)


Angehängte Dateien:

Lesenswert?

Markus B. schrieb:
> 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.

Im Debug-Modus werden leider die Komparator-Pins zum Debuggen benötigt.

Helfer

von Markus B. (death_monkey)


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?

von Peter D. (peda)


Lesenswert?

Markus B. schrieb:
> Leider als Foto, da die Textkonvertierung das zu unübersichtlich macht

Was willst Du denn konvertieren, doch nicht etwa nach Word.
Das ist ein ASM-File, also poste es als ein solches. Die blauen und 
roten Wellen braucht niemand.
Code postet man grundsätzlich immer als plain Text (*.asm, *.c).

von Ottmar K. (wil1)


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

von Markus B. (death_monkey)


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

von Helfer (Gast)


Lesenswert?

Und wie änderst Du die "Eingangsspannung" am Pin?
Wie sieht dein sazugehöriger Stimulus aus?

Helfer

von Markus B. (death_monkey)


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?

von Markus B. (death_monkey)


Lesenswert?

Hab das Progblem nun anders lösen können, das Register nimmt keinen 
kompletten Wert an, jedoch wenn ich via BSF die 2 Bits setze übernimmt 
er sie.

Komplett Posten kann ichs leider aus anderen Gründen nicht, da daraus 
vllt mehr als nur Private spielerei wird ^^

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.