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
używając
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.
A skoro działa coś co działać teoretycznie nie powinno to znaczy że coś schrzaniłem.
Poradźcie panowie o co tutaj biega ?
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 ?