Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DATA i duża ilość danych - jak to prawidłowo wyświetlić?

Pocieszny 01 Maj 2008 19:22 1568 13
  • #1 01 Maj 2008 19:22
    Pocieszny
    Poziom 38  

    Mam taki problem. Chcę wyświetlić obrazek na graficznym LCD z Nokii. Zajmuje on ok. 0,5kB. Zamieniam go na ciąg bajtów. Kiedy go wkleję na koniec kodu ze znaczkiem Data, przy kompilacji wykrzacza się Bascom (a piszą że długość linii nie jest ograniczona...)

    Wpadłem na głupi pomysł podzielenia tego na krótkie linijki, na początku każdej jest słowo Data. I dzieje się ciekawa rzecz. Wyświetla obrazek, jednak wygląda to jak rozrzucone puzzle :(

    Wyświetlam go tak:

    Code:

    For J = 0 To 503
       Temp = Lookup(j , Obrazek)
       Call Send_serial(Temp)
    Next



    Może ktoś podpowie jak wrzucić taką dużą ilość danych do programu w prawidłowy sposób...?

    0 13
  • #2 01 Maj 2008 19:36
    kamyczek
    Poziom 34  

    Zrób to jako dwie pętle bo wielkość tabeli w bascomie to max 255 bajtów poza tym nie wiem czy bascom sprawdza zajętość bufora transmisji co za tym idzie może gubić bajty . Zatem w pętli dodaj opóźnienie potrzebne na czas wysłania informacji przez interfejs.

    0
  • #3 01 Maj 2008 20:00
    Pocieszny
    Poziom 38  

    1) J jest typu word, więc raczej powinna dać radę ta pętla, zresztą używam jej także do czyszczenia ekranu i się nic nie wykrzacza

    2) transmisja szeregowa to programowe SPI (sam sobie napisałem)

    3) zapomniałem dodać, że procek to AT89C4051

    Obrazek jest kompletny, jednak wygląda jak by był pocięty na części i rozrzucony losowo, żadna część się nie powtarza.

    Moim zdaniem problem leży w użyciu znacznika Data. W Bascomie piszę od niedawna, więc myślę, że źle tego używam...

    Użycie

    Code:

    Moje_dane:
    data 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

    jest równoznaczne z takim czymś
    Code:

    Moje_dane:
    data 1, 2, 3, 4, 5
    data 6, 7, 8, 9, 10
    data 11, 12, 13, 14, 15

    ?

    A więc, jak zapisać ciąg tych 504 bajtów i je potem odczytać?

    0
  • #4 03 Maj 2008 08:20
    ZbeeGin
    Poziom 38  

    zenobeusz napisał:
    A więc, jak zapisać ciąg tych 504 bajtów i je potem odczytać?

    Skorzystać z dyrektywy $INC, a potem normalnie: RESTORE, READ.

    0
  • #5 03 Maj 2008 23:51
    Pocieszny
    Poziom 38  

    Chyba nie $INC tylko $INCLUDE (?)

    Cytat:

    $INCLUDE ”nazwa_pliku”

    gdzie:

    nazwa_pliku Nazwa dołączanego pliku ze ścieżką dostępu. Plik musi zawierać tekst programu w języku BASCOM BASIC.


    Wynika z tego, że dołączony plik ma wyglądać mniej więcej tak:
    Code:

    Dane:
      Data 5 , 10 , 100 (i tutaj jeszcze ok 500 bajtów)


    Może się mylę, ale to chyba nic nie zmienia...? Bascom i tak się na tym wykrzacza. Wszystko byłoby ok gdyby było mniej danych do zapisania, ale najwyraźniej Bascom tego nie trawi. Niestety nie znalazłem informacji na temat maksymalnej objętości danych umieszczonych w DATA (może tutaj tkwi problem).

    Ponawiam pytanie czy
    Code:

    Moje_dane:
    data 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

    jest równoznaczne z takim czymś
    Code:

    Moje_dane:
    data 1, 2, 3, 4, 5
    data 6, 7, 8, 9, 10
    data 11, 12, 13, 14, 15

    ?

    Przy zastosowaniu drugiej wersji program się kompiluje i działa, ale wyświetla "puzzle", o których pisałem

    Przepraszam, jeżeli głupio pytam, ale nie znalazłem do tej pory żadnego opisu jak sobie z czymś takim poradzić.

    0
  • #6 04 Maj 2008 00:03
    Balu
    Poziom 38  

    BASCOM obsługuje tablice z indexem Integer 6553x sztuk:>

    0
  • #7 04 Maj 2008 00:18
    Pocieszny
    Poziom 38  

    No to już nie wiem co jest nie tak :?

    0
  • #8 04 Maj 2008 08:01
    ZbeeGin
    Poziom 38  

    zenobeusz napisał:
    Chyba nie $INC tylko $INCLUDE (?)

    Żadne tam $INCLUDE. Masz wykorzystać polecenie $INC i kropka!
    Cytat:
    Przeznaczenie:
    Dołącza do programu dane binarne z pliku na bieżącej pozycji.

    Składnia:
    $INC etykieta , [ SIZE | NOSIZE ] , "nazwa_pliku"

    gdzie:
    - etykieta - Nazwa symboliczna pod którą dane będą dostępne. Należy ją wykorzystać w poleceniu RESTORE,
    - SIZE - Pozwala określić ile danych znajduje się w takim bloku. I jest to wartość typu Word. Można ją później odczytać za pomocą READ tuż po RESTORE, gdyż wartość ta dodawana jest na początku danych. Podanie NOSIZE spowoduje, że ilość nie zostanie dodana, a pod podaną etykietą znajdą się tylko same dane.
    - nazwa_pliku - Nazwa pliku (ew. razem ze ścieżką) z której program ma pobrać dane.

    Opis:
    Polecenie $INC jest alternatywą dla poleceń DATA umieszczanych w programie na etapie jego pisania. Pozwala ono na dołączanie danych binarnych bezpośrednio z pliku, zwłaszcza gdy ich ilość jest dość duża, a przepisywanie zawartości pliku w postaci liczb jest uciążliwe.

    Aby ustawić wskaźnik odczytu instrukcji READ na te dane należy użyć RESTORE z podaniem etykiety jaką nadano tym danym w poleceniu $INC. Odczyt danych odbywa się tak samo jak w przypadku DATA: za pomocą instrukcji READ.
    To jak dane będą interpretowane zależy tylko od typu zmiennej jaka występuje w poleceniu READ. Zatem można je traktować jako bajty, słowa, długie słowa, czy ciągi znaków.

    Przykład:
    Code:
    Restore L1
    
    Read Size                                                   ' przeczytaj ile jest danych

    Print Size ; " bajtów umieszczono pod adresem L1"
    For W = 1 To Size
      Read B : Print Chr(b);
    Next
     
    End
     
    'włączymy nieco danych tutaj
    $inc L1 , Size , "c:\test.bin"


    zenobeusz napisał:
    Przepraszam, jeżeli głupio pytam, ale nie znalazłem do tej pory żadnego opisu jak sobie z czymś takim poradzić.

    Teraz już masz w wersji polskiej.

    0
  • #9 04 Maj 2008 09:52
    grysek
    Poziom 19  

    Cytat:
    przy kompilacji wykrzacza się Bascom (a piszą że długość linii nie jest ograniczona...)


    jaką masz wersje BASCOM bo jeśli masz demo to mozesz obsługiwac programy tylko do 2Kb kodu wynikowego tak więc jesli program ma więcej to wyskakują błędy

    0
  • #10 04 Maj 2008 16:28
    Pocieszny
    Poziom 38  

    Teraz dopiero zauważyłem, że mam jakiegoś badziewnego Bascoma, bo kompilator nie rozpoznaje polecenia $INC, a w helpie też nic nie było na ten temat. Tak więc przepraszam za zamieszanie :) Wydawało mi się że ściągnąłem w miarę nową wersję, chyba się pomyliłem. Będę musiał poszukać czegoś normalniejszego. Mam wersję 2.0.10.0 (demo).

    Jaka jest najnowsza wersja Bascoma? Na stronie MCS jest 2.0.14.0, fajnie bo już pozwala na 4kB kodu, ale ona też nie rozpoznaje $INC :? W helpie online(http://8051help.mcselec.com/index.html?keywordreference.htm) też chyba nic nie ma o tym... Czyżby strona była nieaktualna?

    Chyba w końcu przerzucę się na C, będzie mniej problemów ;)

    0
  • #11 04 Maj 2008 19:03
    elektrofil
    Poziom 17  

    może i badziewna wersja, tylko pytanie czy potrzebujesz bascoma do rodziny 51 czy do avr?
    na pewno nie popełniłeś błędu przy pobieraniu kompilatora?
    na jaki procek chcesz to napisać?

    0
  • #12 04 Maj 2008 20:35
    Pocieszny
    Poziom 38  

    Chodzi o procek AT89C4051, a więc potrzebny jest Bascom 8051. Jaki mogłem popełnić błąd przy pobieraniu? Wszedłem na stronę MCS(wcześniejszą wersję miałem z jakiegoś innego źródła), pobrałem i zainstalowałem. Tak czy inaczej mój Bascom nie bardzo chce skompilować program z użyciem $INC (Error 3: Unknown statement in file [...]) i wskazuje linijkę z $INC.
    ZbeeGin, którą masz wersję?

    0
  • #13 07 Maj 2008 20:13
    ZbeeGin
    Poziom 38  

    Jako domyślnie przyjąłem, że używasz BASCOM AVR. Zatem moje posty są Ci potrzebne jak gwint na nawojówce.

    Tak jakoś cichaczem przemyciłeś informacje o tym że to 8051... :(

    0
  • #14 09 Maj 2008 16:54
    Pocieszny
    Poziom 38  

    W moim drugim poście napisałem o jaki procek chodzi ;)
    Nie sądziłem że te Bascomy aż tak się różnią.

    0
  Szukaj w 5mln produktów