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

Jak zdefiniować tablicę danych w ROM w asemblerze dla PIC?

milik 28 Lip 2006 20:02 2329 6
REKLAMA
  • #1 2859737
    milik
    Poziom 23  
    Posty: 637
    Pomógł: 71
    Ocena: 58
    Witam
    Od kilku dni uczę się asemblera w środowisku MPLAB dla mikrokontrolerów PIC i napotkałem problem. Nie potrafię zdefiniować tablicy danych w ROMie. Zaznaczam, że googlowałem już dość dużo i sam nie potrafię sobie pomóc. Prosiłbym, aby ktoś na malutkim przykładzie wytłumaczył mi jak taką tablice zdefiniować i jak z niej skorzystać.
  • REKLAMA
  • Pomocny post
    #2 2860312
    bis
    Poziom 21  
    Posty: 274
    Pomógł: 54
    Ocena: 3
    Pic Picowi nierówny, tablice można wykonać i operowac nimi na rózne sposoby. Na stronie Microchipa poszukaj Aplication Note "AN716". Tam jest rozdział zarówno o tablicach zorganizowanych przy pomocy rozkazu RETLW (powrót z załadowaniem rejestru)i jak to użyć(dla wszystkich PIC-ów), jak i o operowaniu na tablicach przy użyciu dedykowanych rejestrów (dla PIC18...)
    bis
  • REKLAMA
  • #3 2861103
    milik
    Poziom 23  
    Posty: 637
    Pomógł: 71
    Ocena: 58
    Jak dla mnie to to, co znajduje się w tym dokumencie jest niezrozumiałe. Można nawet powiedzieć, że masło maślane.
  • REKLAMA
  • Pomocny post
    #4 2862052
    yuleeda
    Poziom 14  
    Posty: 47
    Pomógł: 9
    Nie wiem, czy chodzi o pamięć programu Flash EEPROM, czy o EEPROM na dane.

    Pamięć danych zaprogramujesz wczytując plik bin/hex do IC-Proga (menu File->Open Data File...) przed programowaniem.

    Odczyt z EEPROMu (pic16f84a)
    BCF STATUS, RP0 ; Bank 0
    MOVLW adres_bazowy_tablicy ;
    ADDLW indeks_tablicy ; albo odpowiednie ADDWF
    MOVWF EEADR ;
    BSF STATUS, RP0 ; Bank 1
    BSF EECON1, RD ; odczyt
    BCF STATUS, RP0 ; Bank 0
    MOVF EEDATA, W ; W = EEDATA


    W pamięci programu oczywiście też można przechowywać dane, ale moim zdaniem nie jest to dobre rozwiązanie, ponieważ urządzenia ze Standard Flash nie mają odpowiednich mechanizmów programowego zapisu/odczytu pamięci programu, a wykonywanie instrukcji typu movlw, retlw zajmuje dużo miejsca i jest raczej trudne w implementacji.
  • REKLAMA
  • #5 2862515
    milik
    Poziom 23  
    Posty: 637
    Pomógł: 71
    Ocena: 58
    Właśnie o tablice w pamięci programu mi chodziło. Zadowolę się samym jej odczytem. Przykład, który podałeś wyżej z pewnością się przyda, bo do EEPROMu jeszcze nie doszedłem a na pewno kiedyś dojdę. Wiem już, że cała tablica musi być na jednej stronie pamięci i tu przydaje się polecenie ORG. Wiem również, że jest tu potrzebny licznik (?) PCL. Co dalej?
  • #6 2862516
    bis
    Poziom 21  
    Posty: 274
    Pomógł: 54
    Ocena: 3
    tablica danych w ROM ma sens wtedy gdy mozna pobierać z niej dane jakoś ją indeksując. Aby cokolwiek pobrac z ROM trzeba go jakoś zaadresować. We wszystkich PIC-ach adresować ROM można przez ProgramCounter, oraz w części PIC-ów istnieją dedykowane rejestry pozwalające zaadresować ROM i odczytac zawartość tak zadresowanej komórki. W tym dugim przypadku tablice można zdefiniowac uzywając metainstrukcji asemblera "db" i "dw" ("defina byte" i "define word"). W pierszym przypadku (adresowanie za pomocą ProgramCounter) kolejne elementy bajtowej tablicy definiuje się za pomocą instrukcji "retlw", odczyt danej(bajtu) z zadanego indeksu odbywa sie za pomocą skoku do dynamicznie wyliczanego adresu (początek tablicy + index) a tam siedzi instrukcja powrotu z załadowaniem właśnie tego bajtu, ostateczny efekt jest taki ze rejestrze W mamy indeksowany bajt z tablicy. W AN716 jest odpowiedni kawałek kodu który to robi. Kiedyś było to opisane w jakimś drukowanym manualu Microchipa ale nie pomnę tytułu. Nie istnieje jeden najlepszy sposób kodowania dostępu do tablic bo wszystko zależy od potrzeb i wymagań. Sposób drugi, prostszy ideowo, jest dostępny tylko w wybranych modelach PIC-ów, i do tego może byc wolniejszy od pierwszego. Pierwszy sposób jest możliwy do zrealizoania na wszystkich PIC-ach, ale jednorazowo jest to dostęp tylko do tablic bajtowych.
    bis
  • #7 2864948
    milik
    Poziom 23  
    Posty: 637
    Pomógł: 71
    Ocena: 58
    Udało mi się w końcu zrobić tą tablice. Wykorzystałem do tego ‘retlw’ i adresowanie za pomocą PC. Dziękuję wam za pomoc.

Podsumowanie tematu

✨ Dyskusja dotyczy definicji i wykorzystania tablic danych w pamięci programu (ROM) mikrokontrolerów PIC w asemblerze w środowisku MPLAB. Wskazano, że sposób implementacji tablic zależy od modelu PIC. Dla wszystkich PIC-ów można stosować tablice zorganizowane za pomocą instrukcji RETLW, gdzie każdy element tablicy jest reprezentowany przez instrukcję powrotu z załadowaniem rejestru W odpowiednią wartością. Odczyt elementu polega na skoku do adresu bazowego tablicy powiększonego o indeks, co powoduje załadowanie danego bajtu do rejestru W. W dokumentacji Microchip, w szczególności w Application Note AN716, znajduje się szczegółowy opis tej metody. Dla PIC18 dostępne są także dedykowane rejestry do adresowania pamięci programu, co umożliwia definiowanie tablic za pomocą metainstrukcji asemblera "db" i "dw". W przypadku pamięci EEPROM dane można wczytać do niej przed programowaniem za pomocą narzędzi takich jak IC-Prog, a odczyt odbywa się przez odpowiednie rejestry i banki pamięci. Autor potwierdził, że udało mu się zdefiniować tablicę w ROM wykorzystując metodę RETLW i adresowanie przez licznik programu (PC), co potwierdza skuteczność tej techniki.
Wygenerowane przez model językowy.
REKLAMA