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][24c64]za dużo pamięci w pamięci?

hessuss 20 Lis 2009 15:38 1398 5
REKLAMA
  • #1 7285850
    hessuss
    Poziom 13  
    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  
    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  
    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  
    "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
    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  
    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