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

`51 kompilator Keil zewnętrzna pamięć RAM język C

pawel_5 12 Mar 2008 22:48 1497 10
REKLAMA
  • #1 4902736
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Witam,

    Myślę próbuję, zmieniam i bez rezultatów. Problem wydaje się banalny, choć w moim odczuciu tak nie jest.

    Program napisalem tak, aby utworzył tablice w pamięci zewnętrznej za pomocą dyrektywy
     char xdata tablica[];

    Nstępnie utworzyłem wskaźniki:

    wskaznik=&tablica[0];
    i=0;
    while (i<16){
    i=i+1;
    R0=*wskaznik++;
    P1 = R0;
    czekaj(200,200);


    wnioskuję, że z każdym pobraniem zmiennej z zewnętrznej RAM powinien odczekać pewien czas (instrukcja czekaj) i powinno to pobranie zmiennej być zauważone na podpiętych pod port P0 ledach, tak się nie dzieje więc wnioskuję, że problem braku wypisywania danych które powinny być uprzednio zamieszczone w RAM wynika tylko i wyłacznie z problemu programu - brak jakiejkolwiek oznaki wysyłania bądź pobierania informacji na P0 - na P0 jest poprostu cisza.

    Piszę w Keli, tam nie trzeba wpisywać #pragma LARGE aby używał zewnętrznej pamięci RAM lecz użyć "options for target" i tam zaznaczyć LARGE.

    Proszę o pomoc bo naprawdę skończyły mi się pomysły :/
  • REKLAMA
  • #2 4902817
    mietekn
    Poziom 35  
    Posty: 1983
    Pomógł: 400
    Ocena: 161
    Opisz jeszcze raz problem i zadaj pytanie by było wiadomo na co odpowiadać ;)
  • #3 4902864
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    hmmm... tak, zapomniałem zadać konkretnego pytania.
    Czy w rozumowaniu zamieszczonym powyżej widać jakiś błąd który powoduje brak odpowiedzi ze strony pamięci zewnętrznej?

    Dodam,że przejrzalem plik .lst i widać tam, że kompliator używa instrukcji movx.
  • REKLAMA
  • #4 4903095
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    A pod jaki mikrokontroler to napisałeś? I czy masz odpowiednio podłączoną pamięć ?( sygnał ALE + RD + WR + ewentualnie zatrzask).
  • REKLAMA
  • #5 4903259
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Pytanie czy w ogole jakos ta tablice zainicializowales jakimikolwiek danymi a po drugie piszesz o porcie P0 a w kodzie uzywasz P1 to jak to w koncu jest.No i na koncu czy port masz wlasciwie skonfigurowany.Z tego co napisales nie wynika absolutnie nic.
  • REKLAMA
  • #6 4903492
    romsik
    Poziom 15  
    Posty: 116
    Pomógł: 5
    Ocena: 8
    reasmując wypowiedzi wcześniejsze:
    1.narysuj schemat
    2. pokaż go - poddaj krytyce
    3. jesli trzeba popraw i połącz wg nowego schematu
    4. sprawdź 10 razy czy fizyczny układ jest zgodny z "papierem"
    5. uruchom program mnieszymi fragmentami (np sprawdzając cy to o jest na P1 działa)
    6. popwodzenia
    7.powodzenia
    8. powodzenia
    :)
  • #7 4903689
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    I zainicjuj tablice.

    BF
  • #8 4906762
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Sprawdziłem poprawność wszystkich połączeń (używam wtykanych pinów) i okazało się, że zanikło połączenie z ALE do CLK zatrzasku. Aby sprawdzić czy winny jest Keil użyłem języka assembler - efekt był ten sam, ale na szczeście znalazłem płytke AVT i tam uruchomiłem program - zadziałał wiec poprawiłem wszystkie połączenia w mojej plytce i zaczeło chodzic!! :)
    Przepraszam za malo zrozumialy tekst, nie mam dość wprawy w zwiezłym opisywaniu problemów ale pocieszam się powiedzeniem "trening czyni mistrza".
    Dziekuję wszytskim którzy poświecili swój czas i uwagę i za dobre chęci, jak to dobrze kiedy jest możliwość podzielenia się z kimś problemem.

    Do wszystkich którzy czytają tego posta informacja: wyżej wymieniony przeze mnie sposób zgłaszania pamięci jest poprawny i działa - oczywiście wpisywanie gotowych argumentów do tablicy w RAM mija się z celem, ale tworzenie tablicy na jakieś wyniki lub informacje które otrzyma procesor podzczas działania jest jak najbardziej wskazane :)

    Pozdrawiam,
  • #9 4907255
    romsik
    Poziom 15  
    Posty: 116
    Pomógł: 5
    Ocena: 8
    Cytat:
    oczywiście wpisywanie gotowych argumentów do tablicy w RAM mija się z celem

    nie do końca masz rację
    tablicę warto zainicjować, bo fizycznie jakiś dane w nawet "pustej " tablicy są i generalnie nie znasz ich, a ewewntualne operacje na nieznanych danych moga byc nieprzyjemne w skutkach
    pozdrawwiam rs
  • #11 4910212
    pawel_5
    Poziom 13  
    Posty: 131
    Ocena: 1
    Tak zgadzam się....zbyt ogólnikowo napisałem.

    Oto przykład:
    char xdata[2][2] = {
    { 0x55, 0xff }
    {  0xff, 0x55 }
    }


    Jeśli chodzi o inicjowanie tablicy - też się zgadzam - moje przeoczenie.
    Pozdrawiam,

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z wykorzystaniem zewnętrznej pamięci RAM w mikrokontrolerze 8051 programowanym w języku C za pomocą kompilatora Keil. Autor próbował zadeklarować tablicę w pamięci zewnętrznej używając dyrektywy `char xdata tablica[];` oraz odczytywać dane przez wskaźnik, jednak nie obserwował żadnej aktywności na porcie P0, co sugerowało brak komunikacji z pamięcią. Wskazano, że deklaracja tablicy bez określenia rozmiaru jest błędna oraz że tablica powinna być zainicjowana danymi, aby uniknąć operacji na nieznanych wartościach. Poruszono także kwestie prawidłowego podłączenia sygnałów ALE, RD, WR oraz zatrzasku do pamięci zewnętrznej. Po weryfikacji i poprawieniu połączeń sprzętowych, w tym przywróceniu połączenia ALE do zegara zatrzasku, problem został rozwiązany i program zaczął poprawnie działać. Potwierdzono, że kompilator generuje instrukcje MOVX do obsługi pamięci zewnętrznej, a w Keilu konfiguracja opcji target umożliwia korzystanie z pamięci xdata bez konieczności stosowania #pragma LARGE. Zalecane jest testowanie programu fragmentami oraz dokładne sprawdzenie zgodności schematu połączeń z rzeczywistym układem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA