Teade

Collapse

Foorumi reeglid.

Foorumi reeglistik on uuendatud. Palume tutvuda ja arvesse võtta.
See more
See less

Koodi kala?

Collapse
X
 
  • Filter
  • Kellaaeg
  • Show
Clear All
new posts

    Koodi kala?

    Tere,

    Käsil üks projekt, milles kasutan dallase DS18S20 temperatuurisensorit. Kirjutasin temperatuuri lugemiseks programmi, aga see ei taha funktsida - äkki keegi leiab vea(d) üles, ma ise seda juba tükk aega mudinud, aga nagu ei saa aru, kust katki.

    Kood ise selline (PIC jaoks, assembleris):
    Kood:
    ; ------------------------------------------------------------
    ;************** Termomeeter***************************************
    ;--------------------------------------------------------------
    get_temp_w:
                    call    init_1wire            ;teeme reseti ja kontrollime kas termomeeter on liinil
                    btfsc    temperr
                    goto    termo_error                        ; kui termomeeter ei vasta, siis välja.
                    
                    bsf        LED
                    call    tmr1_viide
                    call    tmr1_viide
                    bcf        LED
                    
                    movlw    0xCC
                    call    send_byte_termo        ; skip rom
    
                    movlw    .15
                    movwf    counter
                    movlw    0x44
                    call    send_byte_termo        ; algatame temperatuuri konversiooni
                    call    termo_kuulama
    oota_veel:    ;    bsf        LED
                    call    tmr1_viide    
                    call    tmr1_viide
                ;    bcf        LED
                    decfsz    counter
                    goto    testi_seisu
                    goto    termo_error            ;aitab küll, kaua läheb
                    
    testi_seisu:    call    read_termo
                    btfss    read_bit    ; kui 1 siis on konversioon korras ja võib minna edasi, kui 0 siis oodatakse veel
                    goto    oota_veel
    
    read_scratch:    movlw    0xBE    ;read scratchpad käsk
                    call    send_byte_termo
                    call    read_byte_termo    ;esimesena saame    temperatuuri väärtuse
                    movwf    digitemp
                    call    read_byte_termo; teisena saame märgi
                    btfss    rcv_byte,0    ;kas märgis on ühed või nullid
                    goto    plusstemperatuur ; nullid
                    goto    miinustemperatuur ; ühed
    plusstemperatuur:
                    call    reset_termo
                    bcf        sign
                    bcf        CARRY
                    rrf        digitemp,F    ;kaotame 0,5 kraadi koha
                    movf    digitemp,W
                    return
    miinustemperatuur:
                    call    reset_termo
                    bsf        sign
                    comf    digitemp,F
                    bcf        CARRY
                    rrf        digitemp,F    ;kaotame 0,5 kraadi koha
                    movf    digitemp,W
                    return
    
    
    
    termo_error:
                    clrf    digitemp
                    clrw
                ;    bcf    LED
                    bcf    temperr
                    return
    
    ;*************************************1-wire rutiinid***********************************************************
    init_1wire:                            ;init
                bcf        temperr
                call    termo_saatele
                bcf        Termo
                call    v500_us
                bsf        Termo
                call    termo_kuulama
                call    v60_us
                btfsc    Termo
                goto    init_err
            ;    bsf        LED
                call    tmr1_viide
            ;    bcf        LED
                return
                
    init_err:
                call    v500_us
                bsf    temperr
                return    
    reset_termo:
                call    termo_saatele
                bcf        Termo
                call    v500_us
                bsf        Termo
                call    termo_kuulama
                call    v500_us
                return
    
    
    write_termo_1:        ; Kirjutab 1, väljund peab enne olema kirjutamisasendis
                    call    termo_saatele
                    bcf        Termo
                    call    v5_us
                    bsf        Termo
                    call    v60_us
                    return
    write_termo_0:        ; Kirjutab 0, väljund peab enne olema kirjutamisasendis
                    call    termo_saatele
                    bcf        Termo
                    call    v5_us
                    call    v60_us
                    bsf        Termo
                    return
    read_termo:            ; Loeb, väljund peab enne olema kirjutamisasendis
                    call    termo_saatele
                    bcf        Termo
                    call    v5_us
                    bsf        Termo
                    call    termo_kuulama    ;(7us)
                    bcf        read_bit
                    nop
                    nop
                    btfsc    Termo
                    bsf        read_bit
                    call    v60_us
                    call    termo_saatele
                    call    v5_us
                    return
    send_byte_termo:
                    movwf    sendbyte        ; tööregister saatepuhvrisse
                    movlw    0x08
                    movwf    send_count
                    call    termo_saatele
    next_bit_termo:    rrf        sendbyte,F
                    bcf        write_temp_bit
                    btfsc    CARRY
                    bsf        write_temp_bit        ; dataväljundbitile carry väärtus
                    btfsc    write_temp_bit        ;kui väljundbitt kõrge
                    call    write_termo_1        ;siis kirjutame 1
                    btfss    write_temp_bit        ; kui madal
                    call    write_termo_0        ; siis 0
                    decfsz    send_count
                    goto    next_bit_termo
                    rrf        sendbyte,F    ; algsesse seisu
                    return
    read_byte_termo:
    
                    movlw    0x07
                    movwf    rcv_count
                    clrf    rcv_byte
    next_bit_rcv:    call    read_termo
                    btfsc    read_bit
                    bsf        rcv_byte,7
                    btfss     read_bit
                    bcf        rcv_byte,7
                    rrf        rcv_byte,F
                    decfsz    rcv_count
                    goto    next_bit_rcv
                    call    read_termo        ; viimane kord veel, kõik ülejäänud on õigel kohal, aga viimase biti väärtus vaja paika saada
                    btfsc    read_bit
                    bsf        rcv_byte,7
                    btfss     read_bit
                    bcf        rcv_byte,7
                    movf    rcv_byte,W
                    return
    
    termo_saatele:        ; Termomeetri jalg väljundiks ja kõrgeks (8us)
                    bsf        Termo
                    bsf        pank
                    bcf        Tris_Termo
                    bcf        pank
                    bsf        Termo
                    return
    
    termo_kuulama:    ; Termomeetri jalg sisendiks    (7us)
                    bsf        pank
                    bsf        Tris_Termo
                    bcf        pank
                    return
    Tänud ette.
    P.S. tmr1_viide on 530 ms, ülejäänud on nii pikad, kui nimigi ütleb

    #2
    Vs: Koodi kala?

    Ise küsin-ise vastan. Iga käsuga tuleb DS18S20 puhul järgida kindlasti protokolli Init-(skip)Rom-Read(vms). Kui näiteks init ära jätta, nagu mina seda tegin, keeldub kivi lihtsalt suhtlemast.
    Arvasin oma targa peaga, et piisab kui boodil 1 kord kivile init teha, ei teadnud, et ta seda iga kord tahab.
    Nüüd paistab töötavat.

    Comment

    Working...
    X