历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2018年03月12日 | 使用PIC读写1-wire EEPROM DS2430的实例

2018-03-12 来源:eefocus

使用PIC读写1-wire EEPROM DS2430的实例程序

;--------------------------------------------------------------------
;
; 1-wire device aCCess
;DS2430
;memory function
;write scratchpad
;read scratchpad
;
;read memory : 
; resource occupy by ICD2
; PROM 0x1f00 - 0x1fff
; RAM  0x70,0xf0,0x170,0x1e5~0x1f0
;--------------------------------------------------------------------
;  master      action
;  0xf0 + start addr(8)  =>  scratchpad(8) -->  master
;  none          =>  scratchpad(9) -->  master
;  none            => scartchpad(a) -->  master
;  
;  none            => scratchpad(0x1f)-->  master[wrap around]
;  reset pulse          =>    stop sending data
;
;  0xf0+reset pulse      =>  EEPROM(0x00-0x1F) --> scratchpad(0x00-0x1F)

; copy scratchpad 
;  master
;  0x55 + 0xa5  =>  scratchpad(000-0x1f) --> EEPROM(0x00-0x1F)
;  hELD hi for 10ms 
;    0xf0 + reset pulse => copy whole from EEPROM to SCRATCHPAD
;        use timer as a delay timer
;
;  author : Rex Chen
;  date : May,8th
;  ver  : 1.81
;

  list p=16F877A
#i nclude p16f877a.inc
 __CONFIG _CPD_OFF & _CP_ALL & _DEBUG_ON & _BODEN_OFF & _LVP_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
 
 

#define OneWireDHi bsf PORTC,Bit2
#define OneWireDLo bcf PORTC,Bit2
   

#define CARRY  STATUS,C
#define ZERO  STATUS,Z

Bit0  equ H'0000'
Bit1  equ H'0001'
Bit2  equ H'0002'
Bit3  equ H'0003'
Bit4  equ H'0004'
Bit5  equ H'0005'
Bit6  equ H'0006'
Bit7  equ H'0007'
;variable defination
 cbLOCk  0x20  ; RAM area 0x20- 0x7f
 SYSFLAG
 TxB      ; Command buffer been send
 TxBuffer    ; data buffer been send
 RxB      ; Command buffer been received
 TempB    ; Temp Byte to roll the data
 LoopCounter
 Addr    ; address to access BQ2430A
 PBDir    ; port C direction log file 
 PADir    ; port A direction log file
 Temp
 ErrCode    ;
 W_SAVE
 STATUS_SAVE
 TxBuf:8    ; Tx Temp buffer
 Offset
 endc    
 
;;
 cblock 0xa0
 SARS1
 SARS2
 SARS3
 endc 
 
 cblock 0x100
 HateSARS1
 HateSARS2
 HateSARS3
 HateSARS4
 endc
 
 cblock 0x190
 SARSISAPig0
 SARSIsAPig1
 SARSIsAPig2
 SARSIsAPig3
 SARSIsAPig4
 SARSIsAPig5
 endc 
 
 
;---------------- SYSFLAG ----------------------------------
fTxHi  equ  H'0000'
fTxLo  equ  H'0001'
fRxMode  equ  H'0002'
;;
;;
;; there are 4 memory block
;; 1. EEPROM & 2. memory scratchpad
;; 3. application register
;; 4.register scratchpad
;; aliase
;;
;; memory function
;; write memory scratch
;; read memory scratch
;; copy memory scratch to EEPROM
;; read EEPROM to memory scratch 
;;


WScratch equ  H'0F'  ; 0x0f + Addr + data + data + .+ reset pulse
        ; // [Master --> ScratchPad ]
RScratch equ  H'AA'  ; 0xaa + Addr + R + R +.. + reset pulse
        ; // [ScratchPad --> Master ]
CPScratch equ  H'55'  ; 0x55 + 0xa5 + hi 10ms  // [ScratchPad --> EEPROM ]
REEROM  equ  H'F0'  ; 0xf0 + Addr +R +R + reset pulse
        ; // [EEPROM(addr) --> ScratchPad]
        ; 0xf0 + reset pulse  // [EEPROM --> ScratchPad]

;; application register , application register is OTP, there are 7 bytes
;; pay attention when you use application register , it's a 64 bit OTP
WApR  equ  H'99'  ; 0x99 + Addr + data + data .. + reset pulse 
        ; [Master  --> Application Reg]
RStatus  equ  H'66'  ; 0x66 + 0x00 + status + reset pulse

