avrx_eeprom.s

来自「血凝仪检测系统,硬件电路部分由正弦波产生模块、前级放大与滤波模块、检测线圈、锁相」· S 代码 · 共 128 行

S
128
字号
#include        "avrx.inc"
/*
        Copyright 1999-2001, Larry Barello
        larry@barello.net

*/
        _MODULE(avrx_eeprom)

        _EXTERN(AvrXWaitSemaphore)
        _EXTERN(AvrXSetSemaphore)
        
        _DATASECTION
        
        _GLOBAL(EEPromMutex, MtxSz)

        _CODESECTION

/*+
; -----------------------------------------------
; uint8_t AvrXReadEEProm(uint16_t)
;
; Access to the EEPROM by interrupt routines is
; prohibited.
;
; PASSED:       R25:R24 = Address
; RETURNS:      R24 = data
; USES:         EEPromMutex
; NOTE:         Might block waiting for access to EEPROM
-*/
        _FUNCTION(AvrXReadEEProm)

AvrXReadEEProm:
        mov     p2l, p1l
        mov     p2h, p1h
        ldi     p1h, hi8(EEPromMutex)
        ldi     p1l, lo8(EEPromMutex)
        rcall   AvrXWaitSemaphore       ; craps on Z and tmp0, tmp1
are01:   
        sbic    EECR, EEWE      ; Make sure EEPROM is ready
        rjmp    are01

        out     EEARL, p2l
        out     EEARL+1, p2h    ; For the 8515
        sbi     EECR, EERE      ; Flag a read operation
        in      R0, EEDR
        push    R0
        rcall   AvrXSetSemaphore
        pop     r1l
        ret
        _ENDFUNC

/*+
; -----------------------------------------------
; unsigned AvrXReadEEPromWord(void *)
;
; Access to the EEPROM by interrupt routines is
; prohibited.
;
; PASSED:       p1 = Address
; RETURNS:      r1 = data
; USES:         EEPromMutex
; NOTE:         Might block waiting for access to EEPROM
-*/
        _FUNCTION(AvrXReadEEPromWord)

AvrXReadEEPromWord:
        mov     p2l, p1l
        mov     p2h, p1h
        ldi     p1h, hi8(EEPromMutex)
        ldi     p1l, lo8(EEPromMutex)
        rcall   AvrXWaitSemaphore       ; craps on Z and tmp0, tmp1
arew01:   
        sbic    EECR, EEWE      ; Make sure EEPROM is ready
        rjmp    arew01

        out     EEARL, p2l
        out     EEARL+1, p2h    ; For the 8515
        sbi     EECR, EERE      ; Flag a read operation
        in      R0, EEDR
        push    R0
        subi    p2l, lo8(-1)
        sbci    p2h, hi8(-1)
        out     EEARL, p2l
        out     EEARH, p2h
        sbi     EECR, EERE
        in      R0, EEDR
        push    R0
        rcall   AvrXSetSemaphore
        pop     r1l
        pop     r1h
        ret
        _ENDFUNC

/*+
; -----------------------------------------------
; void AvrXWriteEEProm(uint16_t, uint8_t)
;
; PASSED:       R25:R24 = Address
;               R23 = data
; RETURNS:
; USES:         EEPromMutex
; NOTE:         Might block waiting for access to EEPROM
;
-*/
        _FUNCTION(AvrXWriteEEProm)
        
AvrXWriteEEProm:
        mov     tmp2, p2l         ; Temp save of data
        mov     p2l, p1l
        mov     p2h, p1h
        ldi     p1h, hi8(EEPromMutex)
        ldi     p1l, lo8(EEPromMutex)
        rcall   AvrXWaitSemaphore
awe00:  
        sbic    EECR, EEWE      ; Make sure EEPROM is ready
        rjmp    awe00
        out     EEARL, p2l
        out     EEARL+1, p2h    ; For the 8515
        out     EEDR, tmp2
        sbi     EECR, EEMWE
        sbi     EECR, EEWE

        rjmp    AvrXSetSemaphore; R25:24 preserved in WaitSem
        _ENDFUNC
        _END


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?