Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega 328, Bascom pytanie o ustawienie adresu tablicy w programie

higlos 15 Kwi 2017 19:13 717 18
  • #1 15 Kwi 2017 19:13
    higlos
    Poziom 12  

    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

  • #3 15 Kwi 2017 19:33
    higlos
    Poziom 12  

    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 15 Kwi 2017 19:47
    Piotrus_999
    Poziom 39  

    higlos napisał:
    dlatego coraz więcej piszę w asm
    Podziwiam - jest to przykład jak sobie utrudniać życie bez żadnego powodu :)

  • #5 15 Kwi 2017 19:52
    higlos
    Poziom 12  

    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 15 Kwi 2017 20:07
    niveasoft
    Poziom 34  

    Tutaj możesz się spotkać z opinią że do zapalenia LED można przecież użyć RPI :D

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

  • #7 15 Kwi 2017 20:11
    higlos
    Poziom 12  

    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 15 Kwi 2017 20:15
    niveasoft
    Poziom 34  

    Nie skumałem bo pewnie czytałem po łebkach ;)

    Zobacz to https://wiki.mcselec.com/bavr/$INC

    To da się wykorzystać w połaczeniu z $LOADER

    ..a moze nie da się tego w prosty sposób tak zrobić tylko musiałbyś to wmanipulować samemu w HEXa a potem czytać sobie przez CPEEK

  • #9 15 Kwi 2017 21:26
    piotrva
    Moderator Mikrokontrolery

    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 15 Kwi 2017 22:23
    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: avrasm
    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"

  • Pomocny post
    #11 16 Kwi 2017 06:33
    ASMnauka_
    Poziom 14  

    higlos napisał:
    W asm będzie to komenda .org $3f00 jednak w Bascom nie działa. Czy jest coś takiego możliwe ?

    Ależ działa.
    Oto przykład:
    Kod: vbnet
    Zaloguj się, aby zobaczyć kod


    A jeśli piszesz w czystym Bascom to użyj LOADLABEL

  • #12 16 Kwi 2017 09:18
    higlos
    Poziom 12  

    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 16 Kwi 2017 11:07
    ASMnauka_
    Poziom 14  

    Prawidłowo robi się to tak:

    Kod: vbnet
    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: vbnet
    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 16 Kwi 2017 13:09
    higlos
    Poziom 12  

    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 16 Kwi 2017 13:49
    niveasoft
    Poziom 34  

    Wczoraj jakaś pomroczność mnie dopadła :D
    ..ale spróbujmy dzisiaj.

    Zobacz czy tak nie zadziała ;) Varptr to skrót od variable pointer

    Const Zmienna = Varptr(Dane(_base))

    i potem LDS R1, {Zmienna}

  • Pomocny post
    #17 16 Kwi 2017 16:47
    ASMnauka_
    Poziom 14  

    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: vbnet
    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 16 Kwi 2017 20:46
    higlos
    Poziom 12  

    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 17 Kwi 2017 22:19
    pawlik118
    Poziom 21  

    że tak jeszcze zapytam, koniecznie musisz robić tę wstawkę ASM? Nie wystarczy klasyczny bascom?

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME