Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

PIC 16F628A a externí EEPROM 24C64

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
tmm
Neregistrovaný





PříspěvekZaslal: ne prosinec 07 2008, 17:50    Předmět: PIC 16F628A a externí EEPROM 24C64 Citovat

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é Sad

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

PříspěvekZaslal: ne prosinec 07 2008, 22:48    Předmět: Citovat

;************************************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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Atlan



Založen: May 10, 2004
Příspěvky: 4513
Bydliště: Košice

PříspěvekZaslal: ne prosinec 07 2008, 22:59    Předmět: Citovat

Akosi tam nevidim kde testujes ACK od slave ?????
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tmm
Neregistrovaný





PříspěvekZaslal: út prosinec 09 2008, 11:32    Předmět: Citovat

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

PříspěvekZaslal: st prosinec 10 2008, 16:24    Předmět: Citovat

@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 ....Smile

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
vilem



Založen: Dec 11, 2008
Příspěvky: 13

PříspěvekZaslal: čt prosinec 11 2008, 16:39    Předmět: Citovat

Dobrý den

dal by se tento postup(program) použít i pro paměti EEPROM 24C1024 ??

Děkuji.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mendor



Založen: Apr 16, 2008
Příspěvky: 223
Bydliště: Kladno

PříspěvekZaslal: čt prosinec 11 2008, 16:54    Předmět: Citovat

Zde je popsán princip komunikace I2C mezi MCU a EEPROM, ten nesouvisí s velikostí paměti.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
tmm
Neregistrovaný





PříspěvekZaslal: čt prosinec 11 2008, 22:17    Předmět: Citovat

Atlan: Díky moc, už to pracuje jak má Smile Chyba byla hlavně zde:
kód:
MOVLW   B'1010000'
Chyběla ještě jedna nula na konci :O

Odpory byly všude správně, kontrolovali sme to osciloskopem

Ještě jednou dík Smile

Doladím kód a pak to sem celý hodím pro ostatní zájemce Smile
Návrat nahoru
Atlan



Založen: May 10, 2004
Příspěvky: 4513
Bydliště: Košice

PříspěvekZaslal: čt prosinec 11 2008, 22:37    Předmět: Citovat

no ..stava sa .....Smile trivialnost isa nekontroluju co uz ...Smile hlavne ze to beha Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
vilem



Založen: Dec 11, 2008
Příspěvky: 13

PříspěvekZaslal: út leden 20 2009, 9:57    Předmět: Citovat

tmm napsal(a):
Atlan: Díky moc, už to pracuje jak má Smile Chyba byla hlavně zde:
kód:
MOVLW   B'1010000'
Chyběla ještě jedna nula na konci :O

Odpory byly všude správně, kontrolovali sme to osciloskopem

Ještě jednou dík Smile

Doladím kód a pak to sem celý hodím pro ostatní zájemce Smile


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
Zobrazit informace o autorovi Odeslat soukromou zprávu
tmm
Neregistrovaný





PříspěvekZaslal: so únor 21 2009, 16:14    Předmět: Citovat

Tady sem ti vytáhnul svůj kód - není dokonalý, hlavně co se týče časování, určitě by to šlo zrychlit - ale nechce se mi s tím už drbat Wink


i2c.txt
 Komentář:

Stáhnout
 Soubor:  i2c.txt
 Velikost:  5.82 kB
 Staženo:  210 krát

Návrat nahoru
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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ům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.18 sekund