Dekoder adresu - czy tak zadziała?

Witam wszystkich Chcę pod AVRa (atmega128) podłączyć pamieć SRAM 512KB i dekoder adresu (demultiplekser)który będzie wybierał rejestry zatrzaskowe i inne układy.

Podłączyć chcę to tak:

Pamięć SRAM A0-A14 do linii adresowych SRAM Pozostałe linie adresowe dla SRAM chcę ustawiać 4 wyjściami np. portu F (otrzymam 16 stron po 32KB) A15 zanegowany będzie służył jako CS dla pamięci. Wówczas każde adresowanie powyżej 32KB będzie uaktywniać pamięć i o to mi chodzi.

Pytanie mam co do dekodera adresu (demultipleksera 16b). Czy można go (CS) bezpośrednio podpiąć do A15? Byłby aktywny na przemian z pamięcią. Wejścia demultipleksera podłączył bym do A8-A11, by był widoczny np. pod adresami 0x0100, 0x0200... (pod innymi też).

Tu mam pytanie, czy to zadziała? Czy wyjścia WR RD nie są aktywne dla pamięci wewnętrznej? Było by głupotą jak by były, ale wówczas przemazywały by mi podłączone rejestry. Dobrze rozumuję?

Pozdrawiam

Reply to
Michał Borkowicz
Loading thread data ...

AFAIR , nie sa aktywne, ale nie wiem co chcesz uzyskac, chyba ze wewn FPASH masz mniej niz 32KB... I zwroc uwage na szybkosc tego multipleksera,szczegolnie gdy pedzisz AVR z

