Hallo,
Ich habe, nachdem ich im Netz und diversen Büchern gelesen habe, mein
erstes Projekt in Angriff genommen. Es ist eine Terrariensteuerung, wo ich
auch Temperatur und Luftfeuchte auswerte. Mit der Temperaturmessung hatte ich keine Probleme. Hier habe KTY am AD. Probleme habe ich jetzt
mit meinem Feuchtigkeitssensor. Ich verwende einen HIH_4000(an ihm liegt es aber nicht, simuliere die Eingangsspannung erst mal ). Bis 23% geht alles wunderbar, dann fängt er an, falsche Werte anzuzeigen. Wenn ich mein Programm mit der Hand nachrechne, müsste alles ok sein aber mein LCD zeigt nicht das, was ich sehen will.
Habe jetzt schon das ganze Wochenende gesessen und den Fehler gesucht, aber ich habe keine Idee mehr.
Vielleicht kann mal jemand, der dann doch ein bissel mehr Erfahrung hat ein Auge drauf werfen.
Ich verwende einen PIC 18F242 ,mit 6.5538Mhz getaktet.
Code:
Luft_Fe
           bcf          Flag2,3         ;Flag für 1 Messung/Minute
           clrf         PRODL
           clrf         PRODH
           clrf         ADRES_L
           clrf         ADRES_H
           clrf         PR_ZH
           clrf         PR_ZL
           clrf         Sum_L
           clrf         Sum_H
           clrf         ADRESL
           clrf         ADRESH
           bsf          ADCON0,3         ;RA2 gesetzt
           bsf          ADCON0,4         ;  "
           bcf          ADCON0,5         ;  "
           bsf          ADCON0,2         ;AD Start
Test_B     btfsc        ADCON0,2
           goto         Test_B           ;AD fertig?
           movf         ADRESL,w
           movwf        ADRES_L          ;zwischensp. für Berechnung
           movf         ADRESH,w
           movwf        ADRES_H          ;zwischensp. für Berechnung
           movlw        B'11000100'
           movwf        Sum_L
           movlw        B'00000000'      ;196 nach Sum_H und _L
           movwf        Sum_H            
           bcf          STATUS,C
           movf         Sum_L,w
           subwf        ADRES_L,f
           btfss        STATUS,C
           goto         M_sub16a
           movf         Sum_H,w
           subwf        ADRES_H,f
           goto         M_sub16c
M_sub16a   movf         Sum_H,w
           subwf        ADRES_H,f
           btfsc        STATUS,C
           goto         M_sub16b
           decf         ADRES_H,f
           goto         M_sub16c
M_sub16b   movlw        1
           subwf        ADRES_H,f         ;AD Wert -196(offset für0°C)
M_sub16c   
           movf         ADRES_L,w
           movwf        PR_ZL
           movf         ADRES_H,w         ;Wert speichern für Add. x10
           movwf        PR_ZH
           bcf          STATUS,C
           rlcf         ADRES_L,f
           rlcf         ADRES_H,f
           bcf          STATUS,C
           rlcf         ADRES_L,f
           rlcf         ADRES_H,f 
           bcf          STATUS,C
           rlcf         ADRES_L,f
           rlcf         ADRES_H,f      
           movf         PR_ZL,w
           addwf        ADRES_L,f
           movf         PR_ZH,w
           addwfc       ADRES_H,f        
           movf         PR_ZL,w
           addwf        ADRES_L,f
           movf         PR_ZH,w
           addwfc       ADRES_H,f        ;x10
           bcf          STATUS,C         
           rrcf         ADRES_H,f
           rrcf         ADRES_L,f        ;1x
           bcf          STATUS,C
           rrcf         ADRES_H,f
           rrcf         ADRES_L,f        ;2x
           bcf          STATUS,C
           rrcf         ADRES_H,f
           rrcf         ADRES_L,f        ;3x
           bcf          STATUS,C
           rrcf         ADRES_H,f
           rrcf         ADRES_L,f        ;4x
           bcf          STATUS,C
           rrcf         ADRES_H,f
           rrcf         ADRES_L,f        ;5x 
           bcf          STATUS,C
           rrcf         ADRES_H,f
           rrcf         ADRES_L,f        ;6x =/64
          
           clrf         Ergeb
           clrf         ZLF
           clrf         Luft             ;Wert für Ausgabe LCD aufarbeiten
           movf         ADRES_L,w
           movwf        Luft             ;ganzzahliger Wert für Sprühdauer
           movf         ADRES_L,w        
           movwf        Ergeb  
Schle_Z    movlw        D'10'            ;Zehnerstelle ermitteln
           subwf        Ergeb,f
           btfss        STATUS,C
           goto         Fert_Z
           incf         ZLF,f            ;Zehnerstelle
           goto         Schle_Z
     
           
Fert_Z   
           clrf         PRODH
           clrf         PRODL
           clrf         ELF
           clrf         Ergeb
           movlw        D'10'
           mulwf        ZLF              
           movf         PRODL,w
           subwf        ADRES_L,w        ;
           movwf        ELF              ;Einer Luftfeuchte

           movlw        B'11011010'            ;LCD Zeile vier Zehner Luftfeu
           call         OutLcdControl
           movf         ZLF,w            ;Ausgabe Zehner Luftfeuchte
           iorlw        '0'
           call         OutLcdDaten 
           movlw        B'11011011'
           call         OutLcdControl
           movf         ELF,w            ;Ausgage Einer Luftfeu
           iorlw        '0'
           call         OutLcdDaten 

           return
vielen Dank schon mal im Voraus, Djog