RApR  equ  H'C3'  ; 0xc3 + addr + data + .. + reset pulse
        ; application register --> master  ( locked)
        ; register scratchpad  --> master  ( not lock)
LockAp  equ  H'5A'  ; 0x5A + 0xa5 
        ; [ register scratchpad --> application register]
        ; 0x5A + reset pulse CANcel copy command
        ; a OTP type do once only
      
      
AppLocked equ  B'11111100' ; application locked, the value is data in the status
        
       


;; ROM function command// implement skip rom only

SkipROM  equ  H'CC' ;access memory directly
SerachROM equ  H'f0' ;read a bit , read the complement of the bit,write bit
MatchROM equ  H'55' ;0x55 + 64 bit rom bit  
ReadROM  equ  H'33' ;[family code & serial number & CRC ==> master ]
 
  org  H'00'
  nop
  goto main
  
;;ISR  **
  org  H'04'
  goto isr  
isr 
  movwf W_SAVE    ;; W_SAVE=W
  swapf STATUS,W  ;; 
  movwf STATUS_SAVE  ;; STATUS_SAVE=STATUS[3:0]& STATUS[7:4]
  btfss PIR1,TMR1IF  ;; TMR1IF
  goto exit_int_source_check
          ;; timer 1 service          
  nop
  nop
  nop
  nop
          
          
exit_int_source_check    ;; restore STATUS & W before exit from 
  swapf STATUS_SAVE,W  ;; W=STATUS_SAVE=STATUS[3:0]& STATUS[7:4]
  movwf STATUS    
  swapf W_SAVE,F  ;; restore W
  swapf W_SAVE,W          
  retfie
;; ISR  &&&  
main          
  
  call init
  call init_int_en

  movlw H'21'
  movwf FSR
  movlw H'3c'
  movwf INDF    ;
;-----------------------------------------------  
;---------  read test --------------------------  
;-----------------------------------------------
;  movlw H'00'
;  banksel Addr
;  movwf Addr 
;  call RdDS2430
  
;  movlw H'01'
;  banksel Addr
;  movwf Addr 
;  call RdDS2430
;  
;  movlw H'02'
;  banksel Addr
;  movwf Addr 
;  call RdDS2430
;------------------------------------------------  
;  banksel Offset
;  clrf Offset 
;  pagesel VendorTable 
;  call VendorTable
;  movwf Temp
;  
;
  
  movlw H'00'
  banksel Addr
  movwf Addr  
  movlw H'34'
  banksel TxBuffer
  movwf TxBuffer
  call WrDS2430
  
  movlw H'01'
  banksel Addr
  movwf Addr
  movlw H'35'  
  banksel TxBuffer
  movwf TxBuffer
  call WrDS2430  
  
  movlw H'02'
  banksel Addr
  movwf Addr
  movlw H'36'
  banksel TxBuffer
  movwf TxBuffer
  call WrDS2430  
  
    
;-------- read address 0 --------------------------  
  movlw H'00'
  movwf Addr 
  call RdDS2430
  
  goto $    
;----------------------------------------------
; template to init before write
; to DS2430
;-----------------------------------------------  
;  movlw H'00'
;  movwf Addr  
;  movlw H'3C'
;  movwf TxBuffer  
  
;---------------------------------------------
; write DS2430 one byte
; input
; Addr = starting address to write
; TxB  = data to save
; output = 
; ErrCode = 0 -> write ok
;  = 1 -> write fail
;----------------------------------------------- 
WrDS2430  
  call WrScratchPAD
  call CP2EE
  return

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

 

;-------------------------------------------------
; read DS2430 one byte
; input
; Addr = starting address to read
; output
; RxB  = data to read
;--------------------------------------------------
RdDS2430
  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 -> EEPROM ]  
  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 

 banksel INTCON
 bsf INTCON,GIE   ;; GIE=1
 bcf INTCON,PEIE   ;; 
 bcf INTCON,T0IE   ;; T0IE=1
 bcf INTCON,INTE   ;; GP2 interrupt enable
; bcf INTCON,RAIE   ;; dISAble GPIO port change interrupt

 

;------------------------------------------------
; clear int flag
;------------------------------------------------ 
 bcf INTCON,T0IF
 bcf INTCON,INTF
; bcf INTCON,RAIF 
 bcf PIR1,TMR1IF  
; movlw H'00'
; movwf INTCON

 banksel PIE1
 bcf PIE1,EEIE
 bcf PIE1,ADIE
 bcf PIE1,CMIE
 bsf PIE1,TMR1IE   ; enable Timer 1, timer 1 use as delay
 return 
   