16MHz
Reply to
Greg(G.Kasprowicz

Greg(G.Kasprowicz) napisał(a):

ok, już tłumaczę. Wyjaśnie jak ja to rozumie, jak coś bedzie nie tak proszę o poprawę, bo jeszcze tym się nie bawiłem.

W AVR istnieje specjalny interfejs do współpracy z pamięcią zewnętrzną. Po uaktywnieniu paru bitów konfiguracyjnych mikrokontroler traktuje pamięć zewnętrzną jak przedłużenie własnej pamięci SRAM. Tak mniej więcej wygląda obraz pamięci (atmega162):

-0x0000:0x00FF rejestry itp.

-0x0100:0x04FF 1KB SRAM wbudowany

-0x0500:0xFFFF pamięć zewnętrzna

Dzięki temu interfejsowi można deklarować zmienne powyżej adresu 0x0500 tak samo jak wbudowany SRAM, czyli ta operacja była by prawidłowa:

#define OFFSET 0x2000

void XRAM_example(void) { unsigned char *p=(unsigned char *) (OFFSET+1); ..... *p=0xaa; ..... }

Problem jest tylko w tym, że każda strona 64KB z pamięci 512KB jest obcinana o przysłonięte bajty z przedziału 0x0000:0x04FF. W przypadku ATMEGA128 traci się około 5KB na stronę, czyli w sumie 40KB (8stron po

64KB).

Rozwiązaniem tego jest podzielenie pamięci na 16x32KB strony rozpoczynające się od adresu 0x8000 (czyli powyzej 32KB). W ten sposób mamy dziurę a adresach 0x0500:0x7FFF. Tą dziurę chce wykorzystać podpinając 4 wejścia demultipleksera do szyny adresowej A8:A11. Wówczas jeśli adresowalibyśmy adres powyżej 0x7FFF poprzez ustawienie bitu A15 (CS dla pamięci) przez negacje na 0 uaktywnialibyśmy pamięć.

W przypadku gdy adresujemy pamięć poniżej 0x8000 to A15 było by 0. Czyli uaktywniało by demultiplekser podpięty do A8:A11. Demultiplekser byłby widoczny pod adresem 0x70??:0x7F?? (bity nie ważne).

Bitowo tak to wygląda:

A15 0 1 1 1 D D D D ? ? ? ? ? ? ? ?

A15 - to CS dla demultipleksera, a zanegowany dla pamięci

1 - adresy powyżej 0x7000 D - tu podłączam demultiplekser ? - bity nie ważne, demultiplekser reaguje tylko na stan A8:A11

Demultiplekser będzie ustawiał CS dla 16 rejestrów takich jak np. 74573 WR/RD będzie odczytywał/zapisywał z nich jak z pamieci SRAM

Jeszcze co do SRAM. Strone w pamięci wybierał będe 4 bitami z portu F jak dobrze pamiętam.

W ten sposób nie musze co chwile zmieniać bitów by sie przełączyć pomiędzy przyłączone rejestry a pamięc.

To chyba wszystko.

w atmega jest 4KB, mało dla moich ptrzeb.

Tak wiem, ponoć dla 5V i powyżej 8MHz zalecana jest seria AHC. Niestety w TME ani seguro nie widze demultipleksera w AHC.

Jak Wy byście to rozwiazali? Jest inna szybka seria nadająca sie do tego dla 5V?

Pozdrawiam

Reply to
Michał Borkowicz

Greg(G.Kasprowicz) przemówił ludzkim głosem:

128 ma możliwość ustawienia waitstate'ów, więc jeśli prędkość nie jest krytyczna, to wystarczy najzwyklejszy multiplekser.
Reply to
Zbych

Zbych napisał(a):

No właśnie o prędkość się rozbija. Zegar 16MHz, bo obsługuje wyświetlacz od CX65. Jaki inny symbol nadaje się do 16MHz? AHC nie mogę tego demultipleksera znaleźć.

Jeszcze jedno. Pamięć mam K6X4008C1F-BF55 SMD o czasie 55ns. Jak przeliczyć na ilu MHz może działać bez dodatkowych opóźnień?

Pozdrawiam

Reply to
Michał Borkowicz

Michał Borkowicz napisał(a):

Ok, chyba wiem.

1/(55*10^-9) wychodzi ponad 18 milionów, czyli na chłopski rozum 18MHz.

Pozdrawiam

Reply to
Michał Borkowicz

Kupilem w TME zatrzask, ktory chodzi na 16MHz (74AHC573?) w TSSOP20. Mialem podobny problem do twojego, troche inaczej go rozwiazalem. A mianowicie, powyzej 0x7FFFF mam 16kB strony pamieci (16 bo oprocz

512kB SRAM mam jeszcze dodatkowo 512kB FLASH), ktore wybieram bitami z portu bodajrze F. Ponizej 0x8000 mam na stale podieta jedna strone pamieci SRAM i EEPROM (po 16kB). Pozornie glupie, ale zasadniczo bardzo ulatwia kopiowanie danych pomiedzy poszczegolnymi stronami (duzy bufor). No i w gcc moge tam zadeklarowac zmienne, ktore powinny zostac poprawne po zmianie strony pamieci. Nie trace tez w ten sposob owych 4kB, bo ta zerowa strone moge tez wybrac jako strone pojawiajaca sie pod adresem 0x8000. Caly dekoder to zatrzask + dwa uklady 7400 (wykorzystalem z nich chyba 6 bramek). Calosc zawiera ATMega128, 512 kB SRAM, 512kB FLASH, przetwornice do zasilania podswietlenia LCD (regulowana z procka), LDO do zasilania LCD S65, joystick, ma zlacze do LCD i drugie z wyprowadzonymi wolnymi portami z procka. Plytka jest wielkosci wyswietlacza (wyswietlacz na nia naklejam, wystaje jeszcze z jednej strony na ok. 1,5cm zeby byl dostep do joysticka). Jak chcesz to mam jeszcze wolna plytke.
Reply to
T.M.F.

nie widze luki w rozumowaniu, powinno dzialac

Reply to
Greg(G.Kasprowicz

ACT a nie AHC...

Reply to
PAndy

Podnies napiecie zasilajace o ok 10 - 15% pojdzie szybciej

Reply to
PAndy

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.