Forum: Mikrocontroller und Digitale Elektronik PIC16F872 nimmt falsche Vref


von Wolle M. (horst_von_elektron)


Lesenswert?

Hi,
ich habe folgendes Problem:
Es wird eine externe Referenzspannung erzeugt und auf den Pin RA3 
gegeben.
softwaretechnisch habe ich in der Initialisierung des PIC's auch externe 
Vref eingestellt.

Hier die Initialisierung:

main:
;--------------------------Initialisierung------------------------------
  ; Übertragungsrichtung der Portpins einstellen (0=Ausgang, 1=Eingang)
  clrf  PORTA      ; Ports auf definierte Pegel schalten
  clrf  PORTB
  clrf  PORTC


  bsf      STATUS, RP0  ; Auf Bank 1 wechseln
  bcf    STATUS, RP1
  movlw  B'11111111'    ; Port A als Eingang (Messchannel, 
Referenzspannung)
  movwf  TRISA
  movlw  B'10001000'    ; Port B als Eingang (LE's, und ICSP)
  movwf  TRISB
  movlw  B'00000000'    ; Alle Pins als Ausgänge (Ansteuerung der 
Treiber)
  movwf  TRISC
  bcf     STATUS, RP0    ; Zurück auf Bank 0

  ; ADC Initialisierung:
  ; Ergebniss Linksbündig
  bcf    ADCON1,ADFM    ; 0 = linksbündig  1 = rechtsbündig

  ; Referenzspannung liegt an RA3, Alle Eingänge sind auf analog 
geschaltet
  bsf    ADCON1,PCFG0
  bsf    ADCON1,PCFG1
  bcf    ADCON1,PCFG2
  bcf    ADCON1,PCFG3

  ; Channel 0 ausgewählt
  bcf    ADCON0,CHS0
  bcf    ADCON0,CHS1
  bcf    ADCON0,CHS2  ; GO/DONE ADC-Bit löschen
  bcf    ADCON0,2     ; Unbelegtes Bit
  bcf    ADCON0,1     ; ADC aktivieren
  bsf    ADCON0,ADON  ; Eingstellen der max. Betriebsfrequenz
  bsf    ADCON0,ADCS0
  bcf    ADCON0,ADCS1

  ; Interrupt-Init:
  bcf    PIR1,ADIF     ; Flag Bit löschen
  bsf    STATUS, RP0   ; Auf Bank 1 wechseln
  bsf    PIE1,ADIE     ; ADC interrupt ADIE aktivieren
  bcf    STATUS, RP0   ; Auf Bank 0 wechseln
  bsf    INTCON, PEIE  ; ADC interrupts freigeben
  bsf    INTCON, GIE   ; Alle Interruptquellen freigeben
------------------------------------------------------------------------

Ich habe das Programm inbetriebgenommen. Das Programm funktioniert an 
sich.

Nur nimmt der PIC die interne Vref (5V) und nicht die externe (4096mV).

Warum schalter der PIC nicht auf die externe?

Vielen Dank im Voraus für eure Hilfe!!

von Chris B. (dekatz)


Lesenswert?

Wolle Moritz schrieb:
>   bcf     STATUS, RP0    ; Zurück auf Bank 0
>
>   ; ADC Initialisierung:
>   ; Ergebniss Linksbündig
>   bcf    ADCON1,ADFM    ; 0 = linksbündig  1 = rechtsbündig
>
>   ; Referenzspannung liegt an RA3, Alle Eingänge sind auf analog
> geschaltet
>   bsf    ADCON1,PCFG0
>   bsf    ADCON1,PCFG1
>   bcf    ADCON1,PCFG2
>   bcf    ADCON1,PCFG3
>

ADCON1 liegt aber nicht in BANK0 sondern in BANK1.
Wenn man sich angewöhnt "BANKSEL register" zu verwenden, passiert so was 
nicht.

von Wolle M. (horst_von_elektron)


Lesenswert?

Danke!
Hast du noch eine kurze Info (link oder sowas) zum Befehl BANKSEL?

Den habe ich noch nicht in meinem Schul-Assambler gelernt ;)

von Chris B. (dekatz)


Lesenswert?

Anstelle sich mit den RP0/RP1 Bits des Statusregisters zu "ärgern", 
schreibst du einfach z.B.
BANKSEL ADCON1
Der Assembler ersetzt das durch die passenden bcf/bsf Befehle für 
STATUS, RP0/RP1.

Im MPASM User Guide o.ä. ist da sicher auch beschrieben.

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.