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

[C][AVR] Atmega128 + XRAM CY62128

narasta 01 Gru 2010 17:34 6717 21
  • #1 8813307
    narasta
    Poziom 21  
    Jak się obsługuje pamięć xram? Pytam o kwestie programową. Schemat podłączenia ramu wygląda tak:

    [C][AVR] Atmega128 + XRAM CY62128

    Założyłem zworkę Ena_ram.

    Program piszę w C w WinAvr w AvrStudio.

    Jak przenieść .data i .bss do xramu tak aby w wew pamięci został tylko stos?
  • #2 8813790
    gothye
    Poziom 33  
    Programowo ustalając adresy na jakie mają być zapisywane bajty danych w pamięci zewnętrznej RAM ,adresy ustalasz za pomocą lini A0-A16 kierunek zapisz/odczyt za pomocą WR/RD ,dane podajesz lub odczytujesz na liniach D0-D7
  • #3 8813924
    marekos
    Poziom 16  
    ATMEGA128 ma sprzętowy kontroler pamięci SRAM, definiujesz tylko odpowiednie opcje w pliku makefile. Jeśli generujesz ten plik przez WINAVR to poszukaj w nim "External Memory Options" i jest tam szczegółowo w komentarzach napisane co jak włączyć. Pamięć XRAM "zaczyna" się zaraz po wewnętrznej pamięci ram chyba od adresu 0x1100. Pamiętaj tylko o offsecie dodawanym przez kompilator.

    Pisząc program już nic nie musisz dalej kombinować, kompilator sam umieszcza zmienne w pamięci XRAM jak mu się skończy pamięć wewnętrzna.

    W przypadku AVR takie rozwiązanie z zewnętrznym RAMem ma jeden mankament, stos zawsze umieszczany jest wtedy w XRAM, a dostęp do niej jest przez magistralę multipleksowaną co powoduję że ta pamięć jest dwa razy wolniejsza od pamięci wewnętrznej, a to wpływa bardzo mocno na wydajność całej aplikacji.
  • #4 8813992
    tmf
    VIP Zasłużony dla elektroda
    Nie, kompilator sam nie umieszcza zmiennych w pamięci XRAM!!!
    Nie może tego zrobić bo segmenty danych znajdują się poniżej stosu, który jest na końcu wewnętrznej pamięci SRAM. Aby kompilator, a właściwie linker mógł z zewnętrznej pamięci RAM skorzystać trzeba przesunąć segmenty (opcja linkera section-start) lub zdefiniować własną sekcję i umieścić ją w XRAM. Co do stosu - też bajki. Stos jest zawsze tam gdzie go umieścimy, może być w wewnętrznej RAM, a tylko inne segmenty można przenieść do zewnętrznej. Polecam lekturę manuala do AVR-libc.
  • #5 8814263
    narasta
    Poziom 21  
    plik makefile tworzony jest automatycznie z avrstudio. Da się z poziomu avrstudio to ustawić w konfiguracji projektu?

    Ważne dla mnie jest, aby stos był w wewnętrznej pamięci, ponieważ cały program będzie się głównie opierał na przerwaniach i to kilku (bo Int0, dwa timery, ADC, ew USART).

    Chciałbym się właśnie nauczyć obsługiwać xram a nie znalazłem żadnej sensownej instrukcji/przykładu jak to dokładnie zrobić.

    tmf - możesz zamieścić jakiś przykład, lub rozwinąć swój post?

    Dzięki z góry za pomoc :)


    Choć z drugiej strony nawet nie koniecznie muszę przenosić .date i .bss do xramu.
    W zasadzie to potrzebuję umieścić w xram dwie tablice po kilka/kilkanaście kB na próbki z ADC.

    Rozumiem, że wystarczy wtedy tylko zrobić pointer do tablicy o adresie większym niż 0x1100? Proszę mnie poprawić jeśli się mylę.
  • #6 8814422
    tmf
    VIP Zasłużony dla elektroda
    Da się w AVR studio - w opcjach projektu masz memory settings - tam możesz zdefiniować własne segmenty, lub przesunąć już istniejące - wystarczy je ponownie zdefiniować z nowym adresem początku. Zmienne jeśli nie mają trafić do standardowych segmentów definiujesz z odpowiednim atrybutem __attribute__ ((section (".XMEM"))), gdzie XMEM to nazwa segmentu w pamięci zewnętrznej. W ten sposób możesz w niej umieścić tablice, pobierając normalnie wskaźnik. Jeśli stosu nie ruszasz, to będzie on dokładnie tam gdzie zwykle, czyli w wew. pamięci SRAM.
    Co do rozwinięcia - wkrótce Helion wyda odpowiednią książkę, tylko pewnie nie możesz tyle czekać ?:)
  • #7 8814489
    narasta
    Poziom 21  
    Wolałbym to zrobić w miarę szybko, bo muszę pokazać jakieś postępy na uczelni (czyt. projekt inż) :P

    Właśnie zauważyłem, że jest jak byk "memory settings" tylko nie wiem jak się za to zabrać.

    jak się definiuje te atrybuty i jak ustawić pamięć w konfiguracji?
  • #8 8814693
    tmf
    VIP Zasłużony dla elektroda
    Atrybuty się definiue tak jak pokazałem wcześniej - jedyne co musisz zadeklarować to sekcję, którą deklarujesz właśnie w okienku memory settings - wpisujesz jej nazwę, typ (RAM) i adres początku i końca. I to wszystko. Poczytaj też: http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_startup. Można to zrobić prościej :)
  • #9 8814784
    rpal
    Poziom 27  
    kol. autorze posłuchaj tmf-a dobrze ci radzi a z tą niby małą prędkoscią to zdecydowana przesada, wcale nie jest tak źle. Nie rozumiem tylko czemu się upierasz przy pomysle aby nie używać tej pamięci w jednolitym obszarze pamięci tylko poprzez porty. W nocie katalogowej masz opisaną dokłanie procedurę dostępu do niej z podanym gotowcem więc starczy tylko to dokladnie przestudiować jest to w części dotyczącej użycia zasłoniętego obszaru czyli od 0x00 do 0x1100. Jeśli zdefiniujesz sobie tę pamięć jako extend będziesz miał dostęp bajecznie prosty więc nie wiem po co aż tak kombinujesz bo całością dostępu zajmie się sprzęt a nie twój program. Jedna małą uwaga zatrzask musi być z grupy AHC nie HCT bo czasy propagacji mogą być zbyt duże.
    W kwestii umieszczenia stosu w extend to myślę że jesteś skazany na standartow ustawienie czyli w wewnętrznej pamięci ATMEG-i czyli nic nie trzeba definiować w AVRStudio i przyjąć domyślnie to co oferuje. Wnioskuję to stad że widzę chęć do przelaczanie banków pamięci na linii A16 zatem będzie ciekawie :) gdy akurat tam sobie ten stos umieścisz i akurat przełączysz na innych bank pamięci.
  • #10 8814862
    narasta
    Poziom 21  
    Ale ja cały czas piszę, że stosu nigdzie nie chce przenosić :)

    Potrzebuje w jakiś sposób zaalokowac gdzieś dwie spore tablice, które nie zmieszczą się w ram więc wszystko poza tymi dwoma tablicami (czyli stos, data bss i heap) moze zostać w wew ramie.

    Jeśli chodzi o użycie AHC zamiast HCT to niestety nie mam takiej możliwości ponieważ jest to gotowa płytka testowa -
    http://www.adatronik.com.pl/PRO_ATMEGA128_oferta.html
    a tam już nie mam jak tego zmieniać wiec skoro tam jest, to znaczy cze wystarczy.

    Ok - próbuje dodać pamięć tak jak pisze tmf, czyli dodaję w memory settings, w dziale memory segments - mem type sram, name .XRAM, Addres(hex) 0x1100 - 0xFFFF, ale nie chce mi przyjąć adresu wpisanego w ten sposób, bo pisze ze musi miec 6 znaków hex. Jak w takim razie wpisać tam zakres?

    atmega128 ma wyłączoną kompatybilność z m103
  • #11 8815061
    rpal
    Poziom 27  
    AHC ma ten sam rozkład pinów a co do definiowania stosu to nic nie musisz robić przyjmując wartości domyślne., potem deklarujesz zmienną wskaznikową jej z kolei przypisujesz adres powyżej 0x1100 i masz całą pamięc extend do użycia, natomiast zasłonięty "dół" jak jesteś sknerą :) za pomocą sztuczki z noty katalogowej sobie używasz.
  • #12 8815601
    narasta
    Poziom 21  
    No dobra - udało mi się to chyba uruchomić :)

    Według tego co w nocie m128 - wzkaźnik na pierwszą komórkę w xram (0x1100).

    
    #include <avr/io.h>
    #include <util/delay.h>
    #include "USART.h"
    #include "IO.h"
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    
    #define OFFSET 0x1100
    
    int main(void)
    {
    	MCUCR |= 0b11000000; 
    	
    	DDRD |= (1<<7);
    
    	USART_Init();
    
    
    	XMCRB = 0x00;
    
    	uint *p = (uint *) (OFFSET + 1); // pointer init
    	
    	uint a = 10; //pointer offset
    
    	uint value = 0xABCD; //set a value to write
    	
    	*(p+a) = value; // write the value to xram 
    
    
    	while(1)
    	{
    		USART_nl;
    		USART_PutStr(">");
    
    		USART_PutNumber(10,*(p+a));
    		USART_PutStr("(0x");
    		USART_PutNumber(16,*(p+a));
    		USART_PutStr(")");
    		USART_PutStr(" @ ");	
    
    	
    		USART_PutNumber(10,p+a);
    		USART_PutStr("(0x");
    		USART_PutNumber(16,p+a);
    		USART_PutStr(")");
    		USART_PutStr("<");
    		USART_nl;
    
    		_delay_ms(100);
    	}
    
    	return 0;
    }
    


    W terminalu otrzymuję:

    
    >-21555(0xabcd) @ 4373(0x1115)<
    
    >-21555(0xabcd) @ 4373(0x1115)<
    
    >-21555(0xabcd) @ 4373(0x1115)<
    
    >-21555(0xabcd) @ 4373(0x1115)<
    

    i tak w kółko oczywiście

    nie wiem dlaczego mi liczby dziesiętne wyświetla źle ale to już pewnie kwestia błędu konwersji itoa()...

    Gdy się zdejmie zworkę 'xram enable' to zczytuje jakieś śmieci, więc chyba ok :)


    
    >5653(0x1615) @ 4373(0x1115)<
    
    >5653(0x1615) @ 4373(0x1115)<
    
    >5653(0x1615) @ 4373(0x1115)<
    


    Wnioskuję więc, że chyba działa poprawnie
  • #13 8818431
    rpal
    Poziom 27  
    proponuję ci sprawdzić czy to samo odczytujesz co zapisujesz przy różnych czasach trwania sygnałów WE i OE bo ten zatrzask z seri HCT to wcale nie jest aż tak obojętny dla poprawnego działania całości układy. Zobacz w notach jaki jest czas propagacji sygnałów na jego we/wy i porównaj z czasami dla ALE i oraz WE,OE w nocie dla procka. Wolnego marginesu wcale nie jest dużo.
  • #14 8819117
    narasta
    Poziom 21  
    Ok. Tak - mówisz tylko o czasach propagacji, ale mimo tego, że HCT ma swoje czasy narastania/opadania sygnałów, to i tak obsługa xramu nadąża. Potrzebuje zapisywać coś do pamięci z częstotliwością rzędu 200kHz, więc nie wiele chyba.

    Muszę się tylko zastanowić jak obsłużyć więcej niż 64 bajty SENSOWNIE (chodzi o adres A16). W zasadzie chodzi tylko o przełączanie jednego bitu(A16).
  • #15 8820202
    tmf
    VIP Zasłużony dla elektroda
    W przypadku wykorzystania sprzętowego interfejsu XMEM częstotliwość odwoływania się do pamięci jest bez znaczenia - wszystkie sygnały są generowane na podstawie zegara procesora. Oczywiście stosowanie zatrzasku serii HCT zamiast AHCT może zadziałać, ale działa na granicy - to znaczy, że w pewnych sytuacjach twój układ się wykrzaczy. Oczywiście to zależy od napięcia (te znamy), a przede wszystkim częstotliwości taktowania procesora.
    Sensownie więcej niż 64kB obsłużysz w XMega, w ATMega można robić tylko protezy - np. 32kB na stałe zamapowane, a pozostałość jako wymienne 32kB strony pamięci. Upierdliwe, szczególnie z programistycznego punktu widzenia. Jeśli masz tak duże potrzeby na RAM to może czas zmienić rodzinę procesoró - na AVR32 albo ARM?
  • #16 13148097
    JohnCTN
    Poziom 17  
    Witam, odświeżam ten temat, ponieważ mam podobny problem i podobne pytanie :)

    potrzebuję podpiąć do ATxmega128a1 zewn. SRAM o pojemności 2MBx8bit, w związku z tym muszę użyć dwóch zatrzasków (np. 74AHC573).
    Pamięć SRAM, którą chcę użyć to CY62167DV30.

    SRAM wymaga, by długość impulsu zapisu była min. 35ns. Przy taktowaniu procesora 32MHz czas cyklu EBI 31.25ns (CLKx1) lub 15.6ns (CLKx2). W pierwszym przypadku lekko za szybko, ale mógłbym zrobić (CLKx2) i 2 waitstate co daje mi czas 46.8ns - super jest OK.

    moje pytanie jest takie:

    czy zatrzaski 74AHC573 przy tak, krótkich impulsach będą działać poprawnie ?
    czy ktoś już cos takiego robił i może potwierdzi prawidłowe działanie?

    Czy po prostu martwię się niepotrzebnie i wszystko będzie działać ok ?

    pozdrawiam

    JohnCTN
  • #17 13148318
    Konto nie istnieje
    Poziom 1  
  • #18 13148368
    JohnCTN
    Poziom 17  
    Witaj Marek_Skalski
    Pamięć, którą ja zastosuje jest nieco szybsza (45ns) natomiast masz racje odnośnie układu LVC a AHC, szybko poprawie projekt na SN74LVC573 :) Dla mnie najważniejszą informacją jest , ze to działa :)

    dziękuję za szybką odpowiedź.
  • #19 13148385
    tmf
    VIP Zasłużony dla elektroda
    Działa, pamiętaj o naprawdę szybkich zatrzaskach. Bo strobu dla zatrzasku nie da się wydłużyć WSami. Można nimi skompensować powolność pamięci. Zastosuj też XMEGA z serii U - ma poprawione EBI i wdziałają w niej wszystkie konfiguracje wymienione w nocie.
  • #20 13731835
    JohnCTN
    Poziom 17  
    muszę wrócić do tego tematu bo coś mi tu jeszcze się nie zgadza :(

    Pamięć SRAM posiada sygnały BHE i BLE w dokumentacji doczytałem się (strona 3) , ze gdy chce organizacje pamięci 8 bitową i podepnę do sygnału !BYTE = 0 to to sygnały BHE i BLE nie są używane i nie powinny być do niczego podpięte, natomiast kilka kartek dalej z tabelki (strona 11) wynika, ze może lepiej podpiąć BHE I BLE do masy zamiast je "zawiesić w powietrzu" jak uważacie ?

    druga sprawa to sygnały !CE1 i CE2. xmege można podpiąć poprzez EBI z tą pamięcią, zastosowałem jak to wcześniej pisałem zatrzaski i tryb Adres 0, 1 i 2.
    pewnie mógłbym podpiąć sygnały na !CE1 do masy i CE2 do Vcc lub drugi sposób taki, ze podpinam CE2 do Vcc i !CE1 do xmegi do sygnału CS0 w EBI, pytanie mam natomiast czy jeżeli podepnę sygnały !CE1 i CE2 na stale ustawiając im sygnały to mogę odzyskać 4 porty z xmegi, które służą jako CS0-CS3 ??

    Pytam bo jedna osoba powiedziała, ze mogę odzyskać te porty dla swoich potrzeb np. jako I/O, natomiast druga osoba powiedziała mi, ze nie odzyskam tych portów.

    wiec jak w końcu jest ?
  • #21 13738657
    tmf
    VIP Zasłużony dla elektroda
    Możesz na stałe odblokować pamięć sterując sygnałami CE, lecz ma to pewne wady:
    - pamięć nigdy nie przechodzi w uśpienie i w efekcie zużywa więcej prądu,
    - jeśli na magistrali są inne układy to to nie zadziała, bo linie danych pamięci nigdy nie wejdą w HiZ,
    - nie masz możliwości sterowania mapowaniem pamięci w przestrzeń adresową mikrokontrolera - każde odwołanie do adresu leżącego poza wewnętrzny SRAM trafi do pamięci zewnętrznej - zwykle nie jest to problemem, chyba, że masz dziury w adresacji.
    Część sygnałów CS można zamienić na zwykłe linie IO - w XMEGA serii U jest możliwość konfiguracji liczby sygnałów CS/linii adresowych. Poza tym jeśli potrzebujesz więcej pinów IO to możesz zastosować jeden z trybów LPC (low pin count) kontrolera XMEGA - wymaga to zastosowania np. dwóch zewnętrznych zatrzasków.
  • #22 13742452
    JohnCTN
    Poziom 17  
    zrobiłem w końcu tak, ze CE2 podpiąłem do VCC a !CE1 do PH4. Na interfejsie EBI mam tylko jedną pamięć wiec podłączenie na stale sygnałów nie powodowałoby żadnego konfliktu. Co do potrzebnych linii I/O to w sumie nie mam potrzeby ich używania (niczego mi nie brakuje) ale wiadomo, może z czasem stwierdzę ze byłoby fajnie cos jeszcze dodać i wtedy miałbym problem. Ogólnie mówiąc lepiej jest jak się ma kilka Linii I/O w zapasie.
REKLAMA