AVR rutina k EEPROM
MK
info@mcu.cz
Pátek Únor 17 08:23:29 CET 2006
> nemate niekto poruke ASM rutinu pre obsluhu EEPROM (2402, 2416, ...)
> ATMELom (2313, MEGA16, .....)?
> Alebo link na nejaku konstrukciu s AVR a ext. EEPROM s programom v ASM
> alebo hoci aj *.hex ?
> Googloval som par hodin a nenasiel nic konkretne pouzitelne. Dakujem
> vopred za pomoc.
http://www.avrfreaks.net/index.php?module=FreaksAcademy&func=viewItem&item_id=40&item_type=project
;nastavení pro procedury, které pracují s I2C sbernicí
;.equ I2CDataOPort = PORTB
;.equ I2CDataIPort = PINB
;.equ I2CDirPort = DDRB
;.equ I2CSCL = 0
;.equ I2CSDA = 1
;.equ NoACK = 1
;.equ ACK = 0
.macro Wait
rjmp Wait1
Wait1:
rjmp Wait2
Wait2:
rjmp Wait3
Wait3:
.endmacro
.macro I2CByteWrite
rcall StartBitI2C
ldi temp,@0
rcall TransmitByteI2C
ldi temp,@1
rcall TransmitByteI2C
ldi temp,@2
rcall TransmitByteI2C
rcall StopBitI2C
.endmacro
.macro I2CSetAddress
rcall StartBitI2C
ldi temp,@0
rcall TransmitByteI2C
ldi temp,@1
rcall TransmitByteI2C
rcall StopBitI2C
.endmacro
.macro I2CPageWrite
rcall StartBitI2C
ldi temp,@0
rcall TransmitByteI2C
ldi temp,@1
rcall TransmitByteI2C
ldi temp,@2
rcall TransmitByteI2C
ldi temp,@3
rcall TransmitByteI2C
ldi temp,@4
rcall TransmitByteI2C
ldi temp,@5
rcall TransmitByteI2C
ldi temp,@6
rcall TransmitByteI2C
ldi temp,@7
rcall TransmitByteI2C
ldi temp,@8
rcall TransmitByteI2C
ldi temp,@9
rcall TransmitByteI2C
rcall StopBitI2C
.endmacro
.macro I2CByteRead ;čte z aktuálně nastavené adresy v EEPROM 1 byte a vrací
ho v temp registru
rcall StartBitI2C
ldi temp,@0
rcall TransmitByteI2C
ldi temp,NoACK
rcall ReceiveByteI2C
rcall StopBitI2C
.endmacro
;------------------------------------ Start bit pro I2C
běrnici ---------------------------
StartBitI2C:
;CLK = OUT
sbi I2CDirPort,I2CSCL
;data = OUT
sbi I2CDirPort,I2CSDA
;clk & data = 1
sbi I2CDataOPort,I2CSDA
sbi I2CDataOPort,I2CSCL
Wait
;data = 0
cbi I2CDataOPort,I2CSDA
Wait
;clk = 0
cbi I2CDataOPort,I2CSCL
Wait
ret
;------------------------------------ Stop bit pro I2C
běrnici ---------------------------
StopBitI2C:
;data = OUT
sbi I2CDirPort,I2CSDA
;clk = 1
sbi I2CDataOPort,I2CSCL
Wait
;data = 1
sbi I2CDataOPort,I2CSDA
Wait
ret
;------------------------------------ Vyslání bytu na I2C
běrnici ---------------------------
; parametry: vstup temp registr obsahující vysílaný byte
; výstup temp registr obsahující ACK signál
; využítí registrů: temp + R0
TransmitByteI2C:
;data = OUT
sbi I2CDirPort,I2CSDA
;kopie vysílaného bytu do r0, které se bude rotovat a vysílat
mov r0,temp
ldi temp,8
TransmitByteI2C_Loop:
sbrs r0,7
;data = 0
cbi I2CDataOPort,I2CSDA
sbrc r0,7
;data = 1
sbi I2CDataOPort,I2CSDA
;ostrobování CLK signálem
;clk = 1
sbi I2CDataOPort,I2CSCL
Wait
;clk = 0
cbi I2CDataOPort,I2CSCL
;posun datového registru
lsl r0
dec temp
brne TransmitByteI2C_Loop
Wait
;prectu si Acknowledge signál od SLAVE prvku ACK
;data = IN
cbi I2CDirPort,I2CSDA
;data = 0
cbi I2CDataOPort,I2CSDA
;clk = 1
sbi I2CDataOPort,I2CSCL
;přečtu ACK signál z SDA do tempu a vrátím ho z funkce ven
sbis I2CDataIPort,I2CSDA
ldi temp,0 ;ACK = 0
sbic I2CDataIPort,I2CSDA
ldi temp,1 ;ACK = 1
Wait
;clk = 0
cbi I2CDataOPort,I2CSCL
ret
;------------------------------------ Přijmutí bytu z I2C
běrnice ---------------------------
; parametry: vstup temp registr obsahující vysílaný ACK signál
; výstup příjatý byte
; využítí registrů: temp + R0 + R1
ReceiveByteI2C:
;data = IN
cbi I2CDirPort,I2CSDA
;data = 0
cbi I2CDataOPort,I2CSDA
;kopie vysílaného ACK do r0, které se bude vysílat jako 9 bit
mov r0,temp
ldi temp,8
mov r1,temp
ReceiveByteI2C_Loop:
;ostrobování CLK signálem
;clk = 1
sbi I2CDataOPort,I2CSCL
Wait
;přečtu data, zapíšu do temp registru
lsl temp
;SDA = 0 tak se nic neděje
sbic I2CDataIPort,I2CSDA
;SDA = 1
ori temp,1
;clk = 0
cbi I2CDataOPort,I2CSCL
dec r1
brne ReceiveByteI2C_Loop
Wait
;vyslu ACK signál z r0
;data = OUT
sbi I2CDirPort,I2CSDA
;zapíšu ACK signál z r0
sbrs r0,0
;ACK = 0
;data = 0
cbi I2CDataOPort,I2CSDA
sbrc r0,0
;ACK = 1
;data = 1
sbi I2CDataOPort,I2CSDA
;clk = 1
sbi I2CDataOPort,I2CSCL
Wait
;clk = 0
cbi I2CDataOPort,I2CSCL
ret
S pozdravem
MK
Další informace o konferenci Hw-list