Fehler bei ADC



  • Bei dem Folgendem Programm habe ich ein großes problem.

    eEss sollte die vom ADC eingelesene spannung in Bit an LEDs anzeigen, und es sollten von den 10 Bit (da es ein 10bit ADC ist) die niedrigeren 8 bit gespeichert und angezeigt werden (da die ersten 8 bit in einem eigenem Byte gespeichert werden und die letzten 2 auch). Die 8 niedrigen sollten in "ADRESL" gespeichert sein, doch sobald ich diese daten in den arbeitsspeicher oder sonst wohin schreibe, werden nich die niedrigen 8 bit sondern die höheren 2 bit hineingeschrieben. 😮 Die stelle wo es in den arbeitsspeicher geschrieben wird is mit "?????" markiert.
    Ich habe keine Ahnung warum das so ist, habe auch schon meinen Lehrer gefragt und der wusste auch keinen Rat.

    Bitte helft mir!

    #include <P16f877.INC>
    
        ERRORLEVEL      -302        ;SUPPRESS BANK SELECTION MESSAGES
    
    ;**********************************************************
    
    ;* Variablen 
    wait    EQU    0x20
    leds    EQU    0x21
    ;* ADC Initialisierung
    
    init 
    ;* PortB vorbereiten 
        bsf    STATUS, RP0  ; auf Bank 1 umschalten 
        movlw  B'00000000'  ; PortB alle output 
        movwf  TRISB 
        bcf    STATUS, RP0  ; auf Bank 0 zurückschalten 
        clrf   PORTB        ; alle LEDs ausschalten
    
    ;* ADC einschalten 
        BSF    ADCON0, 0    ; ADON=1
    
    ;* ADC-Eingang AN0 auswählen 
        BCF    ADCON0, 5    ; ADCHS2=0 
        BCF    ADCON0, 4    ; ADCHS1=0 
        BCF    ADCON0, 3    ; ADCHS0=0
    
    ;* ADC speed für 20 MHz einstellen 
        BSF    ADCON0, 7    ; ADCS1=1 
        BCF    ADCON0, 6    ; ADCS0=0  (-> 64Tosc Wartezeit)
    
    ;* Daten rechtsbündig 
        BSF    STATUS,RP0   ; Bank1 
        BCF    ADCON1, 7    ; ADFM=1    
        BCF    STATUS,RP0   ; Bank0 
    
    ;********************************************************** 
    ;* Hauptprogrammschleife
    
    Main 
    ;Eingangsspannung wandeln 
        BSF     ADCON0, 2     ; ADC starten 
    loop 
        BTFSC    ADCON0, 2    ; ist der ADC fertig? 
        GOTO     loop         ; nein, weiter warten
    
    ; Wert nach PortB schreiben 
        movf     ADRESL ,0    ;  ????? Hier ist der Fehler, es sollten eigentlich die LOW stellen übernommen werden, es werden jedoch immer die High in den arbeitsspeicher geschrieben.
        movwf    leds
        movwf    PORTB        ; obere 8-Bit nach PortB
    
    ; Warten, damit der ADC sich erholen kann 
        clrf     wait 
    warten 
        DECFSZ   wait, f 
        goto     warten
    
        goto     Main
    
        end 
    ;**********************************************************
    


  • Woher weißt du denn, dass die high bits in das W Register geladen werden?

    movwf    PORTB        ; obere 8-Bit nach PortB
    

    Der Kommentar passt nicht zum vorangegangenen Code



  • das weis ich weil ich das programm mit Proteus simuliert habe, und da kann man sich alle register ansehen


Anmelden zum Antworten