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

Atmega 328, Bascom pytanie o ustawienie adresu tablicy w programie

higlos 15 Kwi 2017 19:13 1254 18
  • #1 16414522
    higlos
    Poziom 13  
    Witam,

    Mam pewną tablicę w programie umieszczoną na końcu programu i mam pytanie jak zaadresować jej początek w programie ?

    Atmega328 ma pamieć Flash od 0000 do 3fff (HEX) i owa przykładowa tablica ma 96 znaków (60hex).
    Chciałbym aby znajdował się jej początek pod adresem powiedźmy 3f00.
    W asm będzie to komenda .org $3f00 jednak w Bascom nie działa. Czy jest coś takiego możliwe ?

    Pozdrawiam

    Tablica:
    Data &H52 , &H09 , &H6A , &HD5 , &H30 , &H36 , &HA5 , &H38 , &HBF , &H40 , &HA3 , &H9E , &H81 , &HF3 , &HD7 , &HFB
    Data &H7C , &HE3 , &H39 , &H82 , &H9B , &H2F , &HFF , &H87 , &H34 , &H8E , &H43 , &H44 , &HC4 , &HDE , &HE9 , &HCB
    Data &H54 , &H7B , &H94 , &H32 , &HA6 , &HC2 , &H23 , &H3D , &HEE , &H4C , &H95 , &H0B , &H42 , &HFA , &HC3 , &H4E
    Data &H08 , &H2E , &HA1 , &H66 , &H28 , &HD9 , &H24 , &HB2 , &H76 , &H5B , &HA2 , &H49 , &H6D , &H8B , &HD1 , &H25
    Data &H72 , &HF8 , &HF6 , &H64 , &H86 , &H68 , &H98 , &H16 , &HD4 , &HA4 , &H5C , &HCC , &H5D , &H65 , &HB6 , &H92
    Data &H6C , &H70 , &H48 , &H50 , &HFD , &HED , &HB9 , &HDA , &H5E , &H15 , &H46 , &H57 , &HA7 , &H8D , &H9D , &H84
  • #2 16414552
    piotrva
    VIP Zasłużony dla elektroda
    Są na to specjalne funkcje:
    https://avrhelp.mcselec.com/index.html?lookup.htm

    Tak czy siak, jeśli zaczynasz naukę, polecam uczyć się C.
  • #3 16414575
    higlos
    Poziom 13  
    Dziękuje za odp jednak instrukcja lookup w niczym nie pomoga. Program ma wstawkę w ASM i potrzebuje określić adres tablicy w pamięci flash.
    Szukam w pliku pomocy jednak jeszcze nie znalazłem odpowiedniej funkcji. Wady Bascoma znak dlatego coraz więcej piszę w asm, a przesiadka na C jest uzasadniona jak najbardziej.
  • #4 16414609
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16414623
    higlos
    Poziom 13  
    Powstaje inny wątek odnośnie programowania :) a życie już często znacząco mocno sobie utrudniamy, aby do zapalania leda używać uC ;)

    może ktoś z bascomowców spotkał się z zagadnieniem ustalenia adresu fragmentu programu (w tym przypadku tablicy)
  • Pomocny post
    #6 16414658
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16414672
    higlos
    Poziom 13  
    Jak najbardziej znane jest mi to ustawienie ale ono określa położenie tablicy w Ram'ie (chyba że się mylę- aż sprawdzę). Moja tablica jest w pamięci Flash chyba że jakoś podobnie można to określić. Raspberry+LED myślę że nie będzie wyczynem w stylu strzelania do muchy armatą :D
  • #8 16414686
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16414874
    piotrva
    VIP Zasłużony dla elektroda
    higlos napisał:
    Wady Bascoma znak dlatego coraz więcej piszę w asm, a przesiadka na C jest uzasadniona jak najbardziej.

    I dlatego polecę jeszcze raz przesiadkę na C, to chyba odpowiedni moment.

    Pisanie w ASM to trochę masochizm, mając C.

    Dla zachęty powiem - w C taki problem rozwiązuje się z automatu - zawsze można pobrać adres jakiejś komórki, nie ważne czy jest ona we flash, czy w ram, i potem odpowiednią funkcją odczytać.

    Na tym też zakończmy wątek nt. języka (C/ASM/Bascom) w tym temacie - może ktoś poda rozwiązanie, a jeśli nie to sam rozważysz porady dotyczące C.
  • #10 16414988
    zumek
    Poziom 39  
    higlos napisał:
    ... Program ma wstawkę w ASM i potrzebuje określić adres tablicy w pamięci flash.

    Żywcem skopiowane z pliku pomocy.
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod

    higlos napisał:
    Szukam w pliku pomocy jednak jeszcze nie znalazłem odpowiedniej funkcji. Wady Bascoma znak dlatego coraz więcej piszę w asm, a przesiadka na C jest uzasadniona jak najbardziej.

    Dział "Mixing ASM and BASIC"
  • #12 16415444
    higlos
    Poziom 13  
    Witam,

    "Zumek" dzięki jednak pytanie nie dotyczyło odczytu danych z tablicy :) (odczyd dokładnie tak wykonywałem)

    "ASMnauka" Dzięki super działa !! :) a wystarczyło też dopisać wykrzyknik wcześniej !.org $2000 (aż się dziwię że tego nie sprawdziłem)

    Ten temat uważam za zamknięty

    Mam jeszcze jedno drobne estetyczne pytanie. Jak wpisać poprawnie adres w high i low ?(nie odwołując się do nazwy tablicy) Poniższy fragment działa poprawnie gdy wpisuję osobno adres:
    ldi YH, $07 ;OK
    ldi YL, $00 ;OK
    rcall program

    ldi YH, high($0700) ; Błąd kompilacji czy również $H0700
    ldi YL, low($0700) ; Błąd kompilacji
    rcall program
  • Pomocny post
    #13 16415593
    ASMnauka_
    Poziom 15  
    Prawidłowo robi się to tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Lecz w tym przypadku trzeba podać nazwę etykiety, o czym piszesz wcześniej.

    Musisz rozbić wartość szesnastobitową na dwie części.
    A teraz załadować do dwóch rejestrów jedno bajtowych starszą i młodszą część adresu.
    Nie mam pojęcia czy można zrobić to inaczej.
    Znaczy można. Na przykład tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W tym przykładzie kompilator rozbija za Ciebie liczbę szesnastobitową na dwie części ośmiobitowe.
    Jest to przykład podania adresu ze zmiennej.
    Natomiast jeżeli chodzi o adres ze stałej to najpierw odczytujesz starszą część adresu, przepisujesz do XH, YH, lub ZH.
    Kolejnym krokiem jest odczyt młodszej części adresu i odpowiednio przepisanie jej do XL, YL, lub ZL.
  • #14 16415802
    higlos
    Poziom 13  
    super działa :)))

    Jeszcze mimo Świeta zaciekawiła mnie jedna rzecz.

    Mam tablice o wielkości 20bajtów pod adresem 700hex o nazwie Dane.
    Dim Dane(20) As Byte At 1792 Overlay
    Odwołuję się do niej później po adresie komendą
    lds r16, $0700 ; adres oczywiście zmienny w zależności od potrzebnej komórki

    W jaki sposób zapisać nazwę aby kompilator nie wyrzucił błędu ? sugerowana nazwa poniżej nie jest akceptowalna
    lds r1, {Dane(1)}
    i drugie pytanie jak później inkrementować pobranie kolejnej wartości ? chociaż to pewnie będzie st x+
  • Pomocny post
    #15 16415870
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #17 16416077
    ASMnauka_
    Poziom 15  
    higlos napisał:
    W jaki sposób zapisać nazwę aby kompilator nie wyrzucił błędu ? sugerowana nazwa poniżej nie jest akceptowalna
    lds r1, {Dane(1)}


    lds r1, {Dane(1)} - tutaj chcesz pobrać pierwszy element tablicy.
    Tak się nie da.
    Zarówno niveasoft, jak i pawlik118 mają rację.
    W przypadku odpowiedzi kol. pawlik118 otrzymasz adres początku tablicy.
    Natomiast jeśli chodzi o odp. kol. niveasoft również otrzymasz adres początku tablicy.
    Niestety odczyt tablicy w ASM z pozoru jest banalnie prosty.
    Tutaj Masz przykład zapisu i odczytu.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    higlos napisał:
    i drugie pytanie jak później inkrementować pobranie kolejnej wartości ? chociaż to pewnie będzie st x+

    ST = zapis
    LD = odczyt
  • #18 16416526
    higlos
    Poziom 13  
    Sam łapie jakąś pomroczność :)
    jasne że ld x+ a nie st x+ nawiązując do:
    ST = zapis
    LD = odczyt

    Oczywiście tak jak rozwinął myśl ASMnauka chodziło o komendy ASM, a nie bascomowe :) Dzięki wielkie i wiele "drobiazgów" się wyjaśniło i zapewne ten odczyt będzie działał. Na spokojnie go sprawdzę. Pomysł niveasoft jest również ciekawy i godny zapamętania.

    Miłego jeszcze Świątecznego wieczoru :)
  • #19 16418744
    pawlik118
    Poziom 32  
    że tak jeszcze zapytam, koniecznie musisz robić tę wstawkę ASM? Nie wystarczy klasyczny bascom?
REKLAMA