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ę?
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
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:
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?
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ń?
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.
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.