Forum: Mikrocontroller und Digitale Elektronik PIC16F627_AnalogDigitalUmsetzer mit Comperator


von rene (Gast)


Lesenswert?

Wünsche erst einmal ein guten Abend,

Ich habe folgendes Problem:

Ich möchte eine Spg. mit dem PIC messen.
Diese soll mir aber jedoch nicht per display angezeigt werden.
Sondern ich mit im Programm ein Wert eingeben, der einer Spg. wieder 
spiegelt. Und ist die Spg. überschritten soll ein Ausgang an PortB 
angesprochen werden.

habe mir dazu eine experemntierplatine gebaut.
das Programm und die anschaltung der jeweiligen Eingänge/Ausgänge habe 
ich nach den Informationen der Seite 
http://www.sprut.de/electronic/pic/programm/compadc/compadc.html gebaut. 
das Program habe ich probiert meinen wünschen anzupassen..aber leider 
ohne erfolg!

meine frage ist wie kan ich das lösen bzw. was hab ich falsch gemacht?

und dan noch in dem Programm soll eine 10Bit auflösung sein, kann aber 
nur 8Bit mit der Alu verarbeiten, wie soll das gehen?? oder hab ich das 
falsch verstanden?

schon mal im vorraus danke
und noch einen schönen Abend

mfg René

von Lehrmann M. (ubimbo)


Lesenswert?

rene schrieb:
> was hab ich falsch gemacht?

Was hältst du davon uns deinen Code zu präsentieren ?!

rene schrieb:
> und dan noch in dem Programm soll eine 10Bit auflösung sein, kann aber
> nur 8Bit mit der Alu verarbeiten, wie soll das gehen??

Lies mal ein bisschen auf der Website weiter auf der du schon warst ... 
da bist du für Assembler goldrichtig ...

Kannst du Assembler? C? Hast du eine Ausrüstung zum Programmieren?

von rene (Gast)


Lesenswert?

sry, is ne gute idee den quellcode mit zusenden..
danke, für den hinweis
///////////////////////////////////////////////////////////////
        __CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & 
_WDT_OFF &_HS_OSC &  _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT

;======================================================================= 
===
;       Variable Definition
;======================================================================= 
===
; Constanten festlegen
#define LED     PORTB

; Variable festlegen
counter         equ     0x20            ;
result_l        equ     0x22            ;
result_h        equ     0x23            ;


;**************************************************************
; Programmanfang

        org     0

;**************************************************************
; Initialisierung *********************************************

init
        bsf     STATUS, RP0             ; Bank 1
        clrf    OPTION_REG
        clrf    TRISB                   ; PortB alle outputs
        bcf     STATUS, RP0             ; Bank 0
        clrf    PORTB                   ; LEDs aus
        clrf    INTCON                  ; Interrupt disable
        call    InitCAdc                ; ADC vorbereiten

mainloop                                ;HIER HABE ICH was verändert
        call    CAdc                    ; wandeln
  bsf  PORTB,4
  movlw  625
        subwf  result_l,1              ; Low-8-Bit an PORTB anzeigen
  btfsc  STATUS,Z
  bsf  PORTB,2
  btfss  STATUS,Z
  bcf  PORTB,2

  goto    mainloop



;**************************************************************
; ADC-code aus AN700*******************************************
; initialisierung des adc**************************************
InitCAdc
        bsf     STATUS, RP0
        movlw   0xEC            ; Vref ein, Vref zu RA2
        movwf   VRCON           ; LowRangeMode, VR = 12 = 2,5 V
        bcf     TRISA, 3        ; RA3 output des 'DAC'
        bcf     STATUS, RP0
        movlw   0x06            ; 2 Komparatoren mit Referenzspannung
        movwf   CMCON           ; Comp1 out = RA3
        return

;**************************************************************
; Wandeln der spannung*****************************************
CAdc
        clrf    counter
        clrf    counter+1
        clrf    result_l
        clrf    result_h
        movlw   0x03            ; 2 Komparatoren mit Referenzspannung
        movwf   CMCON



loop
        btfsc   CMCON, C1OUT    ; ist Komparator High oder low
        goto    complow         ; low
comphigh
        nop                     ; high
        bcf     PORTA, 3        ; 'DAC' = 0
        incfsz  result_l, f     ; zählen der 'Spannung'
        goto    eat2cycles
        incf    result_h, f
        goto    endloop
complow
        bsf     PORTA, 3        ; 'DAC' = 1
        nop
        goto    eat2cycles
eat2cycles
        goto    endloop
endloop
        incfsz  counter, f      ; Zahl der Zyklen Zählen
        goto    eat5cycles
        incf    counter+1, f
        movf    counter+1, w
        andlw   0x04            ; nur Bit 2 einblenden
        btfsc   STATUS, Z       ; Bit 2 =1 ?    1024 Zyklen vorbei?
        goto    loop            ; nein
        goto    exit            ; ja
eat5cycles
        goto    $+1
        nop
        goto    loop
exit
        movlw   0x06            ; 2 Komparatoren mit Referenzspannung
        movwf   CMCON           ; Comp1 out = RA3
        return

        end
///////////////////////////////////////////////////////////////////////
hatte es mir sogedacht, ich habe ja den wert vom result_l was meine spg. 
angibt. und dort ziehe ich ein wert ab um zu prüfen ob die spg. zu hoch 
ist. ich teste das zero flag ob das ergebnis null wird, müsste natürlich 
noch prüfen ob ich ein negativ übertrag bekomme, hab ich zwar schon 
probiert (aber mein ausgang würde laufend gesetzt) ist in dem quellcode 
nicht drin! und zum Z noch mal mein Ausgang kommt auch aber nicht bei 
den spg. werten die ich errechnet habe. hier sollte er bei ca. 3V kommen 
aber 2,68V spricht er aber an..frage dazu bin ich auf dem richtigen weg 
oder habe ich irgendwo ein denk fehler gemacht??

also von können kan keine rede sein, ich stecke sozusagen in den 
kinderschuhen, habe in der schule einwenig gemacht mit assambler aber 
halt nur angekratzt, so das mir zumin einiges was sagt und ich ungefähr 
weiß wie man was machen sollte...C++ hatte ich dagegen ausführlicher 
aber würde mich nicht als crack bezeichnen..

ich habe das Bord von Vellman K8084 und habe halt zusätzlich eine selbst 
gebaute testplatine

von chris (Gast)


Lesenswert?

Ich habe mich mit der Problemstellung selber noch nicht auseinander 
gesetzt.
Steht bei mir erst demnächst auf dem Plan.

Allerdings ist mir in deinem mainloop die Anweisung movlw  625
aufgefallen. Damit lädst du die Zahl 625 in das Arbeitsregister W.
Ich gehe jetzt mal davon aus das es sich da um eine Dezimale Zahl 
handelt.
Da W 8 Bit Breit ist geht aber nur 0...255 Dezimal oder 0x00...0xFF Hexa 
usw.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

rene schrieb:
> und dan noch in dem Programm soll eine 10Bit auflösung sein, kann aber
> nur 8Bit mit der Alu verarbeiten, wie soll das gehen??
Vergleich erst die oberen 2 Bits, und dann den Rest.

BTW:
>>> AnalogDigitalUmsetzer mit Comperator
es ist bestenfalls ein Comp-A-rator (nix mit E)...

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.