BASCOM Problem z procedurą

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

BASCOM Problem z procedurą

Post autor: siekierzyński » 12 lis 2010, 19:59

Bawię się teraz w generowanie znaków i mam taki problem, że nie wchodzą mi parametry do procedury:

Kod: Zaznacz cały

Declare Sub Set_pixels(byval Xt As Byte , Byval Yt As Byte , Byval Lic As Byte)

Call Set_pixels(0 , 0 , 12)

Sub Set_pixels(byval Xt As Byte , Byval Yt As Byte , Byval Lic As Byte)
Dim _t As Byte
_t = Lic
   If Lic.0 = 1 Then
      _t = Xt + 4
      Pset _t , Yt , 1
   End If
   If Lic.1 = 1 Then
      _t = Xt + 3
      Pset _t , Yt , 1
   End If
   If Lic.2 = 1 Then
      _t = Xt + 2
      Pset _t , Yt , 1
   End If
   If Lic.3 = 1 Then
      _t = Xt + 1
      Pset _t , Yt , 1
   End If
   If Lic.4 = 1 Then
      Pset Xt , Yt , 1
   End If
End Sub

Kod sprawdzałem w pętli głównej - działa dobrze, jednak problem polega na tym, że dane: 0, 0, 12 nie wchodzą do procedury. Nie mam pomysłu dla czego.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 lis 2010, 21:47

Po co ci w procedurze SET_pixel 3 parametry :?: Wystarczą 2, współrzędna X i Y, z nich można policzyć wszystko co trzeba. No chyba że chcesz ustawić kolor. Ale w praktyce wtedy robi się 2 osobne procedury SET_Color i Set_Pixel.

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 12 lis 2010, 21:51

Bo ja sobie robię ustawianie linii z 5 pixeli. Będę generował znaki liniami. Ta procedura będzie wywoływana, przez inną procedurę. Robienie samej procedury dla samych x i y było by bez sensu.

Nie mam pojęcia dla czego dane nie przechodzą do procedury.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 lis 2010, 22:13

Bo ja sobie robię ustawianie linii z 5 pixeli. Będę generował znaki liniami.
A na jakim wyświetlaczu graficznym czy Alfanumerycznym ?? Bo jak graficznym to jest to bezsensowna metoda, nikt tego tak nie robi, marnowanie pamięci kodu i mocy obliczeniowej CPU. Definiuje się czcionkę (96 podstawowych znaków) 12x16 i po zabawie.

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 12 lis 2010, 22:17

Graficzny, ale najpierw przeczytaj sobie ten temat: LINK

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 lis 2010, 23:33

Twoje problemy moim zdaniem mają kilka przyczyn:
A. Nie rozumiesz do końca organizacji pamięci wyświetlacza, i jej odwzorowania na LCD.
B. Prawdopodobnie próbujesz wysyłać od razu dane do LCd, zamiast stworzyć w sobie w RAM bufor, i w nim najpierw narysować całą stronę i dopiero potem wysłać do LCD. Oczywiście jeżeli CPU ma dosyć RAMu na to?
C. Nigdy nie uczyłeś się programowania w szkole, nawet na poziomie podstawowym, więc nie bardzo wiesz co to operacje AND, OR oraz przesunięć logicznych w lewo i prawo, wiec kombinujesz coś z If-ami co w ogóle nie jest potrzebne.
Ogólnie twój problem jest trywialny do rozwiązania, jak umiesz sobie zapisywać dane bezpośrednio do pamięci graficznej LCD, bo zakładam że chcesz pracować w trybie tekstowym czyli wyświetlać tylko znaki, a nie mieszać to z grafiką.
Otóż graficzny monochromatyczny LCD, w niczym nie przypomina monitora komputera od strony adresowania pixeli. ekran jest tak naprawdę podzielony na N wierszy po 8 linii, gdzie N można policzyć dzielą ilość pixeli na współrzędnej Y przez 8. Czyli jak wyświetlacz ma 128x64 to masz 64/8 czyli 8 wierszy. I teraz jak chcesz sobie na wyświetlaczu wyświetlić czcionkę 6x8 od punktu 0, 5 (tak 5 bo nie ma współrzędnych ujemnych), to oznacza że górne 3 pixele z wzoru znaku musisz wyświetlić w linii 0 wyświetlacza 3 pixele czyili D0 do D2, ale przesunięte o te 5 w prawo (w dół na wyświetlaczu), a zrobisz to tak:

W0 = wzorzec.x and &b00000111 ' wyłuskaj bity od D0 do D2
W0 right,5 ' przesuń o 5 w prawo

oczywiście to nie jest kod programu tylko zapis ilustrujący kolejność czynności.
Tak policzony wzorzec, wysyłasz go do odpowiedniej komórki bufora ekranu w RAM i liczysz następny dla znaku. łącznie 6 operacji dla jednego znaku bo masz czcionkę 6x8.
Teraz musisz policzyć dół znaku który obciąłeś i wstawić go do wiersza nr.1 na LCD (tego niżej), a zrobisz to identycznie tylko:

