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

Bascom AVR - UART zwrot wartości zmiennej o którą pytany

MES Mariusz 16 Sie 2013 10:40 2340 11
  • #1 12633336
    MES Mariusz
    Poziom 36  
    Witam.

    Uruchomiona komunikacja po UART - komputer PC - urządzenie na Atmega32.
    Z poziomu klawiatury PC wysyłam znaki. Po odebraniu przez urządzenie kodu klawisza enter urządzenie wykonuje polecenie (złożone z uprzednio wysłanych znaków).

    W celu wygodnego debugowania softu (bez tworzenia celowych pułapek, ponownej kompilacji kodu i programowania uP) chciałbym zrealizować komendę debug, która zwróci wartość zmiennej o którą pytam: debug [nazwa zmiennej].

    Np. jeśli zmienna_byte$ jest w danej chwili równa 5, chciałbym, aby komenda:

    debug zmienna_byte$ spowodowało, że urządzenie na Atmega32 odeśle po UART znak "5".

    Wydaje mi się, że nie jest to możliwe. Co najwyżej można by zrobić pamięciożerny case:

    
           Select Case zapytanie
            Case "zmienna_byte$" : Call print zmienna_byte$
            Case "zmienna_byte$2" : Call print zmienna_byte2$
            Case "zmienna_byte$3" : Call print zmienna_byte3$
            ...
            Case "zmienna_byte$n" : Call print zmienna_byten$
           End Select


    Załóżmy, że program wykorzystuje 300 różnych zmiennych. Case byłoby długie i pamięciożerne. Chodzi właśnie o to by uniknąć zużycia pamięci.
  • #2 12633482
    Kuniarz
    Moderator Projektowanie
    Zamiast używać wielu zmiennych w stylu zmienna_byte, zmienna_byte2, zmienna_byte3 załóż tablicę np. zmienna_byte(300) i wówczas na podstawie zinterpretowanego znaku wysyłasz zawartość odpowiedniego pola tablicy.
    Pomogłem? Kup mi kawę.
  • #3 12633565
    MES Mariusz
    Poziom 36  
    Kuniarz napisał:
    Zamiast używać wielu zmiennych w stylu zmienna_byte, zmienna_byte2, zmienna_byte3 załóż tablicę np. zmienna_byte(300) i wówczas na podstawie zinterpretowanego znaku wysyłasz zawartość odpowiedniego pola tablicy.

    No dobra, tryb tablicowy ma swoje plusy (jeśli chodzi o zapis chociażby i odwoływanie się do zmiennych). Jednak nie do końca o to chodzi.

    Po UART napływa do urządzenia string ['zmienna_byte$' + enter]

    Teraz urządzenie ma zinterpretować odebrany string 'zmienna_byte$' z taki sposób, aby mógł odesłać po UART zawartość zmiennej zmienna_byte$.

    Musiałaby odbyć się jakaś konwersja stringu 'zmienna_byte$' aby dało się wykonać
    polecenie:

    print zmienna_byte$

    String nadesłany po UART musiałby zostać zinterpretowany jako nazwa zmiennej, na której mogłaby zostać wykonana komenda print. Bez dodatkowego ręcznego przyrównania 'if string$ = "zmienna_byte$" then' albo 'case'. Chciałbym bez porównania i warunków zrealizować print zmienna_byte$ ('zmienna_byte$' string jaki napłynął po uart).
  • #4 12633572
    Kuniarz
    Moderator Projektowanie
    Kolejna tablica tym razem string, w której masz zapisane "wzorce", które możesz otrzymać po UART. Otrzymujesz dane, przeszukujesz tablicę string, odnajdujesz zgodny zapis, w tym momencie masz numer pola w tablicy, więc odpowiadasz wartością zmiennej z drugiej tablicy.

    Choć to trochę przekombinowane, więc może pomyśl o innym protokole transmisji.
    Pomogłem? Kup mi kawę.
  • #5 12633610
    Mundi1970
    Poziom 24  
    Może zamiast nazw zmiennych wykorzystać adresy zmiennych (są w raporcie po kompilacji) będzie to krótsze i łatwiejsze do napisania.

    long0300 - wyświetl zmienną long spod adresu 0x300
    byte0200- wyświetl zmienną byte spod adresu 0x200
  • #6 12633654
    MES Mariusz
    Poziom 36  
    Można, tyle, że najpierw trzeba by sobie przygotować mapę pamięci. Bardzo nieintuicyjne (nawet nie jestem pewien pod jaki adres pamięci ładowana jest dana zmienna). Ale repertuar rozwiązań powoli się kończy.
  • Pomocny post
    #7 12633709
    Mundi1970
    Poziom 24  
    Po kompilacji jest zapisany plik raportu, tam też umieszczone są adresy zmiennych.

    Bascom AVR - UART zwrot wartości zmiennej o którą pytany
  • #8 12634252
    MES Mariusz
    Poziom 36  
    Mundi1970 napisał:
    long0300 - wyświetl zmienną long spod adresu 0x300
    byte0200- wyświetl zmienną byte spod adresu 0x200

    Ok. Tylko dalej stoimy w miejscu.

    Przypuśćmy, że do urządzenia dotrze komenda 300.

    Po stronie urządzenia będziemy chcieli wykorzystać string, który napłynął: "300" do wykonania instrukcji print long0300.

    Dalej nie ma prostego sposobu, pozbawionego instrukcji warunkowych na jej wykonanie.
  • Pomocny post
    #9 12634296
    Kuniarz
    Moderator Projektowanie
    A widzisz, pojawia się wreszcie jakiś konkret. Skoro pojawia się komenda "300" to rozumiem, że pojawi się też "120", "1", "55" itp. Więc zamieniasz otrzymany string na word i masz już wskaźnik tablicy. W odpowiedzi wysyłasz wartość zmiennej o numerze "300".
    Pomogłem? Kup mi kawę.
  • #10 12634303
    piotrva
    VIP Zasłużony dla elektroda
    Jest.
    Tworzysz sobie na całej pamięci RAM tablicę jako At &H0000 Overlay - dzięki temu masz dostęp do każdej komórki pamięci ram poprzez Tablica(adres). Tablica oczywiście jest tablicą bajtów.
    Potem masz tylko instrukcję warunkową, która rozróżnia typy danych (czyli byte, long, single, word, ...) i wie ile bajtów każdy z nich zajmuje i w tej instrukcji sklejasz (jeśli jest potrzeba) kilka kolejnych bajtów, wrzucasz do zmiennej tymczasowej danego typu i wysyłasz po uart.
    ---
    I tu widzimy jak super jest BASCOM - w C nie miałbyś tego problemu - podpiąłbyś debugger JTAG i bez problemu, w wersji okienkowej w dodatku miałbyś podgląd wszystkiego...
  • Pomocny post
    #11 12634689
    Mundi1970
    Poziom 24  
    Do konwersji łańcucha na zmienną numeryczną wykorzystaj funkcje VAL lub HEXVAL . Mając już adres zmiennej, możesz użyć instrukcje INP do pobrania wartości.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 12634802
    MES Mariusz
    Poziom 36  
    piotrva napisał:
    Jest. Tworzysz sobie na całej pamięci RAM tablicę jako At &H0000 Overlay - dzięki temu masz dostęp do każdej komórki pamięci ram poprzez Tablica(adres). Tablica oczywiście jest tablicą bajtów.

    Brzmi bardzo optymistycznie. Dostęp do zmiennych alternatywnie przez wskaźnik lub tradycyjnie przez nazwę zmiennej. Faktycznie dostęp przez wskaźnik i zdefiniowanie całej ram jako tablica daje szansę na realizację instrukcji

    debug [adres] [liczba bajtów]

    albo

    debug [adres] [typ zmiennej]

    --- edit ---

    Nie wiem na jakiej podstawie kompilator pakuje zmienne w określone adresy RAM, ale zdaje się, że istnieje możliwość z góry zadania kompilatorowi w które miejsce ma upakować zmienną, by można było stworzyć statyczną mapę pamięci, nie podlegającą zmianom podczas kolejnych kompilacji.
REKLAMA