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