W0 = wzorzec.x and &b11111000
W0 left, 3

Graficznie wyglada to tak:
Załączniki
LCD konwert.JPG
LCD konwert.JPG (11.79 KiB) Przejrzano 8439 razy

Awatar użytkownika
kris74
Użytkownik
Posty: 270
Rejestracja: 16 sie 2006, 17:36
Lokalizacja: Gorzów Wielkopolski

Post autor: kris74 » 13 lis 2010, 11:47

Procedura może jest i dobra ale źle zadeklarowana. Zamiast byval powinno chyba być byref.

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 13 lis 2010, 12:30

Zamiast byval wszędzie daję byref, wywala błąd:
Error : 248 Line : 49 BYVAL should be used in declaration [[ 112]] , in File :
Linia 49:
Call Set_p(0 , 0 , 14)

Awatar użytkownika
kris74
Użytkownik
Posty: 270
Rejestracja: 16 sie 2006, 17:36
Lokalizacja: Gorzów Wielkopolski

Post autor: kris74 » 13 lis 2010, 12:44

Mój błąd , faktycznie powinno być byval, ale źle wywołujesz procedurę, Call Set_pixels(0 , 0 , 12) , a więc co procedura ma zwrócić? Powinno być Call Set_pixels(Xt, Yt , 12).

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 13 lis 2010, 12:49

??

Procedura ma nic nie zwracać. Do zwracania wartości służy funkcja. Ja chce jej przekazać tylko 3 parametry i tyle.

Awatar użytkownika
kris74
Użytkownik
Posty: 270
Rejestracja: 16 sie 2006, 17:36
Lokalizacja: Gorzów Wielkopolski

Post autor: kris74 » 13 lis 2010, 13:35

Zadeklarowałeś następującą zmienną Byval Lic As Byte ale w kodzie programu jest Lic.0, Lic.1 czy to nie jest błąd? A co niby trafia do zmiennej _t?

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 13 lis 2010, 13:43

Lic.0 - biorę bit 1 ze zmiennej Lic, Lic.1 - bit 2 itd.

10 sec później:

Eeee.... O.o

Wywaliłem "_t = Lic " i zaczęło działać. Wpisywałem zawartość Lic do zmiennej _t, żeby podejrzeć w symulatorze czy zmienne przechodzą. Tylko nie rozumiem czemu po wywaleniu tej linijki program zaczął działać..? Przecież do zmiennej _t wpisuję zawartość Lic, więc Lic nie powinno się zmienić, później _t = Xt + 4 więc to nie powinno mieć znaczenia.

Może ktoś mi to wytłumaczyć?
Swoją drogą kris74, dzięki za uwagę.

Awatar użytkownika
kris74
Użytkownik
Posty: 270
Rejestracja: 16 sie 2006, 17:36
Lokalizacja: Gorzów Wielkopolski

Post autor: kris74 » 13 lis 2010, 13:52

A może deklaracja zmiennej _t była błędna, może _ to powodowało problem, lepiej było przyjąć zmienną o nazwie temp :) Bascom jest kapryśnym środowiskiem, sam się o tym nie raz przekonałem.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 lis 2010, 14:32

Tzn,. jak dobrze zrozumiałem to co chcesz zrobić, to na ekran LCD chcesz nałożyć folię aby zamienił się w dotykowy, i ta folia ma ramkę do której chcesz obciąć wyświetlany tekst, czyli stworzyć na ekranie okno o rozmiarach ramki.
Najprostszy sposób, no chyba że okno ma mieć jakieś właściwości, ale wtedy trzeba zaprzęgnąć do tego już sporo RAMu i tworzyć bufor obrazu.
Załączniki
LCD okno.JPG
LCD okno.JPG (13.67 KiB) Przejrzano 8359 razy

Awatar użytkownika
siekierzyński
Użytkownik
Posty: 482
Rejestracja: 01 cze 2010, 23:12
Lokalizacja: Nareszcie Polska

Post autor: siekierzyński » 13 lis 2010, 14:43

Folia ma ramkę takich samych wymiarów ja obszar pixeli w LCD, więc tu można tylko odwoływać się tylko do pola LCD. Dlatego chce generować znaki liniami. Dodatkowo po za podstawowymi A-Z, a-z, 0-9, znaki interpunkcyjne chce dać znaki rosyjskie i jeszcze innych języków. więc chyba ręczne generowanie znaków jest lepsze.

Ken kod o który podałem optymalizuje mi trochę program, tzn. zajmuje on mniej miejsca, niż przy generowaniu znaku z pojedynczych pixeli.

Zobaczymy co wyjdzie.

Będę musiał sobie w PHP napisać generator znaków, w sensie, że wygeneruje mi kod do bascoma, analizując poszczególne znaki.

Tylko jest jeszcze jeden problem: BASCOM nie obsługuje rosyjskich znaków. Jak mu wpisze Ё ё Ж ж З з И и Й й to wyjdą ? ? ? ? ? ? ? ? ? ? :/

ODPOWIEDZ