logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c] Dlaczego 24C64 EEPROM pozwala na zapis do adresu 0xFFFF?

hessuss 20 Lis 2009 15:38 1455 5
REKLAMA
  • #1 7285850
    hessuss
    Poziom 13  
    Posty: 159
    Ocena: 14
    Witajcie.
    Nie bardzo wiedziałem jak zatytułować ten post.

    W moim projekcie przyszedł czas na zewnętrzną pamięć nieulotną, wybór padł na 24c64, taki był w sklepie i taki kupiłem a poza tym masa faq do tego jest w necie.
    Obsługę kostki wziąłem z tąd : radzio.dxp.pl
    Wszystko pomyślnie tylko albo ja czegoś nie rozumiem albo coś z tą kostką jest nie tak.

    W datasheet piszą że 24c64 to 64 KILOBITY pamięci czyli 8192 BAJTY – dobrze liczę? Oczywiście, że dobrze.
    Więc skoro ta kostka ma 8 kilo ramu to ostatnia komórka pamięci powinna mieć adres 0x2000, tak?
    No chyba tak.
    No to dlaczego mogę ją zapisać aż do adresu 0xffff ?
    Najpierw zrobiłem tak:
    Pod adresy 0d 0x0001 do 0x0008 wpisałem sobie po kolei bajt po bajcie literki
    
    			eepromwrite(0x00,0x01, 'a');
    			eepromwrite(0x00,0x02, 'b');
    			eepromwrite(0x00,0x03, 'c');
    			eepromwrite(0x00,0x04, 'd');
    			eepromwrite(0x00,0x05, 'e');
    			eepromwrite(0x00,0x06, 'f');
    			eepromwrite(0x00,0x07, 'g');
    			eepromwrite(0x00,0x08, 'h');
    

    używając
    
    void eepromwrite(char S_BYTE_ADDR, char M_BYTE_ADDR, char DATA) // starszy byte adresu, młodszy byte adresu, dana
    {
    twistart();
    twiwrite(0xAE);
    twiwrite(S_BYTE_ADDR);
    twiwrite(M_BYTE_ADDR);
    twiwrite(DATA);
    twistop();
    }
    

    Wywaliłem z kodu deley’e żeby tu nie wyciągać za bardzo postu.

    Potem powtórzyłem zapis pod adresy 0x2001-0x2008 i pod 0x21f8-0x21ff oraz pod 0xfff8-0xffff w każdym przypadku używając innych ośmiu liter żeby nie powtarzać nigdzie zapisanych literek.

    Potem trzasnąłem pętelkę która wyświetla mi na ekraniku adres komórki pamięci począwszy od 0x0000 a skończywszy na 0xffff i obok wartość jaka jest zapisana w tej komórce i co mnie zdziwiło to wszystko działa.

    
    unsigned int sb, mb;
    unsigned int tmp; 
    unsigned char komunikat1[8] = "        ";
    
    			for (sb=0x00;sb<=0xff;sb++) // sb- starszy bajt adresu - mb - młodszy bajt adresu
    			{
             //tu zamieniam bajty na literki w ASCII żebym widział je ładnie na wyświetlaczu 
             // zmienna komunikat1 ma postać [0]-[3] cztery znaki na adres 
             // [4] jeden znak odstepu 9spacja0
             // [5] literka z eepromu
               tmp = Bcd2dec(sb>>4)+0x30;
    				if (tmp > 0x39)
    				{
    					tmp = tmp + 0x27;
    				}
    				komunikat1[0] = tmp;
    				
    				tmp = Bcd2dec(sb&0x0f)+0x30;
    				if (tmp > 0x39)
    				{
    					tmp = tmp + 0x27;
    				}
    				komunikat1[1] = tmp;
    				for (mb=0x00;mb<=0xff;mb++)
    				{
    					komunikat1[5] = ' ';
    					tmp = Bcd2dec(mb>>4)+0x30;
    					if (tmp > 0x39)
    					{
    						tmp = tmp + 0x27;
    					}
    					komunikat1[2] = tmp;
    					
    					tmp = Bcd2dec(mb&0x0f)+0x30;
    					if (tmp > 0x39)
    					{
    						tmp = tmp + 0x27;
    					}
    					komunikat1[3] = tmp;
    					komunikat1[5] = eepromread(sb,mb);
    					tekst_stojacy(komunikat1); // wyświetla na ekranie zmienną komunikat
    					if (komunikat1[5]!=0xff)
    					{
    						trwaj(1); // trzyma przez sekundę to co jest aktualnie na ekranie.
    					}
    				}
    			}
    

    A skoro działa coś co działać teoretycznie nie powinno to znaczy że coś schrzaniłem.

    Poradźcie panowie o co tutaj biega ?
  • REKLAMA
  • #2 7285901
    piti___
    Poziom 23  
    Posty: 623
    Pomógł: 67
    Ocena: 9
    Pewnie eeprom pomija najstarsze bity adresowe i wykorzystuje tylko tyle bitów ile jest potrzebnych do zaadresowania 8kB. Chcąc odczytać komórkę o adresie (8kB+1B) odczytywałeś pierwszy bajt pamięci.
  • REKLAMA
  • #3 7286050
    hessuss
    Poziom 13  
    Posty: 159
    Ocena: 14
    no właśnie nie bo jak lecą sobie cyferki na wyświetlaczu to pokazuje wartości dopiero gdy jest na adresach wcześniej przeze mnie zapisanych, program jest tak napisany że zwalnia z wyświetlaniem dopiero jak natrafi w eepromie na jakąś informację :

    fragment kodu :
    if (komunikat1[5]!=0xff)

    wygląda to tak że na wyświetlaczu "mielą się" "cyferki" jak setne sekundy w stoperze i dopiero jak trafi się jakakolwiek wartość w eepromie to wtedy wyświetla się ta wartość, program czeka sekundę i jedzie dalej. I te takie zwolnienia mam tylko i wyłącznie w przypadku wystąpienia wcześniej zaadresowanych przeze mnie komórek.
    Też myślałem że po przekroczeniu adresu 0x2000 zawsze będzie odczytywał adres 0x2000 niezależnie od tego jaki bym mu nie podał do odczytania. W takim przypadku po przekroczeniu adresu 0x2000 w każdym przypadku powinien mi wyświetlać literkę "d" bo taka akurat tam siedzi. a dokładnie siedzi tam jej odpowiednik w ASCII, ale niestety to działa tak jakby rzeczywiście ta kostka miała 64k Bajtów a nie bitów :/
  • REKLAMA
  • Pomocny post
    #4 7286383
    krzych41
    Poziom 15  
    Posty: 43
    Pomógł: 15
    Ocena: 3
    "Więc skoro ta kostka ma 8 kilo ramu to ostatnia komórka pamięci powinna mieć adres 0x2000, tak?"
    NIE. Ostatni adres to 0x1FFF.
    0x2000 = 0x0000, bo 13-ty bit adresu zostaje gubiony.
  • REKLAMA
  • Pomocny post
    #5 7286567
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    Zle rozumujesz. Po przekroczeniu adresu 0x1FFF adres sie zawija i jak zapisujesz pod kolejny adres 0x2000 to w rzeczywistosci zapis odbywa sie do komorki o adresie 0, 0x2001->1 itd. Czyli nadpisujesz dane z poczatku pamieci. Chyba wszystkie pamieci sie tak zachowuja, bo jest to wlasnie jedna z technik autodetekcji dostepnej ilosci pamieci.
  • #6 7288115
    hessuss
    Poziom 13  
    Posty: 159
    Ocena: 14
    krzych41 -> No tak faktycznie popiętrowało mi się liczenie.
    tmf -> aaaaaaaa to takie buty :) teraz już rozumiem i rzeczywiście siedząc i dokładnie obserwując ekranik widzę że dane mi się cyklicznie powtarzają. Znów odrobinę mądrzejszy :) Dzięki chłopaki.
REKLAMA