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.

S1D15710 - Działający kod w BASCOMie

witko1 24 Lip 2013 14:39 2907 17
  • #1 24 Lip 2013 14:39
    witko1
    Poziom 9  

    Witam

    Napisałem ostatnio kod w bascomie do obsługi wyświetlacza S1D15710. Opierałem się na bibliotece napisanej w c (w załączniku). Biblioteka w c oczywiścia działa cała. Niestety moja w bascomie coś nie bardzo. Znaczy się wyświetlacz się włącza i jest w stanie wyświetlić określony piksel. Może też wyczyścić cały i pomalować cały wyświetlacz. Schody zaczynają się jak chcę czytać stan danego bajtu danych z pamięci ram wyświetlacza. Nie potrafię sobie z tym poradzić.

    Opieram się na bibliotece napisanej w c ale do końca jej nie rozumiem.
    Np. w funkcji LCD_Zczytaj_Dane jest takie polecenie __asm__ volatile ("nop");
    Czy mógłby mi ktoś wytłumaczyć co to polecenie robi? Gdyż prawdopodobnie przez brak odpowiednika w bascomie mój kod mi nie działa.

    Oryginalny datasheet tego wyświetlacza
    http://www.epsondevice.com/webapp/docs_ic/DownloadServlet?id=ID000211

    W załącznikach kod w c, mój w bascomie i skrócony opis wyświetlacza.

    Wiem, że bascom jest gorszy, ale znam go lepiej i łatwiej mi chyba będzie przerobić bibliotekę c na bascom niż uczyć się programować w c dla jednego projektu.

    Pozdrawiam i proszę o pomoc.

    0 17
  • #2 24 Lip 2013 14:47
    BlueDraco
    Specjalista - Mikrokontrolery

    NOP wprowadza minimalne opóźnienie - jedna instrukcja procesora. Bascom takie, a nawet większe opóźnienie wprowadza sam przy każdej instrukcji ;).

    A właściwie do czego jest Ci potrzebne czytanie danych z wyświetlacza?

    Jeśli to Twój ostatni projekt w życiu, to trzymaj się Bascoma. W przeciwnym przypadku radzę jednak zacząć programować w C.

    0
  • #3 24 Lip 2013 15:27
    witko1
    Poziom 9  

    Czytanie danych jest potrzebne aby móc zrobić np. negatywa. Projekt nie jest moim ostatnim, ale ciężko mi się przestawić na c. Znam tylko podstawy.

    Chodzi głównie o tę część:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przerobiłem ją na bascoma i nadal nie działa

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i niestety nadal nie działa. Co może być przyczyną?

    0
  • #4 24 Lip 2013 15:45
    BlueDraco
    Specjalista - Mikrokontrolery

    Wrzuć tam dowolne malutkie opóźnienie po prostu.

    0
  • #5 24 Lip 2013 15:56
    piotrva
    Moderator na urlopie...

    BlueDraco napisał:
    Bascom takie, a nawet większe opóźnienie wprowadza sam przy każdej instrukcji :wink:.

    Najnowszy bascom niekoniecznie.
    Miałem kiedyś problem z przeniesieniem kodu obsługi RFM12B z Bascom na C - w starej wersji Bascoma działało bez opóźnienia, w C musiałem dać opóźnienie kilku us, ale potem w najnowszym Bascom (2.0.7.6) kod przestał działać - też trzeba było dodać opóźnienie. Widać cośtam zoptymalizowali, ale tak czy siak polecam nauczyć się C...

    0
  • #6 24 Lip 2013 17:09
    witko1
    Poziom 9  

    Dodawałem opóźnienie i nadal nic. Co może być przyczyną, że nie działa?

    0
  • #7 26 Lip 2013 22:13
    tank_driver
    Poziom 16  

    Dzięki temu że stosujesz takie super wypasione polskie nazwy plików to nie chce mi się otworzyć Twoje archiwum - a nie chce mi się tego poprawiać bo nie lubię tracić czasu.

    Sprawdź czy winą nie jest sekwencyjne wpisywanie danych na port, może trzeba mu wysyłać cały port w jednym czasie a nie każdy pin kolejno. Dwa NOP-y w BASCOM-ie to DELAY (bez parametrów).

    Ktoś sobie poradził: https://www.elektroda.pl/rtvforum/topic2434973.html

    "Wiem, że bascom jest gorszy" -> idąc tą samą drogą samolot od łodzi może być gorszy, prawie gorszy, taki sam, nieco lepszy i najlepszy. Nie ma czegoś takiego jak gorszy czy lepszy jeśli chodzi o języki programowania - w grę wchodzi tyle czynników że nie da się przesądzić o wyniku. ASM jest lepszy od C ale pisze się w nim 100 razy dłużej niż w BASCOM-ie. Czy jest zatem lepszy od BASCOM-a? Ech... Wszystko zależy od programisty, niedowiarkom radzę popatrzeć na to (teoretycznie niemożliwe do zrobienia na ATMEDZE): http://www.linusakesson.net/scene/phasor/index.php
    Przypomniało mi się takie stwierdzenie że najlepszy język programowania to ten, który znasz najlepiej. Jeśli czegoś nie znasz a uznajesz że jest to lepsze bo bardziej skomplikowane to polecam język "BRAINFUCK" http://pl.wikipedia.org/wiki/Brainfuck -> to dopiero jest jazda :P

    Wklej listing tej funkcji (SYNTAX) to może coś pomogę.

    Pozdrawiam!

    0
  • #8 27 Lip 2013 22:41
    witko1
    Poziom 9  

    tank_driver napisał:
    Dzięki temu że stosujesz takie super wypasione polskie nazwy plików to nie chce mi się otworzyć Twoje archiwum - a nie chce mi się tego poprawiać bo nie lubię tracić czasu.

    Sprawdź czy winą nie jest sekwencyjne wpisywanie danych na port, może trzeba mu wysyłać cały port w jednym czasie a nie każdy pin kolejno. Dwa NOP-y w BASCOM-ie to DELAY (bez parametrów).

    Ktoś sobie poradził: https://www.elektroda.pl/rtvforum/topic2434973.html

    "Wiem, że bascom jest gorszy" -> idąc tą samą drogą samolot od łodzi może być gorszy, prawie gorszy, taki sam, nieco lepszy i najlepszy. Nie ma czegoś takiego jak gorszy czy lepszy jeśli chodzi o języki programowania - w grę wchodzi tyle czynników że nie da się przesądzić o wyniku. ASM jest lepszy od C ale pisze się w nim 100 razy dłużej niż w BASCOM-ie. Czy jest zatem lepszy od BASCOM-a? Ech... Wszystko zależy od programisty, niedowiarkom radzę popatrzeć na to (teoretycznie niemożliwe do zrobienia na ATMEDZE): http://www.linusakesson.net/scene/phasor/index.php
    Przypomniało mi się takie stwierdzenie że najlepszy język programowania to ten, który znasz najlepiej. Jeśli czegoś nie znasz a uznajesz że jest to lepsze bo bardziej skomplikowane to polecam język "BRAINFUCK" http://pl.wikipedia.org/wiki/Brainfuck -> to dopiero jest jazda :P

    Wklej listing tej funkcji (SYNTAX) to może coś pomogę.

    Pozdrawiam!


    Link, który kolega wkleił zawiera kod, na którym się wzorowałem. Wiedziałem o nim i dlatego chciałem go przerobić na BASCOMA, nawet podałem go w załącznikach w pierwszym poście. Dodałem opóźnienia DEALY i nadal nic. Zauważyłem jedną, dość dziwną rzecz. Albo BASCOM albo kompilator coś psują, ale jest problem z przekazywaniem zmiennych. Załóżmy że chce wywołać SUB-a i przekazać do niej dwie zmienne

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i teraz te zmienne powinny być "obrabiane". Ale niestety nie docierają do SUB-a w całości. Mają już inne wartości. I chyba tu leży pies pogrzebany. Przez to przekazywanie zmiennych wszytko się psuje.

    W załączniku kod. Dodałem pisanie liter i wyrazów, ale przez to przekazywanie zmiennych nie działa jak należy.

    0
  • #9 27 Lip 2013 23:30
    piotrva
    Moderator na urlopie...

    1. Wstawiam jedno-plikowy kod kol. @witko1

    witko1 napisał:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    2. Definiuj $crystal i $regfile w pliku
    3. Pewnie problem stanowi ustawienie $swstack, $hwstack i $framesize - jeśli te parametry mają zbyt małe wartości (poczytaj za co jest każdy odpowiedzialny) to właśnie dzieją się bardzo dziwne rzeczy z programem (dziwne z punktu widzenia człowieka i trudne do wyłapania przyczyny)

    0
  • #10 28 Lip 2013 07:14
    tank_driver
    Poziom 16  

    Podpowiedz: zmienna mozemy przekazac do procedury / funkcji dwojako: byval i byref. W pierwszym przypadku tworzona jest zmienna tymczasowa - kopia przekazanej zmiennej i jej wartosc jest STALA przez caly czas wykonywania procedury/funkcji (chyba ze ta swiadomie ja zmieni).
    W drugim natomiast do procedury/funkcji przekazywany jest ADRES zmiennej w pamieci, zatem jesli wyskoczymy z podpogramu przerwaniem i nieswiadomie zmienimy wartosc tej zmiennej to po zakonczeniu przerwania podprogram bedzie kontynuowal dzialanie na innych niz poprzednio wartosciach. To powoduje morze bledow...
    Domyslnie BASCOM przyjmuje opcje BYREF i mozna ja w deklaracji pominac. Sprobuj zatem z BYVAL i sprawdz czy nie nadpisujesz zmiennych w podpogramach (mozna uzyc zmiennych lokalnych).

    http://avrhelp.mcselec.com/index.html haslo: declare function, declare sub, local

    Powodzenia!

    0
  • #11 28 Lip 2013 10:32
    Fredy
    Poziom 27  

    W kodzie w C miałeś takie coś:

    //DDRD = 0xff;

    i to nie potrzebnie przetłumaczyłeś na DDRD=255 , to jest komentarz i wszystkie zapisy z początkowym // lub /* a na końcu */ pomiń.

    Pokaż funkcję LCD_DATA_SET() i LCD_DATA_READ()

    0
  • #12 28 Lip 2013 13:55
    witko1
    Poziom 9  

    Program zaczął w końcu działać. Wszystkie zmienne zamieniłem na zmienne lokalne. Czytaj_dane przerobiłem na funkcję. A w niej zamiast

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    dałem
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i pomogło.
    Można też pisać teksty na wyświetlaczu, ale tylko w pozytywie. Póki co nie chce mi się przerabiać na możliwość pisania w negatywie. Ale może to zrobię.

    Załączam działający kod, jakby ktoś chciał w przyszłości użyć
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dziękuję wszystkim za pomoc. Jakbym coś dopisał do biblioteki to wrzucę ją tu.
    Pozdrawiam

    0
  • #13 28 Lip 2013 21:03
    tank_driver
    Poziom 16  

    "Czytaj_dane = PORTD" zamiast "Czytaj_dane = PIND" -> zmora programistów AVR... Podobnie jak Pind.2 = 1 lub Set Pind.2 co powoduje zmianę stanu pinu na przeciwny (jak toggle Portd.2) - "na oko" program wygląda dobrze, gorzej z działaniem.

    Brawo i życzę dalszych sukcesów!

    0
  • #14 12 Lut 2014 20:50
    efferalgan
    Poziom 9  

    Mogę prosić o schemat jak podłączyłeś piny d0...d7 do avr

    0
  • #15 13 Lut 2014 18:55
    ASMnauka
    Poziom 12  

    tank_driver, i tu się z Toba zgadzam.
    Niestety wystarczy napisać:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Pozdrawiam

    0
  • #16 13 Lut 2014 20:31
    witko1
    Poziom 9  

    efferalgan napisał:
    Mogę prosić o schemat jak podłączyłeś piny d0...d7 do avr


    Oto schemat :D

    S1D15710 - Działający kod w BASCOMie

    0
  • #17 13 Lut 2014 21:09
    efferalgan
    Poziom 9  

    Wyświetlacz śmiga, aż miło.
    Czy poniższe pozycje są potrzebne w programie?

    Cytat:

    Ddra = 255 'porta jako wyjście

    Porta = 0


    Wiecie jak używać kilku rozmiarów fontów na jednym wyświetlaczu?
    Czy da się zrobić fragment napisu na czarnym tle?

    0
  • #18 16 Lut 2014 10:38
    efferalgan
    Poziom 9  

    Jak zwiększyć odstępy między wierszami?

    0
  Szukaj w 5mln produktów