AT89S52 a nejaka externi EEPROM ???
Moderátor: Moderátoři
AT89S52 a nejaka externi EEPROM ???
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
obsahuje popis rutin pre komunikaciu mcu x51 s pamatou 24Cxx
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
alvr píše:kdy to tady das?
Mám to v druhý mašině.
Řešení je hromada, jenom každej programátor má svůj styl a občas jeden druhýho nechápe
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Kód: Vybrat vše
;=====================================================================
;
; Cteni probiha od adresy E_adresa porad dopredu
; Zapis je jen v ramci poslednich 3 bitu stranky
Zapis_8b:
;********
mov E_wradr,a ;kam to patri do EEPROM
mov E_wram,#Buf_eepr ;pozice bufferu
clr w1_byte
call E_write ;zapise jen 8 byte
ret
Nacti_8b: ; v aku je odkud
;*********
mov E_adresa,a ;adresa v eeprom
mov E_pkrok,#8d
mov E_ram,#Buf_eepr ;kam nacist
clr w1_byte
call E_read
ret
;************************************
;******** EEPROM *********
;************************************
; NOVA ZKRACENA PROCEDURA
; =======================
;
;*********************
;*** INIT I2C
;*********************
Clear_i2c:
clr scl
clr Stav
nop
nop
setb sda
mov r1,#32d ;max pocet chyb init eeprom
mov r0,#9
Cl_1:
nop
nop
setb scl
nop
nop
mov c,sda
jc Cl_2
mov r0,#9 ;prisel nulovy bit,musim znovu
;KONTROLA CHYB
;=============
dec r1
mov a,r1
jnz Cl_2
setb Stav
ret ;chyba init eeprom
Cl_2:
nop
nop
clr scl
nop
nop
djnz r0,Cl_1
nop
nop
;sda = 1 = vstupni
;scl = 0 = ready
call Start_bit
ret
E_read:
;******
clr Wr_och
call E_rea2
ret
E_write:
;*******
clr Wr_och
call E_wri2
ret
;======*************************==================
;======PODPROGRAMY - START + STOP + ACK ...=======
;======*************************==================
Start_bit:
;*********
setb sda ;toto se predpoklada
nop
nop
setb scl
nop
nop
nop
clr sda
nop
nop
nop
clr scl
nop
nop
setb sda
;KONECNY STAV
;============
;clr = 0
;sda = 1
ret
Sd_DWA:
;********
mov r0,#8 ;8 cyklu
Sen_1:
rlc a
mov sda,c
nop
nop
setb scl
nop
nop
nop
clr scl
nop
djnz r0,Sen_1
setb sda
ret
Test_ack:
;*******
setb sda ;ACK
nop
nop
setb scl
nop
nop
mov c,sda
nop
nop
clr scl
nop
nop
mov Stav,c
ret
Posli_ack:
;*********
clr sda ;ACK
nop
nop
setb scl
nop
nop
nop
clr scl
nop
nop
setb sda
nop
ret
Stop_bit:
;********
nop
clr sda ;STOP bit
nop
nop
setb scl
nop
nop
nop
setb sda
nop
nop
clr scl
nop
nop
setb sda
nop
nop
ret
;******************************************
;*** CTENI EEPROM ***
;******************************************
E_rea2:
;posle start + device adress
;Stav ... 0 = OK , 1= ERROR
clr scl
nop
nop
setb sda
clr Stav
;*********
;START BIT
call Start_bit ;1
;***********************
;DEVICE ADRESS
mov a,#10100000b ;1010+adresa+R/W bit
; 0 = dummy write
call Sd_DWA ;2 device adr
call Test_ack ;3 test ACK
jnb Stav,Sen_1aa
ret ;neprislo ACK
Sen_1aa:
setb sda ;jako vstupni
;*********************
;WORD ADRESS
mov a,E_adresa
mov r0,#8
call Sd_DWA ;4
call Test_ack ;5
;***********************************
;TED ZNOVU START BIT + DEVICE ADRESS
call Start_bit ;6
mov a,#10100001b ;1010+adresa+R/W bit
mov r0,#8 ;8 cyklu
call Sd_DWA ;7
call Test_ack ;8
jnb Stav,Sen_1bb
ret ;neprislo ACK
Sen_1bb:
;****************
;****** cteni dat
;****************
mov r2,E_pkrok ;pocet kroku
mov r1,E_ram ;kam nacist
jnb w1_byte,Sr_1st ;neni to jen 1 byte jako adr apod. ?
mov r2,#1
mov r0,#8 ;1 krok, 1 byte
;adresa MUSI byt zadana !!!!
Sr_1st:
mov r0,#8
Sr_1:
setb scl
nop
nop
mov c,sda
rlc a ;ulozim do aku,LSB se posila jako posl.
clr scl
nop
nop
djnz r0,Sr_1
nop
nop
mov b,a
;***********************************************
;OCHRANA PAMETI ZASOBNIKU, JEN PRO TUTO APLIKACI
mov a,r1
clr c
cjne a,#ZASOBNIK,Och_1
Och_1:
jc Och_OK
setb Wr_och
setb Stav
ret
Och_OK:
mov a,b
mov @r1,a ;ted to ulozim na adresu r1
inc r1
nop
nop
djnz r2,Sr_3
jmp Sr_10
Sr_3:
call Posli_ack
jmp Sr_1st
Sr_10: ;NO ACK + STOP
setb sda
nop
nop
setb scl
nop
nop
nop
clr scl
nop
nop
setb sda
call Stop_bit ;9
clr Stav ;proslo to....
clr w1_byte
ret
;******************************************
;*** ZAPIS DO EEPROM ***
;******************************************
E_wri2:
;Stav ... 0 = OK , 1= ERROR (no ACK)
clr scl
nop
nop ;pro jistotu
setb sda
clr Stav
call Start_bit ;11
mov a,#10100000b ;1010+adresa+R/W bit
mov r0,#8 ;8 cyklu
call Sd_DWA ;12
call Test_ack ;13
jnb Stav,Wer_1a
ret ;konec zapisu,chyba !!!
Wer_1a:
;*********************
;WORD ADRESS
mov r0,#8
mov a,E_wradr ;adresa pro 24C02 ma 8 bitu
call Sd_DWA ;14
call Test_ack ;15
jnb Stav,Wen_y
ret ;neprislo ACK
Wen_y:
mov r1,E_wram
mov r2,#8 ;8 bytu na stranku
jnb w1_byte,Wer_5
mov r2,#1 ;jen 1 byte
Wer_5:
mov r0,#8
mov a,@r1
Wer_1: ;TOTO JE ZAPIS VEN !!!
rlc a ;NEPLEST S CTENIM !!!!
mov sda,c
nop
nop
setb scl ;VEN
nop
nop
nop
clr scl
nop
djnz r0,Wer_1
nop
nop
;------------------
;zapsal jsem 8 bitu
;------------------
call Test_ack ;16 ack
jnb Stav,Wer_2
setb Stav ;neodpovedel ACK
ret ;konec zapisu,chyba !!!
Wer_2:
nop
nop
inc r1
djnz r2,Wer_5
Wer_10:
;STOP
;*****
call Stop_bit ;17
clr w1_byte
call Wait_10ms
call Wait_10ms
ret
;=================================
;===== KONEC AKCE EEPROM =======
;=================================
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Stav - bit, 0=OK, 1= nějaká chyba při zápisu/čtení
w1_byte - bit, 0= čte/zapisuje celou stránku, 1= čte jen 1 byte
Zápis:
E_wram - adresa bufferu EEPROM v RAM paměti ATMEL
E_wradr - adresa v paměti EEPROM
Čtení:
E_adresa - adresa v EEPROM
E_pkrok - kolik bytů číst
E_ram - na jakou pozici v RAM Atmelu
Procedury:
Zapis_8b - zápis stránky EEPROM
Nacti_8b - čtení stránky EEPROM
Clear_i2c - inicializace EEPROM / I2C
nebo přímo
E_read
E_write
Potřebné podprogramy:
Wait_10ms - čekací smyčka 10ms
Pokud zapisuješ celou stránku, musí být poslední 3 bity v adrese nula (adresa dělitelná osmi).
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]
- ZdenekHQ
- Významný člen
- Příspěvky: 25519
- Registrován: 21 črc 2006, 00:00
- Bydliště: skoro Brno
- Kontaktovat uživatele:
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?]