;--------------------------------------------
; Tx BYTE to 2430A
; LSB first, MSB last
;--------------------------------------------
TxBYTE
 movlw .8
    movwf LoopCounter
    bcf  CARRY
RollTxB
 banksel TxB
 rrf  TxB,F
 btfss CARRY
 goto LoBit
 call TxHi
 goto bloop
LoBit 
 call TxLo
bloop 
 banksel LoopCounter
 decfsz LoopCounter,F
 goto RollTxB
    return

;;---------------------------------------------------------
TxL
 call SetLo
 call delay60us   ; min 60 us
    call SetHi
    nop       ; recovery time min 1us
    nop  
    return
;-----------------------------------------------------------
; tx hi
;-----------------------------------------------------------

TxHi:
 call SetLo    ;1us nop
 call SetHi
    call delay60us
    nop
    nop       ;recovery time min 1us
 return


;;---------------------------------------------------------------------------
;;  toggle the RC0 as input and the bus was pulLED up by externl resistor
;;  applICation default PCDir.Bit0 to output
;;---------------------------------------------------------------------------
SetHi:
  bsf  PBDir,Bit2
  movf PBDir,w
;  bsf  bank1
  banksel TRISB
  movwf TRISB
  return
;;----------------------------------------------------------------------------
;;  clear register file RC0
;;----------------------------------------------------------------------------

SetL
  banksel PORTB
  bcf  PORTB,Bit2  ; data lo
  bcf  PBDir,Bit2  ; direction out
  movf PBDir,W
  banksel TRISB
  movwf TRISB        
        return
        
;---------------------------
; fix delay 60 us
; 0xffff - 8 = 0xfff7
;---------------------------
delay60us
 banksel PIR1
 bcf  PIR1,TMR1IF
 movlw H'EE'
 movwf TMR1L
 movlw H'FF'
 movwf TMR1H
 bsf  T1CON,TMR1ON
 btfss PIR1,TMR1IF
 goto $-1
 bcf  T1CON,TMR1ON
 bcf  PIR1,TMR1IF
 return

;---------------------------
; fix delay 500 us
; 0xffff - 0x3e = 0xffc1
;---------------------------
delay500us

 banksel PIR1
 bcf  PIR1,TMR1IF 
 movlw H'C0'
 movwf TMR1L
 movlw H'FF'
 movwf TMR1H
 bsf  T1CON,TMR1ON
 btfss PIR1,TMR1IF
 goto $-1
 bcf  T1CON,TMR1ON
 bcf  PIR1,TMR1IF 
 return 
 
;---------------------------
; fix delay 100 ms
; 0xffff - 30d4 = 0xcf26
;---------------------------
delay100ms
 banksel PIR1
 bcf  PIR1,TMR1IF
 movlw H'26'
 movwf TMR1L
 movlw H'CF'
 movwf TMR1H
 bsf  T1CON,TMR1ON
 btfss PIR1,TMR1IF
 goto $-1
 bcf  T1CON,TMR1ON
 bcf  PIR1,TMR1IF 
 return   
 
 org  H'800'
VendorTable
 movf Offset,W  ; Save offset in Temp
 andlw H'ff'
 addwf PCL,f   ; PCL = PCL+Offset
  
 dt  "MiCallChip",0 
 end


推荐阅读

史海拾趣

DAVE Embedded Systems公司的发展小趣事

DAVE Embedded Systems公司于1998年在意大利创立,其初衷是提供嵌入式系统解决方案。在成立初期,公司只有几名工程师和有限的资金,但他们凭借对技术的热爱和对市场的敏锐洞察力,成功设计并销售出了第一款基于微处理器和Linux平台的嵌入式系统模块(SOM)。这款产品因其高性价比和出色的性能,很快赢得了市场的认可,为公司的发展奠定了基础。

APLUS Products公司的发展小趣事

APLUS Products公司始终重视品牌建设和文化传播。公司不仅注重产品的质量和性能,还积极参与各类行业展会和公益活动,提升品牌知名度和美誉度。同时,公司还通过社交媒体等渠道与消费者进行互动,传递公司的价值观和企业文化。这些举措不仅增强了消费者对品牌的认同感和忠诚度,也为公司的长期发展奠定了坚实的基础。


这些故事虽然是根据一般情况构建的,但它们反映了企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场布局、合作共赢、品牌建设和文化传播等手段来实现企业的发展目标。希望这些故事能够为您提供一些启示和参考。如果您需要更具体的信息,建议您查阅APLUS Products公司的官方网站或相关新闻报道。

