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

Atmega128L i SRAM BS62LV1024 - Jak poprawnie podłączyć i używać pamięć?

PluszowyMisiu 31 Paź 2006 13:28 3555 25
  • #1 3172290
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    Witam. Zrobilem sobie urzadzonko na starej plytce z atmega i pamiecia zewnetrzna BS62LV1024. Jest to SRAM.
    Teraz zaprojektowalem nowa plytke ( takie same polaczenia) ( nie pomylilem sie bo juz 2 dzien sprawdzam czy cos sie nie zwiera itp.
    I stad pytanie ( prosze sie nie smiac )
    - po co jest ta pamiec zewnetrzna ( czy do niej jest zapisywany program podczas programowania ? ) ( czy cos innego )
    Uklad caly mi sie programuje, ale nie startuje tak jak powinien.
    Zrobilem prosty program z miganiem diody:
    - po starcie dioda sie zapala i tyle, dochodzi do instrukcji opoznienia i sie wiesza.
    Gdy wciskam reset to sie wylacza i zaczyna swiecic po zwolnieniu.
    Jesli napisze program ktory najpierw gasi diode a pozniej jest opoznienie to sie nie zaswieci juz.
    Nie wiem w czym jest problem??

    Ma ktos moze rozpiske jak dokladnie ( linia po lini ) podlaczyc pamiec zewnetrzna ta co wyzen jest opisana.

    Prosze o pomoc i wytlumaczenie mi tych ciezkich pojeci.
  • #2 3172647
    wierk
    Poziom 11  
    Posty: 18
    Do oceny problemu wypada wiedzieć co najmniej:
    1. Czy to urządzenie wcześniej działało, a przestało po stworzeniu nowej płytki.
    2. Kod programu migania diodą.
    3. Sposób podłączenia diody do uP.
    4. Co to jest za urządzenie.
  • #3 3172988
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    Urzadzenie to rejestrator temperatury
    - obsluga MMC
    - DS18b20
    - RTC
    - LCD
    - Drukarka termiczna do wydrukow
    Dzialalo
    Aktualnie juz na nowej plycie dziala
    Kod programu do migania nie jest potrzebny

    Interesuje mnie tylko pamiec - do czego w atmegach sluzy i temat mozna zamknac!!!
    Pozdrawiam
  • #4 3173046
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Pamięć ta może służyć do buforowania danych a potem za jednym razem przepisane do MMC albo do przygotowania danych do wydruku.
  • #5 3173201
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    Czyli to jest zwykly buffor? Program ktory stworzylem i jest w postaci *.hex ladowany jest tylko do uP a po odpaleniu programu dopiero dane urzyte laduja cie do SRAMU?
  • #6 3173396
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Normalnie pamięć zewnętrzna nie jest obsługiwana to ty musisz świadomie ją wysterować. Jeżeli tego nie zrobiłeś to tylko będzie pobierać prąd i blokować linie portów.
  • #7 3173940
    andre65
    Poziom 14  
    Posty: 53
    Pomógł: 5
    Jeżeli jej specjalnie nie zadeklarowałeś, to układ będzie poprawnie pracował nawet po jej usunięciu. To jest jak z tym zostawaniem części po poskładaniu samochodu :D
  • Pomocny post
    #8 3175982
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    PluszowyMisiu napisał:
    Czyli to jest zwykly buffor? Program ktory stworzylem i jest w postaci *.hex ladowany jest tylko do uP a po odpaleniu programu dopiero dane urzyte laduja cie do SRAMU?

    Co to znaczy bufor? Kolega pisał o buforowaniu danych, a nie o wciąganiu programu do tej pamięci. Pamięć zewnętrzna w procesorach ATMEGA jest wyłącznie pamięcią danych i jest przedłużeniem wewnętrznego SRAMu. Procesorki ATMEGA realizowane są w architekturze harward gdzie pamięć danych nie może być użyta do przechowywania wykonywanego kodu programu (w przeciwieństwie do organizacji von Neumana).

    Podłączenie pamięci zewnętrznej znajdziesz w datasheet na stronach od 26. Multipleksowanie szyny danych adresu wymaga zastosowania zatrzasku adresowego (np.74ACT573), w którym sygnał ALE procesora zatrzaskuje młodszą połówkę adresu. Linię odczytu -RD procesora łączymy z linią -OE pamięci, linię -WR..-WR.

    Pozostaje jeszcze problem sygnału selekcji kości pamięci -CS, który w przypadku tylko jednej kości w systemie można podłączyć bezpośrednio do masy. W układach rozbudowanych systemów pamięci kości są wybierane przez dekoder adresu, podłączony do ich linii -CS, sterowany przeważnie z kilku starszych bitów adresu lub rozbudowaną logikę zarządzającą stronnicowaniem lub/i modularyzacją pamięci (Memory Menagement Unit MMU).
    Sygnał ten można też wysterować bezpośrednio z linii portu wysterowanego tylko w czasie pracy z tą pamięcią, co moża być korzystne z punktu widzenia bilansu energii, gdyż przy wysokim stanie -CS większość kości pamięci pracuje z obniżonym poborem mocy.

    Ostatnim problemem w przypadku kości 128 kilobajtów jast najstarszy bit adresu, A16, wykraczający poza obszar adresowy obszaru danych procesora. Można go dołączyć do plusa lub do masy wykorzystując tylko połowę kości, ewentualnie podłączyć do linii portu procesora tworząc prosty system stronnicowania. Błędem jest zostawienie tej linii nie podłączonej.

    Sposób obsługi programowej zewnętrznej pamięci SRAM opisany jest w datasheet procesora na stronach 26-35.

    Troszkę inna sytuacja jest w '51, gdzie istnieje możliwość alokowania zewnętrznego RAMu w obszarze pamięci programu (i jednocześnie w obszarze danych). Taki układ jest szczególnie dogodny w systemach uruchomieniowych, gdzie musimy często wymieniać kod programu.
  • #9 3190913
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    kol @marek_Łódź bardzo mi rozjasniles w glowie. Teraz takie pytanie:
    czy ten ram wogole jest mi do czegos potrzebny?? Jak mam programowac zeby go wykozystac jesli go nie wykozystuje w swoim programie.
    W moim programie dzialam na kilku konkretnych tablicach 2D.
    Pozdrawaim
  • #10 3193439
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    Dopóki mieścimy się z danymi programu w wewnętrznym RAM procesora, zewnętrzny RAM możemy sobie darować. Jest użyteczny wtedy, gdy operujemy dużymi pakietami danych (przykład - akwizycja danych pomiarowych, buforowanie obrazków itp.....).
  • #11 3205257
    PluszowyMisiu
    Poziom 14  
    Posty: 151
    Ocena: 11
    Moj program chodzi bez zewnetrznego ramu bo wczoraj go wymontowalem z plytki :) Pozdrawiam
  • #12 5385518
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    Witam,
    Nie zakładałem nowego tematu, gdyż szukam pomocy własnie odnosnie pamiec zewnętrznej SRAM i atmegi128L.

    Otórz mam atmege128L(8MHz) i pamiec SRAM: BS62LV1027 i zatrzask 74HC573. Wszystko mam juz połączone i teraz piszę kod na tą pamiec.
    Czytałem o podłaczeniu pamieci w dokumentacji zarówno procka jak i pamieci i nie rozumiem do konca jak wygląda ten zapis i odczyt.

    Pamiec zewnętrzna włącza sie bitem SRE w MCUCR i wtedy odpowiednie piny przyjmują odpowiednie funkcje. Jakie wartosci maja piny(WR,RD,ALE) po właczeniu pamieci(bit SRE)? Podejrzewam, że WR='1', RD='1' gdyż wtedy mają stan nieaktywny. A jak to jest z sygnałem ALE, kiedy on jest zmieniany? Czy sygnal ALE jest generowany automatycznie?
    Czy do obsługi pamiec są specjalne rozkazy, czytałem cos o STS(piszę w C)?

    Pozdrawiam,
    BB
  • #13 5385661
    Pituś Bajtuś
    Poziom 28  
    Posty: 934
    Pomógł: 137
    Ocena: 10
    marek_Łódź napisał:
    w architekturze harward gdzie pamięć danych nie może być użyta do przechowywania wykonywanego kodu programu (w przeciwieństwie do organizacji von Neumana).

    Nie do końca jest to prawdą. W przypadku AVR owszem, ale takie uogólnienie na wszystkie procesory w architekturze harwardzkiej jest nadużyciem. Przykładowo STM32 - są wykonane w architekturze harwadzkiej (a więc posiadają oddzielne magistrale dla rozkazów i danych), jednak obydwie te magistrale zmapowane są na _wspólną_ przestrzeń adresową - możliwe jest umieszczenie kodu w pamięci RAM i jego wykonanie, jak również swobodny dostęp do danych w pamięci Flash.
  • #14 5385687
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    Witam
    Dziękuję, że skomentowałeś posta który został napisany prawie 2 lata temu ;).
    A mógłbyś mi pomóc w jakiś sposób, komentując mojego posta z dzisiaj?

    Pozdrawiam,
    BB
  • #15 5387421
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    BeerBear napisał:
    Pamiec zewnętrzna włącza sie bitem SRE w MCUCR i wtedy odpowiednie piny przyjmują odpowiednie funkcje. Jakie wartosci maja piny(WR,RD,ALE) po właczeniu pamieci(bit SRE)? Podejrzewam, że WR='1', RD='1' gdyż wtedy mają stan nieaktywny. A jak to jest z sygnałem ALE, kiedy on jest zmieniany? Czy sygnal ALE jest generowany automatycznie?
    Noooo właśnie tak. Sygnały dostępu do pamięci przyjmują pierwotnie stan nieaktywny i są aktywizowane automatycznie w momencie dostępu do pamięci (wykonania stosownego rozkazu kodu maszynowego) w odpowiedniej sekwencji - najpierw zatrzaśnięcie połówki adresu - ALE , potem dostęp RD lub WR. Dostęp do pamięci zewnętrznej realizuje kilka rozkazów LD, ST, LDS, STS, PUSH, POP itp (szczegóły na str 19 pełnego datasheet procesora).

    W przypadku języków wyższego poziomu na ogół dostępne są dyrektywy umożliwiające zdefiniowanie dostępnych obszarów pamięci oraz zaalokowanie wybranych zmiennych w rejestrach, RAM wewnętrznym bądź zewnętrznym. Zdefiniowanie zmiennej jako alokowanej w pamięci zewnętrznej spowoduje przypisanie do niej stosownych funkcji dostępu, obsługujących ten mechanizm.



    Szczegóły dla AVR GCC np.tu
  • #16 5387869
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    marek_ŁÓDŹ: Dziękuje za konkretną odpowiedź.

    Te rozkazy co wymieniłeś(STS,LD, itd.) stosowane sa przy asemblerze.
    Można użyc ich jako wstawek asemblerowych, bo ja piszę w C?
    Masz może jeszcze jakies materiały odnośnie pamieci zewnętrznej lub przykładowy kodzik(C)?. Od razu mówie, że nie zależy mi na całej 64kB pamięci SRAM, wystarczy mi te 60kB po odjęciu zmapowanej pamięci wewnętrznej SRAM.
    Myślisz, że zatrzask 74HC573 wydoli dla Atmegi128L(3.3V,8MHz)?
    Czy może zaopatrzec się w wersje AHC?

    Pozdrawiam,
    BB
  • #17 5387929
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    BeerBear napisał:
    Można użyc ich jako wstawek asemblerowych, bo ja piszę w C?
    Myślisz, że zatrzask 74HC573 wydoli dla Atmegi128L(3.3V,8MHz)? Czy może zaopatrzec się w wersje AHC?
    Jak najbardziej można operować asemblerem i w sumie jest to dość przejrzyste (trzeba sobie zmontować proste wstawki przeładowania zmienna<->RAM. Sorry za brak szczegółów co do samego C, ale nigdy nie miałem takiej potrzeby. Jeśli chodzi o kość HC to przy 8MHz chyba powinna się wyrobić. W sumie należałoby popatrzeć w datasheet tej kości, procesora i pamięci i rozrysować sobie diagramy czasowe. Ale prościej będzie sprawdzić ;)

    Szczerze mówiąc po przejrzeniu parametrów propagacji nie jestem do końca przekonany (czasy propagacji są na poziomie kilkudziesięciu ns czyli na styk ). Na pewno AHC będzie pewniejsze.


    Pituś Bajtuś napisał:
    Przykładowo STM32 - są wykonane w architekturze harwadzkiej, jednak obydwie te magistrale zmapowane są na _wspólną_ przestrzeń adresową - możliwe jest umieszczenie kodu w pamięci RAM i jego wykonanie, jak również swobodny dostęp do danych w pamięci Flash.
    Nie trzeba tak daleko szukać. Już nieśmiertelna '51 ma porypaną architekturę, gdzie nie dość, że przestrzenie danych i programu rozdzielone są w czasie zamiast przestrzennie (tylko dlatego, że zabrakło pinów ;) ), to jeszcze daje się prostym ruchem je połączyć. Można sobie wyobrazić prostą logikę sterującą RAMem, która naprzemiennie będzie łączyła te magistrale i je rozdzielała, czyli inaczej mówiąc "cykającą" architekturę.
  • #18 5388107
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    Z tymi wykresami to racja, sprawdzę sobie je tak jak mówisz.
    A mógłbyś mi taką jedną wstawkę napisac zmienna<->RAM?
    Napisałem przykładowe:
    Chciałbym zapisac bajt (0xAA) do pamiecie zawnętrznej pod adresem 0x2000. Pozniej odczytac ta wartosc i wyslac na USART, zeby zobaczyc czy działa.

    zapis:
    asm("LDI R26,0xAA" "\n\t"
    "STS 0x2000,R26"
    );


    odczyt:
    asm("LDS R26,0x2000");

    Czy cos takiego może byc? Nie wiem jak to potem połączyc z USART.

    Mam dobrą koncepcje myślenia czy całowicie błędną?
  • #19 5388210
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Nie wiem po co się tak męczyć. Pamięć zewnętrzna jest zamapowana do tej samej przestrzeni, w której jest wewnętrzna pamięć ram. Można więc posiadać wskaźnik, który będzie wskazywał komórkę w wewnętrznej pamięci, a po przypisaniu innego adresu może wskazywać na zewnętrzną pamięć. Gdyby napisać:
    struct jakis_skomplikowany_obiekt* my_obj = (void*)0x2345;
    to można się odwoływać przez ten wskaźnik do całej struktury, nie ważne w której pamięci zaczyna się i kończy obiekt. Właściwie korzystanie z zewnętrznej pamięci nie wymaga żadnych wstawek - mechanizmy które działają na wewnętrznej pamięci wykorzystują te same instrukcje (ld/lds/ldd/st/sts/std/push/pop) które służą do dostępu do pamięci zewnętrznej, od strony programu nie ma różnicy pomiędzy tymi dwoma pamięciami (poza możliwością wyłączenia zewnętrznej i aliasowania komórek przy nie pełnej szynie adresowej). Równie dobrze można przenieść stos do zewnętrznej pamięci. Ulokowanie tablicy mającej 32k komórek bajtowych może wyglądać tak:
    unsigned char* duza_tablica = (void*)0x8000;

    lub można stosować konstrukcje ukrywające wskaźnik:
    #define duza_tablica ((unsigned char*)0x8000)

    w obu przypadkach odwołuje się poprzez duza_tablica[index].

    BeerBear: Tak napisana wstawka może siać zniszczenie, kompilator nie jest informowany które rejestry się zmieniły. Łatwiej można napisać tak:
    volatile unsigned char* y = (void*)0x2000;
    *y = 0xAA;
    uart_send(*y);

    lub
    #define y *((volatile unsigned char*)0x2000)
    y = 0xAA;
    uart_send(y);

    (volatile jest zastosowane w celu wymuszenia zapisu i odczytu do pamięci z pominięciem optymalizacji).
    Jeśli jednak już próbował byś usprawnić swoje wstawki, to musiały by one wyglądać tak:
    
    // volatile, żeby kompilator nie usunął (wstawka jawnie nie wpływa na inne obiekty, więc może zostać usunięta
    asm volatile(
      "ldi r26, 0xAA" "\n\t" 
      "sts 0x2000, r26"
      :::"r26"
    );
    /*
     * lub wersja przyjazna dla kompilatora - może sam wybrać
     * który rejestr będzie tymczasowy dla wartości
    unsigned char temp;
    asm volatile(
      "ldi %0, 0xAA" "\n\t"
      "sts 0x2000, %0"
      :"=r"(temp):
    );
    */
    // zmienna, w której ma wylądować wartość z komórki
    unsigned char var_out;
    asm(
      "lds %0, 0x2000"
      :"=r"(var_out):
    );
  • #20 5388259
    marek_Łódź
    Poziom 36  
    Posty: 3103
    Pomógł: 208
    Ocena: 66
    BeerBear napisał:
    asm("LDI R26,0xAA" "\n\t" "STS 0x2000,R26" );[/i]

    odczyt:
    asm("LDS R26,0x2000");


    Dostępy na moje oko prawidłowe. Jeśli nie chcesz pisać reszty w asemblerze, musisz zawartość komórki RAM przeładować z/do zmiennej i dalej już operować nią w C

    Innym sposobem jest alokowanie sekcji danych w obszarze external SRAM (dyrektywami linkera), ale w tym Ci już nie pomogę, bo nigdy tego nie robiłem.

    Link
  • #21 5388291
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    BoskiDialer: dziękuje za posta.
    Zaraz zrobię w sposób jaki zalecasz.
    Mam jeszcze jedno pytanie:

    unsigned char temp; 
    asm volatile( 
      "ldi %0, 0xAA" "\n\t" 
      "sts 0x2000, %0" 
      :"=r"(temp):
      );
    

    Jeśli chciałbym użyc w przerwaniu tej powyższej wstawki, tylko że wartosc wpisywana do rejestru tymczasowego(aktualnie 0xAA) będzie się zmieniac.To można byłoby takie cos zastosowac jak poniżej:

    unsigned char temp; 
    unsigned char bajt;
    asm volatile( 
      "ldi %0, %1" "\n\t" 
      "sts 0x2000, %0" 
      :"=r"(temp):"I"(bajt):
      );


    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #22 5388316
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Jeśli podajesz na wejściu do "I", wartość musi być w zakresie od 0 do 63 i obliczalna w czasie kompilacji, więc to się nie sprawdzi. Wartość i tak będzie w rejestrze, więc można przekazać bezpośrednio rejestr:
    unsigned char bajt; 
    asm volatile( 
    "sts 0x2000, %0"
    ::"r"(bajt) /* opcjonalnie :"memory" */
    );

    lub prostrze i bardziej zalecane:
    *((volatile unsigned char*)0x2000) = bajt;
  • #23 5388356
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    Aha, no racja.
    To jeszcze jedna rzecz jakbyś mi mógł powiedziec
    W tym kodzie który napisałeś:
    
    unsigned char bajt; 
    asm volatile( 
    "sts 0x2000, %0" 
    ::"r"(bajt) /* opcjonalnie :"memory" */ 
    );


    Jeśli bym chciał również zmieniac adres(aktualnie 0x2000) w pamieci?
    To naprzykład można tak napisac:
    unsigned char bajt;
    unsigned int adres;
    asm volatile(
    "sts %0, %1"
    :"r"(adres):"r"(bajt)
    );


    Czym się różni "r" od "=r"?
  • #24 5388383
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    widze ze nadszedl juz czas na napisanie RTFM. mieszanie assemblera z c jest naprawde opisane w instrukcji kompilatora... to nie jest tajna wiedza znana tylko wybranym.

    4\/3!!
    Moderowany przez And!:


    Post raportowany,
    brak konkretnych informacji pozwalających rozwiązać problem.

  • #25 5388391
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    "r" od "=r" różni się tym, że "r" jest stosowane przy wejściu (po drugim dwukropku), a "=r" przy wyjściu (po pierwszym dwukropku). Zmienne tymczasowe dawałem jako wyjściowe ze wstawek aby kompilator nie czepiał się do niezainicjalizowania zmiennej.

    Jeśli chcesz mieć zmienny adres, to nie możesz korzystać z sts, które zapisuje pod stały adres. Jeśli adres ma być zmienny, musisz skorzysać z st i posłużyć się którymś z trzech wskaźników - X, Y lub Z:
    unsigned char bajt;
    unsigned int adres;
    asm volatile(
      "st %a0, %1" 
      ::"e"((void*)adres), "r"(bajt)
    );

    I tu ponownie wersja prostrza i bardziej zalecana:
    unsigned char* adres;
    unsigned char bajt;
    *adres = bajt;

    Cały czas piszę drugą wersję, żeby wskazać, że takowa istnieje. Jest ona bardziej zalecana, gdyż pozwala kompilatorowi na własne optymalizowanie kodu i ukrywa część architektury. Ze wstawką piszę, żeby pokazać, że da się, ale nie polecam wstawek do tak prostego zadania jakim jest dostęp do pamięci.

    Jeśli chcesz dobrze pisać wstawki, warto mieć pod ręką GCC-AVR Inline Assembler Cookbook
  • #26 5388500
    BeerBear
    Poziom 12  
    Posty: 59
    Pomógł: 1
    Ocena: 4
    BoskiDialer: dziękuje za pomoc.(pomógł++)
    Napisze kod według zaleceń, odezwę się ewentualnie w razie jakis problemów lub zdam relacje czy mi się udało.
    Mam tego pdf(GCC-AVR Inline Assemble Cookbook) i zapoznaję się z nim teraz na bieżąco.
    marekŁódź: również dziękuje za pomoc.
    Freddi Chopin: nadrobie zaległosci :)

    Temat dalej uważam za otwarty
    Pozdrawiam,
    BB

Podsumowanie tematu

✨ Dyskusja dotyczy poprawnego podłączenia i wykorzystania zewnętrznej pamięci SRAM BS62LV1024 (oraz BS62LV1027) z mikrokontrolerem Atmega128L. Pamięć zewnętrzna służy wyłącznie do przechowywania danych, nie jest miejscem zapisu programu, który ładowany jest do wewnętrznej pamięci mikrokontrolera. W architekturze Harwarda Atmegi kod programu i dane są rozdzielone, dlatego program nie jest wykonywany z pamięci SRAM. Pamięć zewnętrzna może być używana jako bufor danych, np. do akwizycji pomiarów, buforowania obrazów lub przygotowania danych do zapisu na MMC czy do wydruku. Aby korzystać z pamięci zewnętrznej, należy ją świadomie obsługiwać w programie, gdyż nie jest automatycznie wykorzystywana. Podłączenie wymaga zastosowania zatrzasku adresowego (np. 74HC573) do multipleksowania linii adresu i danych oraz odpowiedniego sterowania sygnałami ALE, RD, WR i CS. Sygnał ALE jest generowany automatycznie przez mikrokontroler podczas dostępu do pamięci zewnętrznej. Dostęp do pamięci realizowany jest za pomocą rozkazów asemblerowych (LD, ST, LDS, STS, PUSH, POP), jednak w języku C można operować na wskaźnikach do adresów pamięci zewnętrznej bez konieczności używania wstawek asemblerowych. W przypadku niewielkich wymagań pamięciowych zewnętrzny RAM nie jest konieczny. Dyskusja zawiera przykłady wstawek asemblerowych do zapisu i odczytu bajtów z pamięci zewnętrznej oraz wskazówki dotyczące alokacji zmiennych w zewnętrznej pamięci przy pomocy dyrektyw linkera. Poruszono także kwestie kompatybilności zatrzasku 74HC573 z Atmegą128L pracującą na 3.3V i 8MHz, sugerując wersję AHC jako bardziej pewną. Podsumowując, pamięć zewnętrzna SRAM jest rozszerzeniem pamięci danych, wymaga odpowiedniego sprzętowego i programowego wsparcia, a jej wykorzystanie zależy od potrzeb aplikacji.
Wygenerowane przez model językowy.
REKLAMA