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

MOVC nie obsługuje zewnętrznej pamięci????

kjn6000 25 Kwi 2005 20:32 1784 13
  • #1 25 Kwi 2005 20:32
    kjn6000
    Poziom 14  

    Zbudowałem system z uP architektury `51 z zewnętrzną pamięcią programu i danych. uP to aduc812.
    Sygnały PSEN i RD są połaczone przez dwie bramki i wysterowują kość pamięci sdram. A wszystko po to aby procek mógł wykonać program który sam sobie wgra np przez rs, kto jest w temacie to zapewne rozumie o co chodzi. Rozwiązanie jest typowe dla procesorów serii `51 dwa zatrzaski itd.. Włąsciwie do schematu to nie ma co się przyczepić.
    Odczyt z pamieci danych zewnętrznej dziła bez problemu jak i zapis. Natomiast procesor nie chce pobierać rozkazów z zewnętrznej pamięci programu. Odczyt z miej nie działa.
    Sprawdziłem oscyloskopem i sygnał psen jest.
    Procesor posiada wewnętrzną pamieć programu 8k i według producenta moja zewnętrzną pamięć danych powinien widzeć powyżej tych 8k czyli od adresu 2000h.
    Niestety to tylko teoria.
    Może ktoś wie o co chodzi może macie jakieś doświadzenia w tej dziedzinie, sam nie daje rady.
    Chcę załważyć że procek mozna wystartować z zewnętrznej pamięci danych z pominięciem tego co jest w środku, jednak to też nie działa nie wykonuje zewnetrznego programu.

    0 13
  • #2 25 Kwi 2005 20:46
    LordBlick
    VIP Zasłużony dla elektroda

    Hmmm... Schemat bardziej działa na wyobraźnię... ;)

    0
  • #3 25 Kwi 2005 20:49
    Dexter77
    Poziom 28  

    Zeby uC mogl korzystac z zewn.pamieci programu pin EA musi byc w stanie niskim. Przed wykonaniem instrukcji movc trzeba ustawic DPTR ktory wskazuje wtedy spod jakiego adresu pobierasz dana. A jesli chcesz wykonywac program umieszczony pod adresem 2000h wykonaj instrukcje skoku jmp 2000h
    Pozdro
    Dexter

    0
  • #4 25 Kwi 2005 20:50
    kjn6000
    Poziom 14  

    Dzisjaj nie mam możliwości zamieścić schematu zrobie to jutro bo muszę go zaktualizować.

    0
  • #5 25 Kwi 2005 21:19
    olekewaagata
    Poziom 25  

    Jeśli pin EA zostanie na masie podczas resetu (program na zewnątrz) to licznik rozkazów startuje od zera a nie od jakichs innych wartosci. Przeciez tłumaczenie że jesli procek ma 4k wewnętrznej pamięci to z zewnętrznej bedzie wykonywał program powyżej tej 4k jest bzdurą. A gdyby procek miał swojej wewnętrznej pamięci np 64k to z zewnętrznej juz by nie poszedł ?, bo gdzie niby miał by adresować.
    Program zawsze po resecie idzie od zera czy to z zewnętrzną czy wewnętrzną pamięcią.

    0
  • #6 26 Kwi 2005 03:30
    kjn6000
    Poziom 14  

    Zgadzam się z Tobą olekewaagata masz rację że procesor kiedy ma stan niski na pinie EA startuje od zera programu zewnętrznego a gdy jest w stanie wysokim to z programu wewnątrz. Dodatkowo w stanie wysokim przy resecie startuje z wewnątrz i widzi dalej za pamięcią wewnętrzną pamięć danych zewnętrzną i robiąc skok program powinien ruszyć dalej.
    Co do ustawiania dptr to terz wiem o co chodzi jednak nie mogę odnaleźć błędu.
    Jutro zamieszczę schemat a program którym testuje pamięć wygląda tak:
    mov dptr,#0000h
    mov dpp,#00h
    mov a,#12h
    movx @dptr,a
    mov a,#00h
    mov dptr,#2000h
    mov dpp,#00h
    movc a,@a+dptr

    I tak mając 8k wewnątrz procka pin ea stan wysoki wpisując 12h do 0000h pamięci danych powinienem ją mieć pod adresem 2000h pamięci programu. Ciężko mi przejrzyście to wytłumaczyć bez schematu :-)

    0
  • #7 26 Kwi 2005 08:14
    Dexter77
    Poziom 28  

    Cos przekombinowales i to ostro. Instrukcja movc potrafi tylko odczytywac a z tego co zrozumialem chcesz ta instrukcja zapisac akumulator pod adres 2000h ?
    Poza tym jak napisalismy wczesniej zeby procesor mogl korzystac z zewnetrznej pamieci pin EA MUSI byc w stanie niskim. Bez tego procesor po przekroczeniu licznika rozkazow >2000h nie bedzie pobieral rozkazow z zewnetrznej pamieci programu tylko sie zapetli i skoczy pod adres 0000h powodujac reset.
    Chyba tez cos namieszales z adresami. Jezeli uzywasz zewnetrznej pamieci RAM zarono jako pamieci danych jak i pamieci programu adresy nie moga sie pokrywac ! Na to wskazuje ciag instrukcji ktory przedstawiles. Bez schematu nie ruszymy tego problemu bo wyglada na to ze nawarstwilo sie tu kilka problemow.
    Pozdro
    Dexter

    0
  • #9 27 Kwi 2005 08:30
    Dexter77
    Poziom 28  

    No to troche wyjasnia.Pamiec RAM w doslownym znaczeniu masz od adresu 0000h do 2000h Obslugujesz ja instrukcjami MOVX. Gdy EA ustawisz w stan niski to procesor po przekroczeniu licznika rozkazow 2000h (8kB wewn. pamieci) zacznie sie dobierac do kosci 62256 jako do zewn. pamieci programu. Tej pamieci zostaje Ci 24kB (32-8) Do zaladowania tego programu musisz uzyc bootloadera. Np. takiego ktory z uarta odbierze dana i instrukcja movx umiesci w tej pamieci. Do odczytu stalej ktora bedzie sie znajdowac w tej pamieci programu uzywaj instrukcji movc. Zeby zaczac wykonywac program z pamieci powyzej 2000h musisz wykonac instrukcje jmp.
    Pozdro
    Dexter

    0
  • #10 27 Kwi 2005 11:07
    kjn6000
    Poziom 14  

    Dokładnie też tak myslę. Tylko jak sprawdzić przy pomocy prostego programu że procesor dane zapisane do zewnętrznego ramu widzi tez w zewnętrznym romie.
    Ten programik który podałem wczesniej w moim mniemaniu powinien zwracać liczbę zapisana w komórce pamięci romu i ramu. Jednak zbojkotowaliście go. Teraz sam zaczynam głupieć i nie wiem jak ten problem ruszyc.

    Dodano po 10 [minuty]:

    Napisałem programik który kopiuje program z układu od adresu 0000h do ram 62256 też pod ten sam adres.
    Program najpierw resetuje dwie diody a potem czeka na przycisk po którym wykonuje ten właśnie podprogramik który zamieściłem.
    Program działa na 100%. Bo jeśli w debugerze sprzętowym podejrzę pamięc ram to faktycznie tam jest mój program, ale nie ma go w rom zewnętrznym od adresu 2000h.
    Przynajmniej debuger-em nie jestem w stanie nic podejżeć pokazuje zawsze ffh w każdej komórce.

    ram: ;początek programu
    call clr_lcd
    mov a,#000h ;procedury wyswietlacza
    setb acc.7
    call zapis_kom_lcd
    mov dptr,#napis1
    call zapis_stringu ;koniec procedur lcd
    mov a,#00h
    mov r0,#64h
    mov dptr,#0000h ;ustawienie dptr na adres 0000h
    mov dpp,#000h
    ram2:
    mov a,#00h
    movc a,@a+dptr ;pobranie zmiennej z pamieci rom w układzie do a
    movx @dptr,a ;wysłanie jej do ram poza układ pod ten sam adres
    inc dptr ;zwiększenie dptr
    mov a,dph
    cjne a,#03h,ram2 ;zapętlenie programu kopjującego do 030000h komórek

    ram3:
    mov a,#040h ;procedura wyświetlenia napisu końcowego
    setb acc.7
    call zapis_kom_lcd
    mov dptr,#napis2
    call zapis_stringu

    0
  • #11 27 Kwi 2005 14:08
    jj
    Poziom 19  

    Z ADuC812 nigdy nie miałem do czynienia, moje wnioski wysnułem na podstawie pobieżnego przejrzenia dokumentacji tegoż, oraz znajomości innych mikrokontrolerów z rodziny '51.
    Moim skromnym zdaniem występuja tutaj dwa problemy.

    1. Sygnał !CE dla układu pamięci 62256 (U4)
    Jak wynika z dokumentacji (stosowne rysunki poniżej), ADuC812 podczas odczytu zewnętrznej pamięci programu NIE wystawia na P2 zawartości rejestru DPP, lecz od razu PCH bądź DPH. Zatem U4 przy odczycie pamięci programu będzie uaktywniany tylko wówczas, gdy wartość adresu będzie mniejsza od 0x100.


    2. W przypadku pracy mikrokontrolera (nie wiem czy ADuC, ale inne z rodziny tak mają) z wewnętrzną pamięcią programu, obszar pamięci zewnętrznej o rozmiarze pamięci wewnętrznej, począwszy od adresu 0x0000, jest przesłaniany przez pamięć wewnętrzną (adres wystawiany na zewnątrz jest taki jak wartość licznika rozkazów bądź rejestru DPTR, bez przesunięcia o rozmiar pamięci wewnętrznej).

    Zatem kod:

    mov dptr,#0000h
    mov dpp,#00h
    mov a,#12h
    movx @dptr,a
    mov a,#00h
    mov dptr,#2000h
    mov dpp,#00h
    movc a,@a+dptr

    powinien wyglądać tak:

    mov dptr,#2000h
    mov dpp,#00h
    mov a,#12h
    movx @dptr,a
    mov a,#00h
    mov dptr,#2000h
    movc a,@a+dptr

    ale to zadziała tylko po rozwiązaniu problemu 1.

    0
  • #13 29 Kwi 2005 15:57
    kjn6000
    Poziom 14  

    jj może masz pomysł jak ten problem rozwiązać w elektryczny sposób.
    Chodzi mi o ten nieszczęsny sygnał PSEN dla kości U4?

    0
  • #14 03 Maj 2005 11:50
    jj
    Poziom 19  

    kjn6000 napisał:
    jj może masz pomysł jak ten problem rozwiązać w elektryczny sposób.
    Chodzi mi o ten nieszczęsny sygnał PSEN dla kości U4?


    Sygnał PSEN czy raczej !CE?

    Wydaje mi się, że aby rozwiązać problem sprzętowy wystarczy dwuwejściowa bramka AND: do jednego wejścia łączysz sygnał PSEN, do drugiego wejścia sygnał !IO0 a z wyjścia bramki sterujesz pin !CE układu U4.

    0