Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie zewnętrzną pamięcią Sram przez Atmega8.

18 Lip 2010 16:01 5260 28
  • Poziom 19  
    Witam
    Na początku dodam, że kod ma być w c.
    Potrzebuje jakiegoś kodu do odczytu i zapisu danych na sram.
    Z góry dziękuje z pomoc.
  • Computer Controls
  • Pomocny post
    Poziom 28  
    Atmega8 nie ma dedykowanej magistrali do zewnetrznej pamieci. Wszystko trzeba zrobic na piechote. I w zaleznosci jaka pamiec podlaczysz (szeregowa lub rownolegla) i jak ja podlaczysz, tak trzeba bedzie napisac kod. Pozatym to niezbyt skomplikowane. Dla pamieci rownoleglej prawie identycznie jak obsluga wyswietlacza LCD. Zbedne tylko staja sie komendy a potrzeba jakiegos wskaznika adresu.

    Proszę poprawić pisownię.
    Robak
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Zobacz sobie pdf jakiegoś AVRa, który ma interfejs pamięci zewnętrznej (ATMega64,128 itd). Tam znajdziesz wykresy pokazujące zależności czasowe na tym interfejsie. Na ATMega8 łączysz wszystko identycznie, z tym, że zależności będziesz musiał wygenerować programowo, bo ten procesor nie ma interfejsu do pamięci.
  • Poziom 19  
    Znalazłem coś takiego.
    Code:

    inline void write_memory(unsigned char x, unsigned char y, unsigned char value)
    {
       PORTA=x;
       PORTC=y;
       PORTB=0b00000000;
       PORTB = value;
       PORTB |= _BV(PB0);
    }

    Niestety nie wiem w jaki sposób to działa.
    Czy mógł by mi ktoś wytłumaczyć ten kod?
    Wiem tylko tyle, że odnosi się do pamięci Dallasa.
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Jakiej konkretnie? Bo dziwny wydaje się zapis valuee do PORTB, gdzie najpierw go zerujesz, potem wpisujesz value i na końcu ustawiasz najmłodszy bit.
  • Poziom 19  
    Do DS1244Y-70.

    Dodano po 3 [minuty]:

    Z tego co mi się wydaje to to chyba jest kolor.
    Code:

    write_memory(              x,               y,               color);
    ////////////////////////////////////////////////////////////////////////////////////////
    write_memory(unsigned char x, unsigned char y, unsigned char value)
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Więc ten kod wydaje się błędny. Zgodnie z pdfem zapis odbywa się na opadającym zboczu sygnału WR. W tym kodzie wydaje się, że WR jest na tym samym porcie są D0-D7 i WR? Niemożliwe. W dodatku sekwencja zapisu wydaje się być błędna.
  • Computer Controls
  • Poziom 19  
    To nie wiem dlaczego działa.
    Link
  • Pomocny post
    Poziom 13  
    możesz wykorzystać układy latche 74hc754 i sterować pamięcia za pomocą magistrali 8 bit , do tego jeszcze jeden pin dla CS i sterowania kierunkiem zapisu ,wiec M8 spokojnie obsłuży zewętrzną pamięc SRAM

    poniżej link do do załącznika + kod w C
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=7364520#7364520
  • Pomocny post
    Moderator Mikrokontrolery Projektowanie
    Widzisz, niedokładnie to przepisałeś, stąd problem :)
    W oryginale jest:
    Code:

    inline void write_memory(unsigned char x, unsigned char y, unsigned char value)
    {
       PORTA=x;
       PORTC=y;
       PORTB=0b00000000;
       PORTB |= value;
       PORTB |= _BV(PB0);
    }


    Sprytnie jest to pomyślane, pewnie pod PORTB podłączone są linie D0-D7 pamięci i pod B0 linia WR. Działa to tak, że pierwszy zapis 0 - powoduje, że pamięć zachowuje się przeźroczyście. Następnie wpisujesz value do komórki pamięci zaadresowanej przez PORTA i PORTC. Jeśli najmłodszy bit value==1 to od razu dane są zatrzaskiwane i wpisywane do pamięci (WR=1), jeśli nie to kolejna instrukcja PORTB |= _BV(PB0) to spowoduje. Ponieważ dane są zatrzaskiwane zboczem, więc pamięć zapamięta niejako "poprzedni" stan magistrali. Sprytne, bo oszczędza parę taktów i jedną linię IO.
  • Poziom 28  
    tmf napisał:
    . Sprytne, bo oszczędza parę taktów i jedną linię IO.


    Ale tracimy jeden bit. Najmłodszy bit zawsze bedzie jedynką. A w zasadzie to nie wiadomo czym. Jeżeli to działa to musi to być jakaś dziwna specyficzna sytuacja z timingami pamięci, lub po drodze od D0 do WR jest jakaś bramka opóźniająca. Nie patrzylem na schemat...
  • Poziom 19  
    Proponuje zainteresować się czym takim jak 23K256.
    23K256 jest to 256kbit SerialRAM oczywiście zgodny z SPI.
  • Poziom 27  
    A ja koledze radzę użyć typowych pamięci o dostępie równoległym, Trudno będzie kupić pamięć 64KB za to bez problemu trafisz 32 albo 128 KB za bardzo małe pieniądze. Do tego choćby atmega162 lub atmega64 i będziesz miał bardzo "przyjemny" dostęp do RAM-u. Sprzęt za ciebie załatwi dostęp do pamięci i nie będziesz sobie musiał zawracać głowy generowaniem programowym. Minusem jest plątanina linii adresów, danych i sygnałów sterujących, Kwestię dostępu do pamięci załatwi kompilator bo pamięć będzie widoczna jako przestrzeń adresowa procka.
  • Poziom 19  
    rpal napisał:
    A ja koledze radzę użyć typowych pamięci o dostępie równoległym, Trudno będzie kupić pamięć 64KB za to bez problemu trafisz 32 albo 128 KB za bardzo małe pieniądze. Do tego choćby atmega162 lub atmega64 i będziesz miał bardzo "przyjemny" dostęp do RAM-u.

    atmega64: 20,12zł
    atmega162: 13,93 zł
    atmega8: 6,51zł
    A mój budżet nie może przekroczyć 90zł.

    Dodano po 44 [minuty]:

    Mam pewien problem z podłączeniem.
    Według tego kodu za:
    - CS odpowiada pin 2 portu D,
    - OE odpowiada pin 3 portu D
    - WE odpowiada pin 4 portu D,
    - AR odpowiada pin 5 portu D,
    - A1 odpowiada pin 6 portu D,
    - DATA odpowiada port B.
    Tylko, że pinów portu B jest 6, a DATY 7(SCHEMAT).
    Jak to mam podłączyć?

    Code:

    #define SRAM_DATA_DDR DDRB
    #define SRAM_DATA_OUT PORTB
    #define SRAM_DATA_IN PINB
    #define SRAM_SCS_PORT PORTD
    #define SRAM_SCS_PIN 2
    #define SRAM_SOE_PORT PORTD
    #define SRAM_SOE_PIN 3
    #define SRAM_SWE_PORT PORTD
    #define SRAM_SWE_PIN 4
    #define SRAM_SAR_PORT PORTD
    #define SRAM_SAR_PIN 5
    #define SRAM_SAI_PORT PORTD
    #define SRAM_SAI_PIN 6


    SCHEMAT:
    Sterowanie zewnętrzną pamięcią Sram przez Atmega8.
  • Pomocny post
    Poziom 27  
    pamięc 62256 (32k) 8,00 PLN
    atmega162 29,00 PLN (strasznie podnieśli ceny niedawno kupowałem po 11 PLN)
    74AHC573 1 PLN
    razem 38 PLN zostaje 62 PLN na resztę , tworzysz sztuczny problem coś mi się zdaje chyba że nie zależy tobie na szybkości zapisu więc łap się za atmega8 i pamięci SPI bo na pamięć równoleglą zużyjesz wszystkie wolne piny i jeszcze będzie ci ich brakować albo twój układ obrośnie układami TTL aby powielić porty przy okazji stracisz szprzętową obsługę oraz spowolnisz dostęp do pamięci. Atmega8 nie ma tyle wolnych linii aby obsłużyć wszystkie wyprowadzenia pamięci równoległej więc trzeba dokładać np. zatrzaski TTL. Jak dodasz np. 74HC574 to zrobisz na nich sterowanie adresami,na port danych poświęcisz jeden port ośmiobitowy, dwa piny z dowolnego wolnego portu na linie WE,OE pamięci (CS na stałe do masy) i dodatkowo dwa kolejne piny dla zatrzasków. Reasumując potrzeba tobie 8 + 4 piny portów We/wy. Zostanie 11 wolnych pinów. Możesz także z jakiejś starej pamięci dynamicznej od PC-ta (SIM) użyć jednej z zabudowanej tam pamięci i tym sposobem w zasadzie uzyskasz monstrualną pamięć ale niezbędne będzie dynamiczne odświerzanie np. w przerwaniach. Wyszukaj sobie w goglach coś takiego "monster memory" to zobaczysz jak z małego atmela można wydusisć coś koło 512kB :) o ile dobrze pamiętam. O sam wyszukałem :)Link
  • Moderator Mikrokontrolery Projektowanie
    Można, ale za grosze można też kupić pamięć statyczną RAM o pojemności 512kB i odpada problem odświeżania. Z drugiej strony pamięci dynamiczne mają multipleksowane linie adresowe i mniej wyprowadzań. Dla prostoty wszedłbym w ATXMega, są tanie (20-30zł) i mają sprzętowe interfejsy do wszystkich typów pamięci (SRAM, DRAM, DDR). Poza tym mają na pokładzie nawet 16kB więc może nie będzie potrzeby dokładać więcej. Za podobne pieniądze można też kupić AVR32 UC3, które mają nawet 64kB SRAM + 256kB FLASH.
  • Poziom 19  
    tmf napisał:
    ...ATXMega, są tanie (20-30zł) i mają sprzętowe interfejsy do wszystkich typów pamięci (SRAM, DRAM, DDR).

    1.Czyli można do niej podłączyć taką pamięci. Tak?
    Sterowanie zewnętrzną pamięcią Sram przez Atmega8. Sterowanie zewnętrzną pamięcią Sram przez Atmega8.
    2.Czy trzeba będzie coś dopisać w kodzie, czy będę mógł się nią posługiwać, jak tom wbudowaną?
  • Pomocny post
    Poziom 27  
    To kolega ostro poszedł po bandzie :) Tej pamięci tak łatwo nie wysterujesz a jesli już tyle tego RAM potrzeba to lepiej zastosuj jakąś kartę SD będzie z 10 razy tyle. Sądząc po treści pytania to jesteś w tej dziedzinie raczej początkujący więc od razu odpowiedz po co co tobie tyle RAM ?
  • Poziom 19  
    Chcę zrobić 8 kolorową grę tv i potrzebuje RAM-u do zapisu obrazu przed jego wyświetleniem. W tym przypadku karta SD odpada.
    To jak podłączyć tą kość, bo mam taką jedną?
  • Poziom 27  
    To może zanim cokolwiek zrobisz policz sobie ile czasu zajmie przepisywanie tych danych tu i tam a potem oceń czy twoj skromny budżet podoła temu zadaniu. Nie wiem jak chcesz generować obraz ale tak na moje oko to udałeś się z motyką na słońce, motyką jest ten atmega8 oczywiście. Czy kolego zdajesz sobie sprawę ile ten SIM ma linii wejścia danych i adresu, nie wspominając już o liniach sterujących ? Atmega 8 musiałaby się wielokrotnie sklonować aby uzyskać odpowiednią ilość portów. Poprzez dołaczanie jakiś zatrzasków TTL aby te linie strorzyć i dalej obsługę odświerzania pamięci stracisz większość mocy obliczeniowej i ten procek nie będzie już nic innego robił jak obsługiwał pamięć, a gdzie generowanie obrazu albo sam program gry ? Na moje oko to s/f.
    Gdzieś widziałem projekt odtwarzacza mp3 który używał sim-a jako pamięć danych ale procek tam był wielokrotnie wydajnieszy i miał więcej linii któryś z NXP. Myślę że musisz gdzie indziej skierować swoją pomysłowość :)
  • Moderator Mikrokontrolery Projektowanie
    rpal - kontekst z SDRAM dotyczył ATXMega, nie ATMega8.
    tomek_programista - tak, XMega obsługuje SDRAMy, przy czym tylko do 16MB. Co jak na 8-bitowy procesorek to też niezły overkill.
    Poszukaj w necie, widziałem projekt gry video na ATMega, ze schematami i wszystkim.
    Co do mocy obliczneiowej - jeśli cały obraz będziesz generował programowo to istotnie sporo mocy to pochłonie, ale z drugiej strony gry typu tetris, ping-pong itp. nie wymagają jakiś specjalnych obliczeń i spokojnie ATMega to uciągnie. Ale najprościej by było wrzucić chociażby ATMega128A i podpiąć kosztującą grosze pamięć SRAM.
    Można też znacznie odciążyć procesor dodając prostą logikę - np. licznik do 512 generujący kolejne adresy pixeli w linii i przerwanie końca linii, które można wykorzystać do zapisu nowych danych. To raptem będą 2-3 układy TTL, które zresztą można zaszyć w CPLD (ale to o pare zł podniesie koszty).
  • Poziom 27  
    kol. tmf ja uważnie czytam to co autor napisał a w którymś z postów napisał wyraźnie co ma do dyspozycji czyli atmega8 i 90 PLN. Potem jeszcze dodał tego sim-a więc sam chyba przyznasz że połączenie tego do kupy przy tym co jeszcze napisał w sprawie gry robi niezły melanż ? Może jestem w błędzie ale jeśli nawet użyłby xmegi to też miałby co nieco problemów aby wydolić z ilością wolnych pinów dla obługi tej pamięci. Niestety nie zadowala się radami aby użyć zwykłych RAM-ów tylko kolejny post rodzi coraz bardziej fantastyczne pomysł, obecnie z SIM-em jak tak dalej pójdzie (proszę o nieobrażanie się ) to będzie chciał stworzyć Nintendo by Atmel :) W sieci istotnie natknąłem się na projekty jak generować obraz np. video przez atmega8 ale ten procek chodził jako swoisty kontroler video i nic poza tym nie robił, no i w dodatku trzeba mieć do tego telewizor :)
  • Moderator Mikrokontrolery Projektowanie
    tomek_programista napisał:
    tmf napisał:
    ...ATXMega, są tanie (20-30zł) i mają sprzętowe interfejsy do wszystkich typów pamięci (SRAM, DRAM, DDR).

    1.Czyli można do niej podłączyć taką pamięci. Tak?


    rpal, chyba jednak mniej uważnie czytasz :)
    Ale nie o to chodzi. Wbrew pozorom AVR spokojnie pociągnie taką zabawę, zobacz np. http://hackedgadgets.com/2008/11/16/avr-microcontroller-based-video-game/
    Zaledwie ATMega168, bez dodatkowych komponentów i jak ładnie to działa. Nieco bardziej skomplikowane, ale za to z różnymi bajerami jest UZebox - http://belogic.com/uzebox/

    Tak więc da się bez problemu. Też myślę, że zastosowanie SDRAM to lekka przesadza, ale pinów starczy - wręcz te pamięci wykorzystują ich mniej niż SRAMy, ze względu na multipleksowanie adresów i danych. Pinów wydaje się być sporo, ale to głównie masy (co nas nie rusza, bo przecież nie będziemy ją taktować 66MHz), a z linii danych nie musimy wykorzystywać wszystkich D0-D31, możemy tylko do D7. Co prawda tracimy 1/4 pojemności ale przy modułach o tej pojemności to bez znaczenia.
  • Poziom 27  
    trochę mnie kolega zaskoczył tym grami video co nie zmienia faktu że w dalszym ciągu uważam że to swoista egzotyka :) Choćby z racji wgrywania gier bo tyle tam nowych gier co pamięci Flash a druga sprawa że wszystkie trzeba pisać od nowa a jedyna wspólna cecha to ew. pożyczona nazwa. Co do SDRAM to jeśli kolega będzie się upierał przy niej dalej to jeśli poda adres to wówczas wyślę mu 1 szt sima-a z karty pamięci od jakiegoś servera. Są o tyle przydatne że spokojnie sobie wylutuje jedną kostkę (szeroki raster końcówek) i załatwi sprawę ramu bez używania całej baterii pamięci, oczywiście za friko. Mam tego ze 2 kg. Te które zamieścił w fotografi sa niestety dość małe. Albo też kilka pamięci pseudostatycznych które mają po 18 adresów czyli to 512KB te z kolei łatwo odświeżać bo wystarczy podać im tylko 4096 impulsów i po sprawie. Tego mam mniej ale z 0,5 kg będzie w dodatku wylutowane:) Zatem jeśli chce to dostanie jeszcze za friko pamięci.
  • Poziom 19  
    Chcę użyć ATMegi32 i ATMegi8.
    ATMega32 miała służyć za generowanie obrazu, sczytywaniu stanu dżojstików i tworzenie "świata gry”, a ATMega8 za zapisywanie do pamięci obrazu i odczytywanie go, oraz
    synchronizacje pionową i poziomom.
  • Poziom 27  
    no to coś się wyjasnia, propozycja jest aktualna więc o ile dalej jesteś zainteresowany pamięciami dynamicznymi to 4-8 "kości" mogę tobie wysłać za free każda po 512 KB adresowana tak jak zwykły SRAM ale z koniecznością odświerzania poprzez ustawianie odpowiedniego stany na CS,WE,OE łatwa do zamontowania bo z z szerokim rastrem 2-4 MB chyba starczy z powodzeniem. Te które zamieściłeś są na bank na 3,3V i z 16 bitowym słowem danych. Te które mogę tobie wysłać operują 8 bitami danych i 5V, przynajmniej na pamieci sie nie spłukasz :) Nota jest powszechnei dostępna.
    Teraz dotarło do mnie że kolega chce zrobić coś na podobieństwo układu Antic od Atari. Może wyszukać gdzieś na allegro jakąś atarynę i z niej wyrwać ten układ ? Warto się męczyć nad budową własnego kontrolera graficznego ?
  • Poziom 19  
    Wielkie dzięki rpal ale jednak pozostanę przy swoich kościach RAM.
  • Poziom 27  
    Słuchaj kolego a nie uzyskałbyś lepszych efektów gdybyś wykopał jakąś kartę CGA i ją po prostu wysterował. Miała magistralę ISA więc nie byłoby to zbyt skomplikowane. Karty powinny się jeszcze trafić na jakimś szrocie a efekt napewno miałbyś zdecydowanie lepszy. Może nawet VGA.
  • Poziom 19  
    Zrobiłem schemat.
    Sterowanie zewnętrzną pamięcią Sram przez Atmega8.
    Jeśli popełniłem jakieś błędy to napiszcie.
    Nie podłączyłem jeszcze synchronizacji.
    I mam pytanie.
    Znalazłem kod który wytwarza taką synchronizacje.
    Oto jego część(pełny kod w załączniku):
    Code:

    //To jest synchronizacja pionowa...
    _delay_us(4);
    PORTB=0b00010000;
    _delay_us(27);

    // ...a to pozioma.
    _delay_us(4);
    PORTB=0b00010000;
    _delay_us(59);

    Czy jeśli wkleje to do mojego kodu w taki sposób, to będę miał rozdzielczość 60(v) na 50(h)?:
    Code:

    for(int v=0; v<60; v++)
    {
    _delay_us(4);
    PORTB=0b00010000;
    _delay_us(27);
    for(int h=0; h<50; h++)
    {
    _delay_us(4);
    PORTB=0b00010000;
    _delay_us(59);
    }
    }