Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

RATUJCIE!!! Mam problem z komunikacją z pamięcią eeprom IIC

arthhur 10 Maj 2005 20:39 1373 13
  • #1 10 Maj 2005 20:39
    arthhur
    Poziom 10  

    Od dłuższego czasu podejmuję (bez powodzenia) próby komunikacji z pamięcią eeprom IIC 24c64. Dostaję ack, wszystko na pozór wydaje się być OK, ale gdy chcę odczytać to, co zapisałem, odczytuję tylko FF. Czy jest coś, o czym powinienem wiedzieć? A może ma ktoś jakiś sprawny program w assemblerze do komunikacji z eeprom-em? Czekam na Waszą pomoc. Pozdrawiam.

  • #2 10 Maj 2005 20:47
    Elektrooonik
    Poziom 29  

    Na jaki procek?

  • #3 10 Maj 2005 21:21
    LordBlick
    VIP Zasłużony dla elektroda

    A bit R/W ustawiany prawidłowo ? Czas zapisu zawartości uwzględniony ? Nota katalogowa przeczytana ? ;)

  • #4 10 Maj 2005 21:43
    GienekS
    Poziom 32  

    arthhur napisał:
    Dostaję ack, wszystko na pozór wydaje się być OK,

    Które ACK ?? Podaj co wysyłasz do pamięci, adresy, dane.

  • #6 11 Maj 2005 08:41
    arturt134
    Poziom 26  

    Przed odczytem musisz sprawdzać, czy pamięć nie jest zajęta (zapisem) robisz to?

  • #7 11 Maj 2005 11:34
    muminek
    Poziom 16  

    Powinienes wiedziec o czasach. Zapis komorki do panieci to 10ms, zas odczyt nastepuje szybciej. Przy odczycie dostajesz same FF bo nic nie zapisales.

  • #8 11 Maj 2005 11:39
    elektryk
    Poziom 42  

    Sprawdź pamięć w zewnętrznym programatorze, spradź czy działa i spróbuj wpisać jakieś wartości pod znany adres a potem je odczytać.

  • #9 11 Maj 2005 22:05
    arthhur
    Poziom 10  

    Wysyłam do pamięci wszystko, co trzeba. adres, subadres, adres komórki, do której zapisuję.... Uwzględniam też czasy. Czekam dużo dłużej, niż jest to wymagane. Noty katalogowe bardzo uważnie po kilka ray przeglądałem. Chyba najlepszym sposobem ratunku byłoby udostępnienie jakiegoś prostego programu w assemblerze. Dziękuję za zainteresowanie.

  • #10 11 Maj 2005 22:15
    zumek
    Poziom 39  

    arthhur napisał:

    ..//. Chyba najlepszym sposobem ratunku byłoby udostępnienie jakiegoś prostego programu w assemblerze. Dziękuję za zainteresowanie.

    To może pokaż swój :?:

    Piotrek

  • #11 12 Maj 2005 07:44
    arturt134
    Poziom 26  

    Zostaje jeszcze analiza z oscyloskopem.
    Aha, po włączeniu zasilania obie linie SDA i SCL powinny być w stanie wysokim (nikt ich nie używa, więc działa podciągnięcie).
    Zdarzyłe mi się już układy, które po włączeniu miały SDA w stanie niskim.
    Trzeba wtedy pomachać SCL i wysłać STOP. Tak trzeba robić aż układ "się odwiesi".

  • Pomocny post
    #12 12 Maj 2005 10:20
    muminek
    Poziom 16  

    Nie pamietam z kad sciagnalem kod zrodlowy po przerobieniu dla swoich potrzeb program 100% dziala.

    ;**********************************************************
    ; I2C zapis i odczyt do EPROM 24C02
    ;
    ;**********************************************************
    $NOMOD51
    $INCLUDE(REG517.INC)
    SDA EQU P4.7 ;LINIA DANYCh
    SCL EQU P4.6 ;LINIA ZEGAROWA
    ;************************************************************
    LJMP START
    ORG 2000H

    START:
    MOV R0,#53 ;00110101B 53D 35H DANA DO R0
    ACALL WRITE
    ACALL DEALY3 ;OPOZNIENIE DUUGIE POTRZEBNE ABY ZROBIC COS JESZCZE
    MOV R0,#0AAH ;10101010B 252D AAH NISZCZY R0
    ACALL READ
    MOV P5,R0 ;powinno znowu byc 00110101B
    AJMP $


    READ: ;PROGRAM ODCZYTUJACY ZAWARTOSC PAMIECI
    ;O ADRESIE 174 I ADRESIE KOMORKI = 4
    ACALL I2C_START ;ROZPOCZECIE TRANSMISJI
    MOV A,#174 ;ADRES UKLADU SLAVE (PATRZ APLIKACJA DANEGO UKLADU)
    ACALL I2C_WRITE ;WYSLIJ ADRES NA MAGISTRALE
    MOV A,#4 ;4ka TO ADRES KOMORKI Z JAKIEJ NASTAPI ODCZYT
    ACALL I2C_WRITE ;... WYSLIJ INFORMACJE NA MAGISTRALE
    ACALL I2C_START ;PONOWNE ROZPOCZECIE TRANSMISJI
    MOV A,#175 ;ADRES PAMIECI DO ODCZYTU
    ACALL I2C_WRITE ;TU WIADOMO O CO CHODZI...
    SETB C ;BEZ NACK
    ACALL I2C_READ ;WEZWIJ PODPROGRAM ODCZYTUJACY DANE Z MAGISTRALI I
    MOV R0,A ;PRZEPISZ JE DO ZMEINNEJ XXX
    ACALL I2C_STOP ;TO TYLE- ZAKONCZ TRANSMISJE...

    ;**********************************************
    WRITE: ;TUTAJ MAMY ZAPIS DO OW KOMURKI
    ACALL I2C_START ;TRANSMISJA ROZPOCZETA
    MOV A,#0AEH ;ADRES SLAVE AEH
    ACALL I2C_WRITE ;WYSLIJ INFORMACJE NA MAGISTRALE
    MOV A,#4 ;ADRES KOMORKI PAMIECI DO ZAPISU
    ACALL I2C_WRITE
    MOV A,R0 ;POBIERZ DANE DO ZAPISU W EEPROMIE
    ACALL I2C_WRITE ; I WYSLIJ JA NA MAGISTRALE
    ACALL I2C_STOP

    ;*********************************************************
    I2C_READ: ;ZAPISUJE DO ACC WARTOSC Z ODEBRANA Z I2C.
    ;Z CY WYSYLANA JEST WIADOMOSC O ACK I NACK
    CLR SCL ;TAK PROFILAKTYCZNIE...
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV R4,#8 ;BO ODBIERZEMY OSIEM BITOW
    I2R:
    RLC A ;PRZESUN FLAGE
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;IMPULS SCL I ZDJECIE BITU Z I2C TUZ PRZED OPADNIECIEM
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV C, SDA ;
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;
    DJNZ R4, I2R ;JESLI ODEBRANO 8 BITOW, TO WYSLIJ ACK
    RLC A ;PRZEWIN FLAGE NA SWOJE MIEJSCE
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV SDA,C ;WYSTAW FLAGE NA LINIE SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;\
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;/
    RET
    ;****************************************************************************
    I2C_WRITE: ;ZAPISUJE NA I2C ZAWARTOSC ACC. ODDAJE ACK W CY




    CLR SCL ;SKASUJ SCL- BO NASTAPI WYSTAWIENIE BITU NA SDA
    MOV R4,#8 ;BO OSIEM BITOW DO WYSLANIA
    ACALL I2C_TAKT ;OPOZNIENIE
    I2W: RLC A ;"WYSTAWIENIE" KOLEJNEGO BITU
    MOV SDA,C ;USTAW LINIE SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;\
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;/
    ACALL I2C_TAKT ;OPOZNIENIE
    DJNZ R4,I2W ;JESLI WYSLANO 8 BITOW, TO ODBIERZ ACK
    SETB SDA ;PO ZAKANCZENIU TANSMISJI USTAW 1 NA SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;WYSTAWIENIE IMPULSU ACK
    ACALL I2C_TAKT ;OPOZNIENIE
    MOV C,SDA ;PRZEPISANIE IMPULSU ACK DO CY->
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL ;CY=0 TO SLAVE ODPOWIEDZIAŁ
    ACALL I2C_TAKT ;OPOZNIENIE
    RET ;CY=1 TO SLAVE NIE ODPOWIEDZIAŁ
    ;***********************************************************************
    I2C_START:
    SETB SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;PRZY USTAWIONYM SCL WYZRUJ LINIE SDA->
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SDA ;UWAGA! PROGRAM NIE KASUJE BITU SCL
    ACALL I2C_TAKT ;OPOZNIENIE
    CLR SCL
    RET
    ;************************************************************************
    I2C_STOP:
    CLR SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SCL ;PRZY USTAWIONYM SCL USTAW LINIE SDA->
    ACALL I2C_TAKT ;OPOZNIENIE
    SETB SDA
    ACALL I2C_TAKT ;OPOZNIENIE
    RET
    ;*************************************************************************
    I2C_TAKT: ;ZWLOKA CZASOWA POMIEDZY KOLENYMI CYKLAMI ODCZYTU BITU
    NOP ; DLUGOSCI JEGO CYKLU ZEGAROWEGO
    NOP ;(WIECEJ INFORMACJI W PDFie UKLADU)
    NOP
    NOP
    NOP
    NOP
    RET
    ;**************************************************************************
    DEALY3: ;OPOZNIENIE DUUGIE POTRZEBNE DO UTRWALENIA
    MOV R4,#046D ;DANTCH W EPROM NIN 10us DLA PEWNOSCI WIECEJ
    DEAL3:
    MOV R3,#0FFh
    DJNZ R3,$
    DJNZ R4,DEAL3
    RET
    END

    Dodano po 3 [minuty]:

    Zastosowany kwarc to 18,432 procek 80c517A

  • #13 12 Maj 2005 22:43
    arthhur
    Poziom 10  

    Ja używam procka AT89C4051, w związku z czym linię scl muszę taktować ,,ręcznie”. A to jest mój program:



    .device AT89C4051, Polski

    .cseg 0000h

    RS: .equ p3.3
    RW: .equ p3.2
    e: .equ p3.7
    scl: .equ p3.1
    sda: .equ p3.4




    clr rs ;
    clr rw ;
    clr e ;
    mov p1,#00111000b ;inicjalizacja wyświetlacza
    lcall imp ;
    mov p1,#00001100b ;
    lcall imp ;
    setb rs ;
    clr 0 ;



    main:
    mov a, #10100000b
    lcall zapis
    mov a,#0 ;pierwszy bit adresowy
    lcall zapis
    mov a, #0 ;drugi bit adresowy
    lcall zapis
    mov a,#42h ;
    lcall zapis ;
    mov a,#43h ;
    lcall zapis ;;
    mov a,#44h ;
    lcall zapis ;
    mov a,#45h ;
    lcall zapis ;
    mov a,#46h ;
    lcall zapis ; ,,zapisywane dane"
    mov a,#47h ;
    lcall zapis ;
    mov a,#48h ;
    lcall zapis ;
    mov a,#49h ;
    lcall zapis ;
    mov p1,#41h ;
    lcall imp
    lcall stop
    czekaj:
    djnz 70, czekaj
    djnz 71,czekaj
    clr 0
    mov a, #10100000b
    lcall zapis
    mov a,#0
    lcall zapis
    mov a, #0
    lcall zapis
    clr 0
    mov a, #10100001b
    lcall zapis
    mov 48, #16 ;ilość odczytanych komórek
    chciałbym:
    lcall odczyt
    mov p1,acc ;(p1 to port komunikacji z wyświetlaczem)
    lcall imp
    djnz 48, chciałbym
    mov p1,#41h
    lcall imp
    lcall stop
    sjmp $

    zapis:

    jb 0, pomiń_start
    setb 0
    clr sda
    lcall wait
    clr scl
    pomiń_start:
    mov 50,#8
    clr scl
    again:
    rlc a
    mov sda,c
    lcall sccl
    djnz 50, again
    setb sda
    lcall wait
    setb scl
    lcall wait
    jb sda, error
    ret
    error:
    mov p1,#45h ;wyświetlany znak, gdyby nie było ack
    lcall imp
    ret


    stop:
    clr scl
    lcall wait
    clr sda
    lcall wait
    setb scl
    lcall wait
    setb sda
    ret


    odczyt:
    setb sda
    mov 50,#9
    cykl:
    rlc a
    lcall sscl
    mov c, sda
    djnz 50, cykl
    clr sda
    lcall sscl
    ret








    sscl:
    clr scl
    lcall wait
    setb scl
    lcall wait
    ret



    sccl:
    setb scl
    lcall wait
    clr scl
    lcall wait
    ret



    wait:
    nop
    nop
    nop
    nop
    nop
    ret



    imp:
    setb e
    djnz 70, imp
    djnz 71, imp ;impuls e na wyświetlacz
    clr e
    ret


    Jest to najnowsza wersja (niedziałająca). Jeszcze nie testowałem programu przesłanego przez uczestnika forum. zrobię to jutro, po czym obiecuję zdać relacje :) Dziękuję za pomoc :)

  • #14 13 Maj 2005 17:33
    arthhur
    Poziom 10  

    DZIALA!!! Wielkie dzieki. No to chyba sprawe mozna uznac za zamkinieta. Az sam w to nie wierze. Jeszcze raz dzieki!!!!! : )

TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo