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

[bascom] Nazwa tabeli ze zmiennej

manekinen 10 Paź 2008 11:50 2108 4
REKLAMA
  • #1 5617750
    manekinen
    Poziom 29  
    Witam, mam otóż taki problem. Na ten przykład taki oto kawałek programu:
    Pion = Lookup(temp , tabela)

    Do zmiennej pion chcę wrzucić z tabeli pewną daną o indeksie temp. Z jakiej tabeli? No własnie, przed tą procedurą potrzebuje jeszcze wybrać tabelę w zależności od innej danej pobranej z eeprom. Generalnie program będzie sterował multipleksowanym wyświeltaczem LED, czyli pobierał z eeprom daną przedstawiającą numer kolejny znaku do wyświetlenia, w zależności od tej danej będzie pobierał z odpowiedniej tabeli dane i wysyłał na linie sterujące diodami. Np. odczytując daną 4, która będzie odpowiadała małej literze "d", muszę tą czwórke zamienić na nazwę tabeli. Oczywiście czytałem w helpie bascoma o odczycie z tabel i nigdzie nie ma wzmianki o takiej możliwości :cry: a nie chcę każdej tabeli wywoływać poprzez select case lub if then bo to dużo roboty robić tyle warunków dla wszystkich możliwych znaków z osobna, a i program się rozrasta niepotrzebnie. Wygodnie było by w nawiasie zamiast nazwy tabeli umieścić zmienną w której była by zapisana ta nazwa. Czy jest możliwe takie coś? Lub jak to inaczej zrealizować?
    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #2 5618127
    K_o_n_r_a_d
    Poziom 23  
    Poczytaj w pomocy o instrukcjach: DATA , RESTORE, READ.
    Kiedyś robiąc skomplikowane menu używałem tego do przechowywania stałych tekstów/opisów. Wszystkie były tej samej długości. Aby nie używać SELECT CASE zrobiłem wstawkę asemblerową. O ile dobrze pamiętam rejestry R8 i R9 są używane jako wskaźnik dla funkcji READ.

    Możesz też wszystkie swoje dane wrzucić do jednej tablicy, robiąc tak jakby tablicę 2 wymiarową. Dane odczytywać z przesunięciem, np. pierwsza tablica - przesunięcie +0, druga tablica - przesunięcie +10 itd.
  • REKLAMA
  • Pomocny post
    #3 5618373
    zumek
    Poziom 39  
    K_o_n_r_a_d napisał:
    Poczytaj w pomocy o instrukcjach: DATA , RESTORE, READ...

    To się nie nadaje , ponieważ Restore potrzebuje etykiety , a Read to odczyt sekwencyjny i nie da sie wybrać konkretnego elementu tablicy , tylko trzeba odczytywać kolejno , począwszy od pierwszego elementu.
    Ale ...
    Bascom AVR posiada funkcje , za pomocą których można naśladować mechanizm wskaźników , podobnie jak w języku C.
    Do szczęścia , potrzebujemy dwóch funkcji: Loadlabel i Cpeek.
    Jeśli mądrze je wykorzystamy , to tablicę - a dokładnie jej adres - oraz numer jej elementu , możemy umieścić w zmiennych.

    Piotrek

    PS
    Dotyczy tablic , umieszczonych w pamięci programu.
  • REKLAMA
  • #4 5618762
    K_o_n_r_a_d
    Poziom 23  
    zumek napisał:
    To się nie nadaje , ponieważ Restore potrzebuje etykiety , a Read to odczyt sekwencyjny i nie da sie wybrać konkretnego elementu tablicy , tylko trzeba odczytywać kolejno , począwszy od pierwszego elementu.
    No właśnie ustawiając rejestry R8 i R9 (wskaźnik) można odczytywać dowolny element tablicy w ten sposób. Tyle, że to wymaga wstawki asemblera.
    ...
    Faktycznie wykorzystując Loadlabel i Cpeek można zrobić to samo bez asemblera. Wcześniej tych poleceń nie znałem.
  • #5 7035580
    manekinen
    Poziom 29  
    Witam, przepraszam że dopiero teraz odpisuje ale dopiero teraz znalazłem troche czasu na wznowienie projektu.

    Dziękuje za pomoc.

    Wcześniej miałem zrobione tak:

    
    Select Case Text
             Case 0 : Pion = Lookup(linia_zmian , Dig_0 )
    ...itd...
             Case 104 : Pion = Lookup(linia_zmian , Big_pz2 )
          End Select
    


    A tablice znaków wyglądały tak:
    
    Dig_0:
    Data 6 , 11 , 9 , 13 , 6
    ...itd...
    Big_pz2:
    Data 14 , 19 , 21 , 23 , 2
    



    Wszystkie tablice znaków zastąpiłem jedną dużą tak jak radził Konrad, każdy znak zajmuje 5 komórek więc zrobiłem liczenie offsetu. Jesli mam do odcyztania przykładowo znak nr 79, to mnożę to przez liczbę komórek każdego znaku czyli 5, i otrzymany wynik 395 to pierwsza komórka znaku 79 w tablicy. Dzięki temu kod zmniejszył się o ponad 3kB.

    
          Offset = 5 * Text                                     
          Offset = Offset + Linia_zmian             'tu licze która komórke znaku odczytywać
          Pion = Lookup(offset , Tab_znaki)
    


    Bascom sobie dobrze radzi z adresowaniem i odczytem z tablicy więcej niż 256 znaków - gdzies ktoś pisał na forum że powyżej 256 odczytuje krzaki. Oczywiście, ale zmienna offset musi byc zadeklarowana jako word i wszystko gra.

    Próbowałem też sposobu Zumka, działa bardzo ładnie, ale w porównaniu do poprzedniego trzeba deklarować dodatkową zmienną integer a kod jest większy o 1% - a efekt ten sam.
    
          Adres = Loadlabel(tab_znaki)
          Adres = Adres + Offset
          Pion = Cpeek(adres)
    


    Może komus sie przyda. Dzięki za pomoc.
REKLAMA