Nuke - Elektro Bastlirna: Diskuzní fórum
Zobrazit předchozí téma :: Zobrazit následující téma
Autor
Zpráva
tmm Neregistrovaný
Zaslal: ne prosinec 07 2008, 17:50 Předmět: PIC 16F628A a externí EEPROM 24C64
Zdravím,
potřeboval bych poradit ohledně komunikace s externí EEPROM pomocí I2C - myslím si, že kód mám správně napsaný, přesto z nějakého důvodu nedochází ke správnému zápisu (resp. žádnému) a se čtením to je podobné
kód:
; Přečte 1 byt a uloží ho do proměnné EBYTE
@i2c_in_byte
CALL @i2c_high_sda
MOVLW 8
MOVWF rot
i2c_in_byte_rot ; Uložíme přichozí bit do C a rotací jej dostaneme do EBYTE - takto zopakujem 8 krát pro celý byte
CALL @i2c_high_scl
BTFSS SDA
GOTO $+3
BSF STATUS,C
GOTO $+2
BCF STATUS,C
CALL @i2c_low_scl
RRF EBYTE,1
DECFSZ rot,1
GOTO i2c_in_byte_rot
RETLW 0
;---------------------------------------------------------
; Odešle 1 byt (proměnná EBYTE)
@i2c_out_byte
MOVLW 8
MOVWF rot
i2c_out_byte_rot ; Rotací EBYTE přes Carry Flag odešleme postupně všechny bity
RRF EBYTE,1
BTFSS STATUS,C
GOTO $+3
CALL @i2c_high_sda
GOTO $+2
CALL @i2c_low_sda
CALL @i2c_high_scl
CALL @i2c_low_scl
DECFSZ rot,1
GOTO i2c_out_byte_rot
CALL @i2c_high_sda
RETLW 0
;---------------------------------------------------------
@i2c_nack
CALL @i2c_high_sda
CALL @i2c_high_scl
CALL @i2c_low_scl
RETLW 0
@i2c_ack
CALL @i2c_low_sda
CALL @i2c_high_scl
CALL @i2c_low_scl
;CALL @i2c_high_sda
RETLW 0
@i2c_start
CALL @i2c_low_scl
CALL @i2c_high_sda
CALL @i2c_high_scl
CALL @i2c_low_sda
CALL @i2c_low_scl
RETLW 0
@i2c_stop
CALL @i2c_low_scl
CALL @i2c_low_sda
CALL @i2c_high_scl
CALL @i2c_high_sda
CALL @i2c_low_scl
RETLW 0
@i2c_high_sda
BSF STATUS,RP0 ; Banka 1
BSF SDADIR ; SDA vstup
BCF STATUS,RP0 ; Banka 0
CALL @delay_50us
RETLW 0
@i2c_low_sda
BCF SDA ; SDA = 0
BSF STATUS,RP0 ; Banka 1
BCF SDADIR ; SDA výstup
BCF STATUS,RP0 ; Banka 0
CALL @delay_50us
RETLW 0
@i2c_high_scl
BSF STATUS,RP0 ; Banka 1
BSF SCLDIR ; SCL vstup
BCF STATUS,RP0 ; Banka 0
CALL @delay_50us
RETLW 0
@i2c_low_scl
BCF SCL ; SCL = 0
BSF STATUS,RP0 ; Banka 1
BCF SCLDIR ; SCL výstup
BCF STATUS,RP0 ; Banka 0
CALL @delay_50us
RETLW 0
@delay_50us
MOVLW 16
MOVWF cd1
DECFSZ cd1,1
GOTO $-1
RETLW 0
Pro zápis pak používám: kód:
CALL @i2c_start
; Device Address
MOVLW B'1010000'
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
; First Word Address
MOVLW H'00'
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
; Second Word Address (EADR adresa pro zápis)
MOVF EADR,W
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
; Data
MOVLW H'88'
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
CALL @i2c_stop
Pro čtení: kód:
CALL @i2c_start
; Device Address
MOVLW B'1010000'
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
; First Word Address
MOVLW H'00'
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
; Second Word Address
MOVF EADR,W
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
CALL @i2c_start
; Device Address
MOVLW B'1010001'
MOVWF EBYTE
CALL @i2c_out_byte
CALL @i2c_nack
CALL @i2c_in_byte
CALL @i2c_stop
Kód mám přepsaný z netu, několikrát jsem to kontroloval a chybu jsem nenašel. Můžete někdo poradit?
Návrat nahoru
Atlan Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: ne prosinec 07 2008, 22:48 Předmět:
;************************************i2c komunikacia******************
I2Cstart
bsf sda ;ini dAta v W registre
bsf scl
call outsda ;sda je nastavene na vystup
call cek10
bcf sda ;start
call cek10
bcf scl ;ukoncena start sekvencia
return
i2cW
movwf pom
call outsda ;sda je nastavene na vystup
movlw 8
movwf cykl
cyklusI2C
call cek10
bcf scl
call cek10
bcf sda
call cek10
rlf pom,1
btfsc STATUS,C
bsf sda
call cek10
bsf scl
decfsz cykl,1
goto cyklusI2C
acks
call cek10
bcf scl ;acklovage
call insda ;sda je nastavene na vstup
call cek10
bsf scl
btfsc sda ;TEST ci bol prikaz potvrdeny...
goto $-1
call cek10
bcf scl
return
;-----------------------------------------------------------
i2cR
call insda ;sda je nastavene na vstup
movlw 8
movwf cykl
call cek10
bsf scl
btfsc sda
incf dat,1
bcf STATUS,C
rlf dat,1
call cek10
bcf scl
decfsz cykl,1
goto $-9
rrf dat,1 ;oprava prevodu
movf dat,0
movwf dati2c
clrf dat
return
ackm
call outsda ;sda je nastavene na vystup
bcf sda
call cek10
bsf scl
call cek10
bcf scl
call cek10
call insda ;sda je nastavene na vstup
bsf sda
call cek10
return
I2Cstop
call cek10
call outsda ;sda je nastavene na vystup
bcf sda ;ukoncena stop sekvencia
call cek10
bsf scl ;stop
call cek10
bsf sda ;ukoncena stop sekvencia
call insda ;sda je nastavene na vstup
call cek10
return
;********************************************************
insda
bsf STATUS,RP0 ; banka registru 1
bsf TRISA,3 ;sda je nastavene na vstup
bcf STATUS,RP0 ; banka registru 0
return
outsda
bsf STATUS,RP0 ; banka registru 1
bcf TRISA,3 ;sda je nastavene na vystup
bcf STATUS,RP0 ; banka registru 0
return
;************************ LCD ***************************
;----------------------------------------- zapis do eprom -----------
epromw
call I2Cstart
movlw b'10100010' ;ide o zapis do 24c64; adresa 24c64
call i2cW
;-----------------------------------------
movfw adresah ; adresa high
call i2cW
movfw adresal ; adresa low
call i2cW
movfw dati2c
call i2cW
call I2Cstop
call cek15m
return
;******************************************************************
epromk call I2Cstart
movlw b'10100010' ;ide o zapis do 24c64; adresa 24c64
call i2cW
movfw adresah ; adresa high
call i2cW
movfw adresal ; adresa low
call i2cW
call I2Cstart
movlw b'10100011' ;ide o citanie z 24c64; adresa 24c64
call i2cW
;-----------------------
call i2cR
return
Návrat nahoru
Atlan Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: ne prosinec 07 2008, 22:59 Předmět:
Akosi tam nevidim kde testujes ACK od slave ?????
Návrat nahoru
tmm Neregistrovaný
Zaslal: út prosinec 09 2008, 11:32 Předmět:
Jak dlouho trvá prosimtě ten cyklus cek10 ?
Ještě bych rád veděl, jaký jestli je nějaký speciální důvod nastavovat po stop sekvenci SDA jako vstup ...
Zkoušel jsem ten tvůj kód, ale pořád nvm, kde dělám chybu - můžeš mi to prosímtě zkontrolovat? Zacyklím se při čekání na ACK od EEPROMky ...
kód:
@i2c_start
BSF STATUS,RP0
BCF SDADIR ; SDA výstup
BCF STATUS,RP0
BSF SDA
BSF SCL
GOTO $+1
GOTO $+1
GOTO $+1
BCF SDA
GOTO $+1
GOTO $+1
GOTO $+1
BCF SCL
RETLW 0
kód: @i2c_write
MOVWF EBYTE ; Data k zaslani do W
MOVLW 8
MOVWF rot ; Pocet bitu k zaslani
i2c_write_rot
RLF EBYTE,1
BCF SCL
BTFSS STATUS,C
GOTO $+3
BSF SDA
GOTO $+2
BCF SDA
NOP
BSF SCL
NOP
DECFSZ rot,1
GOTO i2c_write_rot
CALL @i2c_ack
RETLW 0
kód: @i2c_ack
BCF SCL
BSF STATUS,RP0
BSF SDADIR ; SDA vstup
BCF STATUS,RP0
GOTO $+1
BSF SCL
GOTO $+1
GOTO $+1
NOP
BTFSC SDA
GOTO $-1
NOP
BCF SCL
BSF STATUS,RP0
BCF SDADIR ; SDA výstup
BCF STATUS,RP0
RETLW 0
Návrat nahoru
Atlan Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: st prosinec 10 2008, 16:24 Předmět:
@i2c_write
MOVWF EBYTE ; Data k zaslani do W
MOVLW 8
MOVWF rot ; Pocet bitu k zaslani
i2c_write_rot
RLF EBYTE,1
BTFSS STATUS,C
GOTO $+3
BSF SDA
GOTO $+2
BCF SDA
BSF SCL
call wait 10 ;caa 10mikros
BCF SCL
call wait 10
NOP
DECFSZ rot,1
GOTO i2c_write_rot
CALL @i2c_ack
RETLW 0
@i2c_ack
; BCF SCL
BSF STATUS,RP0
BSF SDADIR ; SDA vstup
BCF STATUS,RP0
GOTO $+1
BSF SCL
GOTO $+1
GOTO $+1
NOP
BTFSC SDA
GOTO $-1
NOP
BCF SCL
call wait 10
BSF STATUS,RP0
BCF SDADIR ; SDA výstup
BCF STATUS,RP0
RETLW 0
cek10 alebo 10mikros ;zavisi od rychlosti komunikacie eprom 100/300khz Dost dolezite...lebo ti nebude eprom stihat reagovat ked to budes ladovat 1MHz (4Mhz taktovany)
Po stope sda na vstup ..nieje ziadny dovod ja len aby nejakym skratom a tak neodpalil....
Este takato vec.... najprv prednastav porty na log1 a az potom ich zadefinuj ako i/o....... tj najprv bsf portA,0 a az potom bsf alebo bcf TRISA,0.
Lebo pri zapniti pic su i/o v vysokej impedancii.... aby si nahodou nespustil starrt impulz ani nevieš ako ....
P.S. dufam ze mas Pullup odpory na sda priapdne scl.... hlavne ked to mas na RA4.
Naposledy upravil Atlan dne čt prosinec 11 2008, 16:47, celkově upraveno 2 krát.
Návrat nahoru
vilem Založen: Dec 11, 2008 Příspěvky: 13
Zaslal: čt prosinec 11 2008, 16:39 Předmět:
Dobrý den
dal by se tento postup(program) použít i pro paměti EEPROM 24C1024 ??
Děkuji.
Návrat nahoru
Mendor Založen: Apr 16, 2008 Příspěvky: 223 Bydliště: Kladno
Zaslal: čt prosinec 11 2008, 16:54 Předmět:
Zde je popsán princip komunikace I2C mezi MCU a EEPROM, ten nesouvisí s velikostí paměti.
Návrat nahoru
tmm Neregistrovaný
Zaslal: čt prosinec 11 2008, 22:17 Předmět:
Atlan: Díky moc, už to pracuje jak má Chyba byla hlavně zde:
Chyběla ještě jedna nula na konci :O
Odpory byly všude správně, kontrolovali sme to osciloskopem
Ještě jednou dík
Doladím kód a pak to sem celý hodím pro ostatní zájemce
Návrat nahoru
Atlan Založen: May 10, 2004 Příspěvky: 4513 Bydliště: Košice
Zaslal: čt prosinec 11 2008, 22:37 Předmět:
no ..stava sa ..... trivialnost isa nekontroluju co uz ... hlavne ze to beha
Návrat nahoru
vilem Založen: Dec 11, 2008 Příspěvky: 13
Zaslal: út leden 20 2009, 9:57 Předmět:
tmm napsal(a): Atlan: Díky moc, už to pracuje jak má Chyba byla hlavně zde:
Chyběla ještě jedna nula na konci :O
Odpory byly všude správně, kontrolovali sme to osciloskopem
Ještě jednou dík
Doladím kód a pak to sem celý hodím pro ostatní zájemce
Ahoj mohl by jsi sem dát nebo mi poslat zdrojak na to I2C,neboť taky řeším podobný problém s pamětmi a nevím si s tím moc rady. Díky
Návrat nahoru
tmm Neregistrovaný
Návrat nahoru
Nemůžete odesílat nové téma do tohoto fóra.Nemůžete odpovídat na témata v tomto fóru.Nemůžete upravovat své příspěvky v tomto fóru.Nemůžete mazat své příspěvky v tomto fóru.Nemůžete hlasovat v tomto fóru.Nemůžete připojovat soubory k příspěvkůmMůžete stahovat a prohlížet přiložené soubory
Powered by phpBB © 2001, 2005 phpBB Group
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB. Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the . PHP-Nuke comes with absolutely no warranty, for details, see the . Čas potřebný ke zpracování stránky 0.17 sekund