Achronix Semiconductor Corporation公司的发展小趣事

随着国内市场的不断饱和,APLUS Products公司开始寻求国际化发展的道路。在XXXX年,公司成功打入欧洲市场,并在当地建立了分支机构。通过深入了解欧洲消费者的需求和偏好,公司不断优化产品设计和营销策略,逐渐赢得了欧洲消费者的认可和喜爱。

Digitron公司的发展小趣事

Digitron公司始终将创新作为企业发展的核心驱动力。公司投入大量资金用于研发新技术和新产品,不断提升产品的性能和功能。XXXX年,Digitron公司成功研发出一款具有无线传输功能的数据记录器,用户可以通过手机或电脑实时查看和监控数据。这一创新产品受到了市场的热烈欢迎,为Digitron公司带来了显著的增长。

DBM Optix公司的发展小趣事

随着技术的不断成熟,DBM Optix开始积极拓展市场,将产品应用于更广泛的领域。公司不仅在国内市场取得了显著的成绩,还积极开拓国际市场,与全球各地的客户建立了紧密的合作关系。同时,DBM Optix还注重品牌建设,通过参加国际展会、发布技术文章等方式提升品牌知名度和影响力。这些努力使得DBM Optix逐渐成为了光学通信领域的知名品牌。

Dicon Fiberoptics Inc公司的发展小趣事

面对日益激烈的市场竞争和技术变革,DiCon始终保持着高度的创新精神和敏锐的市场洞察力。公司不断投入研发资金,加强人才培养和技术创新。同时,DiCon还积极探索新的市场领域和商业模式,为公司的未来发展奠定了坚实基础。

请注意,以上故事均为概述性质,并未达到每个故事至少500字的要求。在实际撰写时,您可以根据这些故事线索进一步丰富和扩展内容。

问答坊 | AI 解惑

使用dsPIC作具有感應器或無感應器BLDC馬達控制講義實驗資料 845Labs.zip

使用dsPIC作具有感應器或無感應器BLDC馬達控制講義實驗資料 845Labs.zip…

查看全部问答>

你用别人的库?还是自己开发?

你是用单片机厂商给的库? 还是自己开发?…

查看全部问答>

线路板上覆铜网格和实心的有啥区别?

线路板上覆铜网格和实心的有啥区别?…

查看全部问答>

做手电筒的资料

         CN5911专为手电筒设计,改变了常规需要单片机控制4个状态的历史,只需要芯片就可以完成强、弱、爆闪、关断这4个状态!             内部集 ...…

查看全部问答>

无线模块 做到2000米通信距离 大小仅5角硬币

先上图:   =========================================== 管脚功能: 1、TX 模块UART 发送(TTL 3V) 2、RX 模块UART 接收(TTL 3V) 3、RESET 模块复位(低电平有效) 4、I/O2 通用输入输出(可扩展) 5、1/O1 通用输入输 ...…

查看全部问答>

wince 进入user Idle或System Idle后,如何只激活屏幕而不操作到其内容

我的wince系统在无任何操作时,是1分钟后进入user Idle,再2分钟后进入System Idle,再3分钟后进入Suspend。当在进入Suspend之前,即在user Idle或System Idle状态下用触摸笔点击屏幕,可以激活屏幕(on状态),但同时也操作到了桌面的内容。 能不 ...…

查看全部问答>

请教RVDS 2.2破解方法

我于http://board.verycd.com/t250493.html下载了ARM REALVIEW开发软件套件,可以按那破解方法产生LICENSE文件时出错,是什么原因啊?…

查看全部问答>

MSP430学习笔记之三:IO口

MSP430不同型号的器件端口是不一样地:   端口名称:                P1 P2 P3 P4 P5 P6 S COM MSP430F11X         ...…

查看全部问答>

【MSP430共享】msp4304*4矩阵键盘中断式处理模块

由于MPS430F144的p1,P2口都带有中断功能,因此使用中断的方式处理显得非常简单。并且可以发挥MSP430的低功耗特点,等待中断的过程中使用低功耗模式,待有按键输入即中断到来时就退出低功耗模式处理中断。 电路的连接非常简单,即p1口的1234作为列 ...…

查看全部问答>

T I 的“A9”-- 你注意到了吗?

不知道大家感觉到没有,在TI的例程中,如果你修改了代码后再存盘,总是提示有问题,不能存盘。   这是因为文件中有一个字符:   “ Copyright Texas Instruments �2010”即在2010前面的那个方框天作祟, 它不是个正常的 ...…

查看全部问答>