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

[atmega128L][C] problemy z pamięcią równoległą

BeerBear 18 Sie 2008 19:43 2364 9
REKLAMA
  • #1 5451107
    BeerBear
    Poziom 12  
    Witam,
    Jak w temacie mam problem z pamięciami równoległymi.
    Mam podpięte 3 pamięci równoległe(64kB) i zapisuje w nich obraz z kamery. Używam 3 pamięci ze względu na rozmiar zdjęcia.
    Następnie dane zgromadzone w pamięciach przesyłam przez rs232 na kompa i uzyskuje zdjęcie. Pamięci lutowane były na płytce uniwersalnej.
    Problem polega na tym, że otrzymane zdjęcia mają pionowe zakłócenia widoczne na zdjęcia zamieszczonych poniżej.
    Każda pamięc działa dobrze osobno. Testowalem je przez robienie zdjęc na mniejszych rozdzielczościach.
    Przy próbie zapisu/odczytu do dwóch pamięci(dowolnie wybranych) wpływ na pojawienie się zakłócenia miała kolejnośc zapisu/odczytu tych pamiec, tzn. dla jednej konkretnej kolejności zapisu/odczytu otrzymuje dobre zdjęcie, a dla innych kombinacji zdjęcie zawiera zakłócenie.
    Dla trzech pamięci, niezależnie od kolejności zapisu/odczytu występuje zakłócenie na zdjęciu.
    Zaobserwowałem, że w zależności od kolejnosci wyboru pamięci, zakłócenie znajduje się w innym miejscu na zdjęciu.

    Czy powodem takiego stanu rzeczy, może byc sposób prowadzenia połączeń na płytce uniwersalnej?

    Pozdrawiam,
    BB
  • REKLAMA
  • #2 5453603
    candle
    Spec od monitorów
    albo skopales cos z polaczeniami (zakladam ze sa podlaczone miedzy sobia rownierz rownolegle, a wybor konkretnej sztuki dokonujesz przez sygnal CE)
    czy ustawiasz stan CE na wysoki nim ustawisz kolejnej pamieci CE na niski?
  • REKLAMA
  • #3 5453719
    Geralt
    Poziom 14  
    zgadzam się z candle, jeśli zastosowałeś typowy model podpięcia pamięci to raczej może być jakiś mały błąd w kodzie związany z aktywacją pamięci.

    ewentualnie może przesyłając dane do kompa gubisz gdzieś jakąś paczkę, ale to raczej nie powinno mieć miejsca

    nie wiem może też masz jakieś wolne pamięci i jak zaczniesz je przełączać to nie wydalają w stosunku do procka, atmel ma możliwość ustawiania czasu dostępu do zewnętrznej pamięci RAM

    co do prowadzenia ścieżek na płytce jeśli tylko popodpinane wszystko jest dobrze sposób prowadzenia ścieżek nie powinien mieć większego wpływu, to nie jest 100 MHz FPGA żeby trzeba było patrzeć na detale prowadzenia ścieżek.
  • REKLAMA
  • #4 5455688
    BeerBear
    Poziom 12  
    Witam,
    Połączenia są dobrze, sprawdzałem każdą pamięc osobno(bez wyjmowania pozostałych z podstawek) i każda działa poprawnie(dobre zdjęcia wychodzą). Nie zmieniam miejscami pamięci, każda cały czas jest w swojej podstawce w konkretnym miejscu na płytce. Testowałem każdą pamięc przez aktywację odpowiedniego sygnału CE. Wykorzystuje też bity SRW, które wydłużają ilosc cykli przy zapisie i odczycie.

    Przy jednoczesnym wykorzystywaniu dwóch pamieci, wybieram je sygnalem CE. Gdy do pierwszej pamieci zapisze dane, wyłączam ją sygnałem CE(HIGH) i potem włączam drugą pamiec CE=LOW i zapisuje do niej dane. Poniewaz dysponuję 3 pamieciami, kombinacji z użyciem tylko 2 pamieci(jedna pamiec jest odłaczona, ale znajduje się cały czas w układzie) jest 6. Z tych 6 możliwości tylko przy jednej konkretnej kolejności wyboru pamięci wychodzą dobre zdjęcia(zdjecie 3_2.jpg, 3 i 2 oznacza tu konkretną kolejnośc wyboru pamieci, które znajdują się w konkretnym miejscu na płytce), przy pozostałych występuje to zakłócenie widoczne na zdjęciach w pierwszym poście.
    Dodatkowe informacje:
    Pamiec rownoległa: BS62LV1027
    Atmega128L: 3.3V, 4MHz
    Zatrzask: HC573

    Pozdrawiam,
    BB
  • REKLAMA
  • #5 5455720
    candle
    Spec od monitorów
    pamieci za wolne nie sa, wiec mozesz odpuscic zabawe z wydluzaniem czasu zapisu
    chyba ze martwi cie zatrzask
    tymczasem... sytuacje rozjasnil by nieco kawalek schematu na ktorym beda polaczenia procek-pamiec
    jeszcze taka obserwacja...
    te "zaklucenia" wygladaja jak kolejne adresy ktore zamiamiast na magistrale adresow poszly na magistrale danych...
    mozesz miec problem z zatrzaskiem...
    co wiecej - podejrzewam ze twoj problem wystepuje rownierz przy tej "jedynie dobrej" kolejnosci, ale poza trescia obrazu ktory cie interesuje
    zmien sobie szerokosc obrazu na 256 pixeli, powinienes zobaczyc piekny gradient...
  • #6 5455890
    BeerBear
    Poziom 12  
    Jak pisałem wczesniej robione to było na płytce uniwersalnej, także schemat wrzuce później jak bede miał czas zeby go narysowac.

    Jesli chodzi o zatrzask, to brałem to pod uwagę. Nawet w dokumentacji do atmy128 w rozdziale dotyczącym pamieci AVR pisze, zeby stosowac szybsze zatrzaski przy wyższych częstotliwościach. Wcześniej używałem kwarcu 8MHz i tez miałem zakłócenia, zeszłem na 4MHz i dalej są. Używałem równiez szybszego zatrzasku(AC573), ale zakłócenia dalej występują.

    Dziwi mnie, że zdjęcia robione na mniejszej rozdzielczosci, dla których używam tylko jednej pamięci wychodzą. Z tego wynikałoby, że zatrzask musi działac dobrze i połączenia też.

    Mam też włączony bit XMBK(w rejestrze XMCRB), tylko nie wiem dokońca czy jest on potrzebny czy nie?

    BB
  • #7 5480312
    Korowiow_83
    Poziom 10  
    Witam,
    Mam ten sam problem co kolega Beer Bear. Na zdjeciu otrzymuje to samo zaklocenie. Uzywam 2 pamieci rownoleglych po 64kB + zatrzask 573 . Caloscia steruje ATMEGA 64 16MHz.
    Wyeliminowalem częśc sprzętową, ponieważ sprawdziłem wszystkie połączenia na płytce kilka razy i nie znalazłem żadnego blędu.
    Wiec pomyślalem sobie ze wina moze tkwic w kodzie a dokladniej w wstawkach asemblerowych, ktore stosuje przy zapisie i odczycie z pamięci. Probowalem tez zapisywac i odczytywac z pamieci przy pomocy komend w C , ale efekt byl ten sam.

    Poniżej przedstawiam kod:
    a) zapis do pamieci:
    unsigned int volatile adres_zapis=0x1388;
    SIGNAL (SIG_INTERRUPT6)
    {
    asm volatile("st %a0, %1" :: "e"((void*)adres_zapis), "r"(PINF));
    adres_zapis++;
    }

    b) odczyt z pamieci:
    unsigned int volatile adres_odczyt=0x1388;
    for(i=0; i<60000; i++)
    {
    asm("ld %0, %a1" : "=r"(tablica[0]): "e"((void*)adres_odczyt));
    adres_odczyt++;
    }

    Probowalem to tez zrobic w C ponizej przedstawiam kod:

    a)zapis do pamieci:
    volatile unsigned char* adres_zapis = (void*)0x1388;
    SIGNAL (SIG_INTERRUPT6)
    {
    *adres_zapis++=PINF;
    }
    b) odczyt z pamieci:
    volatile unsigned char* adres_odczyt = (void*)0x1388;
    for(i=0; i<60000; i++)
    {
    USART1_send_data(*adres_odczyt);
    adres_odczyt++;
    }

    Bylbym wdzieczny za wszelkie sugestie odpowiedzi z Waszej strony
    Pozdrawiam,
  • #8 5485659
    candle
    Spec od monitorów
    wszystko pieknie, ale brak danych na temat kiedy jest realizowane przelaczenie bankow i jak wyglada inicjalizacja interfejsu xmem
    skad taki adres startu?
    przy atmega128 i atmega64 ramend jest zdefiniowany na 10ff, wiec wasz xmem zaczyna sie od 1100
    jesli teraz robicie sobie zapis w sposob ciagly i wykrywacie ze czas na przelaczenie banku, to przy jakim adresie?
  • #9 5487765
    BeerBear
    Poziom 12  
    Widzę, że temat nie dotyczy tylko mnie.
    Mi osobiście nie udało się jak narazie jeszcze wyeliminowac tych zakłóceń, także nie udziele pewnie pomocnej rady.

    Korowiow83: Nie napisałes jakiego zatrzasku używasz, spróbuj wersję AC573, mi osobiście to nie pomogło ale .... Kody wydają sie poprawne i skoro sprawdziłeś połączenia to ja więcej nie pomogę.

    Candle: Ja podobnie jak kolega Korowiow nie zaczynam zapisu/odczytu do pamiecie zewnetrznej od adress 1100h ale to chyba nie jest błąd, tak mi się wydaje. Pierwszy raz bawię się pamięcia zewnętrzna. Pamiec xmem zaczyna się od 1100h, ale to nie znaczy przecież, że zapis/odczyt musi zaczynac się od tego miejsca?
    Poniżej zamieściłem moją inicjalizację pamięci, według mnie poprawną:

    
    void Memory_init(void)
    {
         MCUCR=(1<<SRE);//włączenie pamieci
         XMCRA=0x00;
         XMCRB=0x80;//włączona kontrola magistrali bit XMBK
    	 
    }


    Jeśli chodzi o przełączanie banków pamięci, dokonuję tego(gdy zapiszę już do danej pamięci odpowiednią liczbę bajtów) wyłączając daną pamiec używając tylko bitu CE i załączając bit CE kolejnej pamieci. Pamieci inicjalizuję tylko na początku programu, w trakcie przełączania się miedzy pamięciami nie wykonuję żadnej inicjalizacji. Przed skorzystaniem z kolejnej pamieci ustawiam sobie odpowiednio adres zapis/odczyt.
    Dalej nie wiem w czym tkwi problem, może coś ze stosem...

    BB
  • #10 5489199
    candle
    Spec od monitorów
    mozesz sobie zacczac zapis od dowolnego adresu, ale pamietaj ze nie masz dostepu do pelnych 64k pamieci wiec tym samym sam sobie zmiejszasz rozmiar banku (ktora w twoim przypadku ma 128k na kostke i dwa wejscia CS)
    co wiecej od czasu wybrania kostki do czasu jakiegokolwiek udanego odczytu/zapisu ma minac okreslony czas - mam nadzieje ze to uwzgledniasz
    pisanie natomiast ze "przelaczanie bankow dokonujesz tak, ze jak zapiszesz odpowiednia (przeciez kazdy wie jaka jest odpowiednia) ilosc bajtow wylaczasz jedna i wlaczasz druga" niewie wnosi do tematu
    wolalbym kawalek programu ktory to robi
    bardzo brakuje konkretow...
REKLAMA