新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 使用PIC讀寫1-wire EEPROM DS2430的實例程序

        使用PIC讀寫1-wire EEPROM DS2430的實例程序

        作者: 時間:2012-08-12 來源:網絡 收藏

        ;------------------------------------------------
        ; template to init before read
        ; to
        ;-------------------------------------------------
        ; movlw H'00'
        ; movwf Addr

        本文引用地址:http://www.104case.com/article/171047.htm

        ;-------------------------------------------------
        ; read one byte
        ; input
        ; Addr = starting address to read
        ; output
        ; RxB = data to read
        ;--------------------------------------------------
        Rd
        call REE2ScratchPAD
        call HostRdScratchPAD
        return


        ;;--------- host read scratch pad ----------------------------
        ;; save desired data into RxB
        ;;
        ;;--------------------------------------------------------------

        HostRdScratchPAD
        call DS2430AInitState
        banksel TxB
        movlw SkipROM
        movwf TxB
        call TxBYTE ; SkipROM

        movlw RScratch ; read scratch PAD Command
        movwf TxB
        call TxBYTE

        movf Addr,W ; starting address to read
        movwf TxB
        call TxBYTE

        call R2430A ; read desired scratch pad into RxB
        call RstPulse
        return


        ;-------------- write memory scratch scratch pad ------------------------
        ; write one byte into scratch PAD
        ; input
        ; Addr = starting address to write
        ; TxBuffer = data to save
        ; output
        ; ErrCode = 0 -> write ok
        ; = 1 -> write fail
        ;---------------------------------------------------------------------------

        WrScratchPAD
        call DS2430AInitState
        movlw SkipROM ; 0xCC
        movwf TxB
        call TxBYTE ; SkipROM

        movlw WScratch ; write memory scratch pad, 0x0f
        movwf TxB
        call TxBYTE

        movf Addr,W ; starting address of memory scratch pad
        movwf TxB ; TxBYTE use TxB
        call TxBYTE

        movf TxBuffer,W ;
        movwf TxB
        call TxBYTE
        call RstPulse ; reset pulse
        call delay500us ; wait presence pulse
        return

        ;---------- CP2EE ---copy whole scratch pad to EE ----------------------
        ; write memory scratch
        ; verify memory scratch
        ; copy memory scratch to EE
        ;----------------------------------------------------------------------
        CP2EE
        call DS2430AInitState ; 0x55 + 0xa5 + hi 10ms // [ScratchPad -> ]
        banksel TxB
        movlw SkipROM
        movwf TxB
        call TxBYTE ; SkipROM
        movlw CPScratch ; 0x55
        movwf TxB
        call TxBYTE
        movlw H'a5'
        movwf TxB
        call TxBYTE
        call ForceHi ; min 10ms refter to datasheet
        return

        ;--------- REE2ScratchPAD --- copy whole EE to ScrathPAD ----------------
        ; copy EE to whole memory scatch
        ; read memory scratch
        ;format I: 0xf0 + Addr +R +R + reset pulse, copy byte by byte
        ;format II: 0xf0 + Addr + reset pulse, copy whole
        ;------------------------------------------------------------------------
        REE2ScratchPAD
        call DS2430AInitState
        banksel TxB
        movlw SkipROM
        movwf TxB
        call TxBYTE ; SkipROM
        movlw REEROM ;; Read from EE into ScratchPAD
        movwf TxB
        call TxBYTE ;;
        call RstPulse ;; copy all
        return

        ;----------R2430A ---- Host read the scratch PAD ------------------------
        ; Read 2430A Scratch PAD
        ; LSB first
        ; save the result in RxB
        ;------------------------------------------------------------------------

        R2430A ; returns byte in RxB
        movlw .8
        movwf LoopCounter
        clrf RxB
        RLoop
        call SetLo ;
        nop
        call SetHi ; it will pull up by resistor
        nop ; delay to sample reliable bit
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop

        banksel PORTB
        movf PORTB,W
        movwf Temp
        btfss Temp,Bit2

        goto gLo
        bsf CARRY
        goto rol
        gLo
        bcf CARRY
        rol
        banksel RxB
        rrf RxB,F
        call delay60us ; tdrv + trelease
        banksel LoopCounter
        decfsz LoopCounter,F
        goto RLoop
        movf RxB,W ; save the result in W
        return

        ;----------------------------------------------------------
        ; strong pull up
        ;
        ;----------------------------------------------------------
        ForceHi

        bsf PBDir,Bit2
        movf PBDir,W ;; input

        banksel TRISB
        movwf TRISB ;; set input, pull by external resistor
        call delay100ms
        bcf PBDir,Bit2 ;; output
        movf PBDir,W
        movwf TRISB
        return
        ;-------------------------------------------------------------
        ; reset pulse
        ;
        ;--------------------------------------------------------------
        RstPulse
        call SetHi
        call SetLo
        call delay500us
        call SetHi ;Pull up by resistor
        return
        ;---------------------------------------------------------------
        ; reset pulse followed presence pulse
        ;
        ;---------------------------------------------------------------
        DS2430AInitState
        call SetHi
        call SetLo
        call delay500us ; reset pulse
        call SetHi
        call delay500us ; presence pulse, pull up by resistor
        return


        ;-----------------------------------------------------------------------

        init
        movlw H'3f'
        movwf PBDir ; 0x00111111
        banksel TRISB
        movwf TRISB ; force all portC as input
        ; movlw b'00000000' ; GP2 pull-up,GP4 output
        ; movwf WPU ; connect the D of DS2430A to Port A
        ;--------------------------------------------------------------------
        ; toggle from bank0 to bank1
        ; option register
        ; 7: 1: port A pull-up OFF, 0:port A pull-up ON
        ; 6: 1: rising INT , 0:fall INT
        ; 5: 1: T0CKI to TMR0, 0: internal cycle to TMR0
        ; 4: 1: Hi to Lo count 0: Lo to Hi count
        ; 3: 1: Precale to WDT 0: Prescale to TMR0
        ; 2:0 prescale value
        ;---------------------------------------------------------------------
        movlw b'11000010' ;; pull-up ON,rising INT, internal cycle to TMR0,Lo to Hi count,Pre to TMR0,1:8
        movwf OPTION_REG ;; ,prescal over 8
        banksel INTCON
        clrf INTCON
        clrf PORTB
        movlw 0x07 ;; comparator off
        movwf CMCON ;; comparator off
        clrf TMR0

        ;;--------------------------------------------------------
        ;; 7: X
        ;; 6: 1: Timer1 on if T1G
        ;; 5:4 : 11:/8,10:/4,01:/2,00:/1
        ;; 3 : 1 LP for timer 1 on, 0: LP for timer1 of
        ;; 2 : 1 do not sync external , 0 sync external clock
        ;; 1 : 1: clock source external , 0: clock source internal
        ;; 0 : 1: enable timer 1 ,0: disable timer 1
        ;;---------------------------------------------------------

        ; movlw b'00000000' ;x,no gate control,over 8,LP osc to timer1 off,x,internal clock,stop timer
        ; movwf T1CON
        movlw b'00111000'
        movwf T1CON
        clrf PIR1
        return

        ;;-------------------------
        ;; init interrup enable,
        ;;-------------------------
        init_int_en



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 北辰区| 巫溪县| 马鞍山市| 黄大仙区| 太白县| 汾阳市| 三穗县| 汤原县| 宜城市| 弥渡县| 五家渠市| 东光县| 五寨县| 塘沽区| 山西省| 亳州市| 惠州市| 邓州市| 九江县| 大方县| 冷水江市| 株洲市| 如东县| 赤峰市| 海晏县| 菏泽市| 广灵县| 武隆县| 白山市| 唐山市| 翁源县| 永济市| 团风县| 保定市| 慈溪市| 宜良县| 武邑县| 阿巴嘎旗| 汶上县| 凌云县| 云龙县|