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

XMega 128 - odczyt danych z tablicy w pętli - problem z ADIW i zmiennym adresem

ASMnauka_ 25 Wrz 2015 12:40 1410 7
REKLAMA
  • #1 15019701
    ASMnauka_
    Poziom 15  
    Witam
    Męczę się już kilka godzin nad tematem i nie mogę sobie dać rady.
    O ile ręczny odczyt z tablicy jest ok tak z odczytem w pętli mam wielkie kłopoty.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W przypadku przykładu z listingu wszystko działa jak należy.
    Do zmiennej Bajt1 trafia wybrany przy LPM element tablicy.
    Jednak ADIW dodaje bezpośrednio jedynie do 63.
    Ja potrzebuję odczytać bynajmniej 120 bajtów w pętli o zmiennym adresie.
    Przypuszczam,że w grę wchodzi Z+, lub nawet RAMPZ lecz nie mam pojęcia jak to zorganizować.
    Bardzo proszę o pomoc.
  • REKLAMA
  • Pomocny post
    #2 15020285
    zagwizdow
    Poziom 17  
    W petli bedziesz zwiekszał o rozmiar elemetu w tablicy ( bajt ) a przesuniecie dodaj najpierw do zmiennej adres (czyli adres do innych rejestrów o ile nie da sie dodawac do zl,zh) do tego dodajesz poczatkowy indeks i potem dopiero w petli adiw dodajesz.
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    Cos w tym stylu.
  • REKLAMA
  • #3 15020377
    trol.six
    Poziom 31  
    Na pewno ma być instrukcja LDS? Przecież to ładuje zmienną z SRAM a nie adres? Nom, ale to jest zdajesie zapis BASCOMA i pewny nie jestem.

    To zależy jaka tablica, i czy kod ma być uniwersalny czy nie i gdzie to kopiować i czy w ogóle jest taka potrzeba.

    Kolejne bajty kopiowania z FLASH do SRAM w asm, np 120 sztuk coś w tym stylu:

    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
  • #4 15046986
    ASMnauka_
    Poziom 15  
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    zagwizdow, za Twoją radę wypociłem takie cudo.
    Oczywiście działa, ale ma dwie wady.
    1. Mogę wczytać maksymalnie 255 elementów tablicy.
    2. Nie mogę używać zmiennej dla tablicy.
    Czy jest w ogóle możliwe rozwiązanie moich 2 problemów ?
    trol.six, niestety Twój przykład się sypie.
    W rejestrze YL mam tylko indeks tablicy, a w YH jakieś bzdury.
    Odnoszę wrażenie, że adres(etykieta) tablicy musi się znajdować w rejestrze Z.
  • Pomocny post
    #5 15047136
    trol.six
    Poziom 31  
    ASMnauka_ napisał:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    zagwizdow, za Twoją radę wypociłem takie cudo.
    Oczywiście działa, ale ma dwie wady.
    1. Mogę wczytać maksymalnie 255 elementów tablicy.
    2. Nie mogę używać zmiennej dla tablicy.
    Czy jest w ogóle możliwe rozwiązanie moich 2 problemów ?
    trol.six, niestety Twój przykład się sypie.
    W rejestrze YL mam tylko indeks tablicy, a w YH jakieś bzdury.
    Odnoszę wrażenie, że adres(etykieta) tablicy musi się znajdować w rejestrze Z.

    Przecież napisałem w kodzie że lds może być niepoprawne a jest przepisane z twojego kodu.
    Ja bym dał ldi i tak zresztą masz teraz w programie.
    Rejestr Z wskazuje na FLASH a rejestr Y ma wskazywać na SRAM

    Przykład w czystym asm jaki podałem jest bezpośrednio z mojego programu.
    Niby czemu miałby nie działać? Albo xmega nie jest kompatybilna z avr,
    albo kolega umieszcza to dziwacznie w swoim kodzie. Ciężko się po tych fragmentach domyśleć.

    Natomiast używasz instrukcji sts {BAJT},R17 a to jest adres bezpośredni

    Dodane:
    Natomiast w nocie pisze że przy dostępie do adresu FLASH powyżej 64k dodatkowo potrzebny jest rejestr RAMPZ i używamy wtedy do odczytu intrukcji ELPM
  • REKLAMA
  • Pomocny post
    #6 15047699
    zagwizdow
    Poziom 17  
    Kolega wyżej podał bardzo fajną pętlę
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    Jeśli chcesz kopiować od jakiegoś adresu w tablicy to do Z dodajeszsz offset przed rozpoczęciem petli
    a w r16 masz ilosc elementów do skopiowania.
    Jeśli chcesz więcej niz 256 to musisz zrobić licznik na dwóch rejestrach które będziesz dekrementował traktując jak jedną zmienna
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod


    Wydrukuj sobie skroconą liste rozkazów - najlepiej 1-2 kartki zeby zajmowała i wtedy pisz dobierajac rozkazy
  • REKLAMA
  • #7 15080449
    ASMnauka_
    Poziom 15  
    trol.six, dziękuje za podpowiedz.
    Rzeczywiście w grę wchodzi jedynie RAMPZ, ELPM, oraz Z+.
    Najlepszy pod względem wydajności jest Z+.
    Po prostu przed pętlą dodaję offset do RAMPZ, po czym w pętli ładuję do rejestru R19 pośrednio z pamięci SRAM spod adresu wskazywanego rejestrem indeksowym Z.
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    I to wszystko, śmiga aż miło.
    Dziękuję.
    Tematu nie zamykam, być może jeszcze ktoś coś doda.
REKLAMA