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

[Atmega32][C] Kłopot z programem do karty teleVGA

21 Gru 2011 17:02 3681 30
  • Poziom 14  
    Witam,
    kupiłem kartę TeleVGA i mam kłopot z programem.
    Biblioteka dołączona do karty to pliki z rozszerzeniem .H dałem do header files a pliki z rozszerzeniem .C do main, ale wyskakują błędy i coś nie jest tak. Nie chcę testować, bo mogę coś popsuć. Załączam program i proszę o sprawdzenie go, bo nie wiem jak ma to wyglądać.
    Czy jestem na dobrej drodze?
    Bardzo proszę o pomoc.

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 30  
    Witam,

    Zasadnicze pytanie:
    - jakiego kompilatora używasz (IAR czy GCC)
    - jakie środowisko programistyczne?

    W zależności od kompilatora np. różnie są definiowane stałe w pamięci FLASH:
    IAR:
    const __flash uint8_t Font0_8_16 [4096];

    GCC:
    const uint8_t Font0_8_16 [4096] PROGMEM;

    itp.

    Plik który załączyłeś świadczy o tym, że wykorzystujesz bibliotekę dla IAR ale
    czy korzystasz z tego kompilatora?

    Pozdrawiam
    JarekC
  • Poziom 14  
    Korzystam z GCC
    AvrStudio+winavr
    biblioteki .c i .h dostałem wraz z kartą na CD
  • Pomocny post
    Poziom 30  
    Witam,

    Akurat w domu nie mam biblioteki producenta do tej karty więc nie wiem
    czy są tam pliki tylko dla IARa czy są tez dla GCC.

    Możesz bazować na moim przykładzie z projektu zegara:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=10120357#10120357

    Jutro wezmę kartą zegar z kartą TeleVGA do domu to będę mógł sprawdzić w rzeczywistym układzie.

    Dzisiaj postaram się trochę zmodyfikować mój przykład "na sucho" tak aby
    wyświetlał dowolny tekst (font 8x16 pixli).

    Pozdrawiam
    JarekC
  • Poziom 14  
    Tylko jest GCC
    Dzięki
    tylko napisz jeszcze jak te biblioteki mam dodać te w .C
  • Pomocny post
    Poziom 30  
    Witam,

    Tak jak obiecałem załączam maksymalnie uproszczony projekt (bazuje na wspomnianym wcześniej kodzie zegarka). Wyświetla tylko dwa napisy w różnych kolorach

    Kod jest przeznaczony do WinAVR (GGC) i zawiera kody źródłowy jak i plik projektu dla AVRStudio4. Kod kompiluje się bez błędów i ostrzeżeń. Ale teraz nie mam pod ręką karty TeleVga więc nie mogę go przetestować. Dla pewności załączam również zrzut ekranu pokazujący jak powinien wyglądać projekt i konfiguracja.

    Pozdrawiam
    JarekC
  • Poziom 14  
    Wielkie dzięki Skomplikowałem i niema błędów. Zaraz zacznę podłączać i sprawdzać.
    A przy okazji jak wyświetlić jakiś obrazek(np. 4 zapalone pixele obok siebie) ? Potrzebny będzie program?
    Bo trzeba zdefiniować ten znak?
  • Poziom 30  
    Witam,

    Nie jest to w pełni karta graficzna, obsługuje tylko semigrafikę czyli składanie obrazów z elementów 8x16 pixli. Prócz podstawowego fontu który masz już zdefiniowany można jeszcze dodać 3 zestawy po 256 znaków.

    Aktualnie kończę projekt 4-kanałowego termometru z wykorzystaniem tej karty.
    Będzie on podłączony do telewizora plazmowego przez wejście VGA.
    Oglądając TV będzie można na chwilę zmienić wejście i podglądnąć temperaturę na zewnątrz 2 punkty, w salonie i w garażu.
    W tym momencie tylko na DS18B20 ale szukam jakiś bezprzewodowych czujników temperatury.

    Co można uzyskać z karty na załączonym zdjęciu (obraz z monitora LCD).

    Pozdrawiam
    JarekC

    [Atmega32][C] Kłopot z programem do karty teleVGA
  • Poziom 14  
    Aha
    Ale jak to zdefiniować ta semigrafikę?
    I jak to wyświetlić?
  • Poziom 30  
    Witam,

    Włóż trochę własnej pracy.

    Informacje o sposobie definicji znaków znajdziesz w instrukcji do karty.
    Definicja każdego znaku składa się z 16 bajtów, każdy z tych bajtów opisuje jeden wiersz znaku (8pixli). Przykładowa definicja znaku na załączonym obrazku.

    W kodzie który przesłałem zdefiniowane jest 256 znaków (pierwszy generator), możesz sobie dowolnie modyfikować te znaki. Definicja fontu znajduje się w pliku font0.c

    Pozdrawiam
    JarekC

    [Atmega32][C] Kłopot z programem do karty teleVGA
  • Poziom 14  
    Czytam i nie rozumie.
    W font0.c to jest ale to są takie np. 0x00 i są oddzielone i jak to zrobić? da sie zamienić i jak to tam wpisywać i potem jak to odczytać żeby wyświetliło?
    W instrukcji nie pisze jak to zrobić.
  • Poziom 30  
    Widzę,że trzeba zacząć od początku.
    1. czy znasz podstawy języka C
    2. czy wiesz co to jest zapis hexadecymalny (0x)

    bez tej wiedzy trudno mi będzie Ci pomóc.

    Ale spróbuję:
    - każdy znak składa się z 16 linii po 8 punktów
    - aby opisać te 8 puntów wystarczy 1 bajt (8bitów)
    - aby opisać cały znak potrzebujemy więc 16 bajtów
    - aby zdefiniować cały zestaw znaków ASCII potrzebujemy 4096 bajtów
    dlatego w pliku font0.c mamy definicje tablicy
    Kod: c
    Zaloguj się, aby zobaczyć kod

    -każda linia w tej tablicy opisuje 1 znak
    -dla przykładu weźmy znak $ który jest pokazany na obrazku
    -znak $ ma numer 37 w zestawie ASCII czyli odszukujemy 17 linie w tablicy i mamy tam
    Kod: c
    Zaloguj się, aby zobaczyć kod

    -jak widać na obrazu pierwsza linia znaku to 00011000 gdzie 0 to punkt wygaszony a 1 to punkt zapalony
    -zapis hexadecymalny takiego "układu" 0 i 1 to 0x18 i to znajdujemy w tablicy
    -następna linia to to samo czyli znowu 0x18
    - następna linia to 01111100 czyli w zapisie hexadecymalnym to 0x7C
    - itd..
    Tak samo definiowany jest każdy znak.

    Pozdrawiam
    JarekC
  • Poziom 14  
    C znam dobrze.
    Zrozumiałem
    I mam 2 pytania
    1. Czy jest jakiś program na komputer gdzie zaznaczam które pixele maja się palić a on mi podaje taki kod?
    2. Zrobiłem taką semigrafikę prosta linie
    Kod: c
    Zaloguj się, aby zobaczyć kod

    I gdzie to mam dodać? w pliku font0 jest max 256 więc gdzie?
    Zrobić kolejny generator?Jak?
    I zasadnicze pytanie jak to wyświetlić?

    PS:Program który dałeś działa tylko kolory na odwrót powinny być
  • Poziom 30  
    Witam,

    Ad1. musisz poszukać jakiegoś programu do edycji fontów
    Ad2. Każdy zdefiniowany znak ma swój numer od 0 do 255, przywoływany wcześniej znak $ ma numer 37 możesz go więc wyświetlić używając np funkcji
    VGA_Put_Char
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pozycje na której zostanie wyświetlony możesz zmieniac przy pomocy funkcji GotoXY.

    Teraz jeżeli podmienisz w tablicy definicję znaku $ na Twoją to zamiast $ wyświetli się pionowa kreska którą opisłeś.
    Na razie powinieneś poeksperymentować na jednym generatorze znaków. Używanie kilku generatorów wymaga zmiany trybu pracy karty.

    Pozdrawiam
    JarekC
  • Poziom 14  
    Aha tylko ze ten generator jest pełny a ja chcę mieć alfabet i cyfry więc niema miejsca w tym generatorze.
    I jeszcze jedno skat wiesz że ten znak ma taki nr? według kodów ASCII ma on dec: 36 hex 24.
    Np. chcę zmienić literę "ę" w tej tablicy font0 gdzie to znaleźć ? jak to jest ustawione? bo to ę to wygląda jak omega.
    Alfabetycznie? a, ą, b, c, ć, d, e, ę,...
    I tak na marginesie czy masz jakiś sposób żeby kolor tła (cały ekran) się szybko zmienił na jakiś inny kolor?

    Dodano po 14 [minuty]:

    W necie nie znalazłem takiego programu do fontów :( są ale 8x8, 16x16, 5x8 a 8x16 nie ma.
  • Poziom 25  
    W podstawowej tablicy ASCII o wielkości 256 znaków nie ma tych polskich znaków typu ą,ę,ć itp.

    Nie masz takiego programu, to rysuj sobie w paincie, powiększ skalę, żebt piksele było dobrze widać i każdą linijkę sobie przelicz na bajt. Trochę roboty, ale da się zrobić.
  • Poziom 14  
    Ad.1 nie oto pytałem. Ja pytałem jak są one ułożone w bibliotece font0.C

    Dodano po 9 [minuty]:

    Czyli jak zrobić kolejny generator znaków?

    Dodano po 21 [minuty]:

    To do wyświetlania semigrafiki działa tylko że podczas komplikowania pokazuje błąd
    Code:

    ../TeleVga_5.c:218: warning: suggest parentheses around arithmetic in operand of |


    Testowałem, próbowałem zrobić 2 generator tylko gdzie w tej funkcji na wyświetlanie obrazków (semigrafiki) ustawić z którego generatora ma korzystać?
  • Poziom 30  
    Witam,

    Akurat tutaj zdefiniowany font ma polskie znaki w standardzie CP852(DOS LATIN2)
    Najłatwiej po prostu wyświetlić cały font na ekranie, np takim programem:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zapisz go jako main.c i podmień w projekcie.

    Kod znaku $ rzeczywiście pomyliłem i ma 36 a nie 37.

    Zgłaszane ostrzeżenie przypomina o tym aby w przypadku działań logicznych stosować nawiasy.

    Cały czas oczekujesz gotowych rozwiązań, trochę więcej własnej inicjatywy.
    Aby użyć dwóch generatorów musisz:
    1- zmienić tryb pracy karty (rejestr VGA_CONTROL)
    2- musisz zdefiniować drugi zestaw znaków
    3- musisz zainicjować drugi generator
    4- przy wyświetlani znaku musisz podać z którego generatora ma być pobrany znak (rozszerzenie kodu koloru)
    Wszystko jest opisane w instrukcji karty.

    Wracając do meritum tematu to nie napisałeś co chcesz uzyskać.

    Pozdrawiam
    JarekC
  • Poziom 14  
    Chcę nauczyć się wyświetlać obrazki i tekst. By robić skomplikowane projekty.
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Jak to zrobić w instrukcji nie pisze dokładnie jak to zrobić.
    Coś takiego?

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czyli zrobić kolejny plik font1.C i font1.H i w nich zmienić 0 na 1

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Coś takiego?

    Kod: c
    Zaloguj się, aby zobaczyć kod




    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czyli to jest chyba to CHG0, CHG1 tylko gdzie to wpisać w programie?

    Zadziwiła mnie jedna rzecz jak wpisałem żeby wyświetliło znak z numeru 1 lub 3 to wyświetliło uśmiechnięte buźki
  • Pomocny post
    Poziom 30  
    Witam,

    W instrukcji jest opisany rejestr VGA_CONTROL który definiuje działanie karty.
    Np. jeżeli chcesz mieć włączone wyświetlanie czyli bit VEN=1, włączony kursor czyli bit CEN=1 oraz pracę z 4 generatorami czyli VM=1 (UWAGA w instrukcji jest błąd opisu dotyczący tego bitu) to musisz wykonać rozkaz:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Po prostu w rejestrze VGA_CTRL ustawiasz te bity które mają mieć wartość 1.
    Definicja bitów dla rejestru VGA_CTRL znajduje się w pliku vga.h

    Tak musisz sobie utworzyć druga tablicę z definicjami znaków. Możesz po prostu skopiować plik font0.c i font0.h na font1.c i font1.h
    W nowych plikach wszędzie gdzie było font0 musisz zmienić na font1 czyli np font1.h powinien teraz wyglądać tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz możesz modyfikować sobie dowolnie definicje w pliku font1.c
    Np zmień drugą linię z:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Plik font1.c musisz dołożyć do projektu w AVR_studio.
    W pliku main musisz też dopisać:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    oraz zainicjować generator czyli
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Poszczególne parametry mówią o tym iz definiujemy generator nr 1 ze znakami od numeru 0 do numeru 255.

    Teraz możemy już wyświetlać znaki z 0 lub 1 generatora.
    Dla przykładu wyświetlmy znak 1 (buźka z 0 generatora) i znak 1(zmodyfikowana buźka z generatora 1)
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dla czytelności najlepiej zdefiniować sobie numery generatorów:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czyli cały program:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Pozdrawiam
    JarekC
  • Poziom 14  
    Działa
    Wielkie dzięki za wszystko.
    Tylko kurde ten program edycji fontów by się przydał bo tak to sporo czasu mi zajmie obliczanie tego kodu.
    A jeszcze jedno da się w prosty sposób zrobić by cale tło się zmieniło na jakiś wybrany kolor?
    I jeszcze jedno w tej karcie jest coś takiego jak strona 1 i 2 do czego to?
  • Poziom 30  
    Witam,

    Możesz spróbować tego edytora:
    http://www.mikroe.com/eng/products/view/683/glcd-font-creator/

    nie testowałem go ale wygląda zachęcająco.

    Aby zmienić tło całego ekranu niestety musisz po prostu w pętli zmienić kolor każdego znaku na ekranie (przy pomocy funkcji VGA_Write_Addr_Set i VGA_Transmit).

    Karta posiada dwie strony pamięci jedna jest wyświetlana a druga pozostaje w tle niewidoczna. Możesz mieć wyświetlony jeden obraz a w międzyczasie przygotowywać drugi nie zakłócając pierwszego. Za to która strona jest wyświetlana odpowiada bit PNR w rejestrze VGA_CONTROL.

    Pozdrawiam
    JarekC
  • Poziom 14  
    Program ogarnąłem i działa dobrze
    A z tymi stronami to też muszę obczaić bo bardzo mi się przyda.
    Czytałem instrukcje i stwierdziłem że:

    1.trzeba zainicjować 1 stronę (bo 0 strona już jest)
    Chyba tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    2.Ustawienie VGA_CONTROL
    Chyba tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    3.No i już wszystko chyba więc można wyświetlić 0x04 to 1 strona? Bo nie jestem pewny??
    Kod: c
    Zaloguj się, aby zobaczyć kod


    I teraz pytanie co źle zrobiłem bo chyba coś zrobiłem.
    I 0strona to która a 1strona to która? gdy wyświetlę napis na 0 stronie i potem w tym samym miejscu na 1stronie to zakryje napis ten? a jak go usunąć? żeby odkryć tamta stronę?
  • Poziom 30  
    Witam,

    Tak trzeba zainicjować 1 stronę bo inaczej będą się wyświetlać przypadkowe znaki.
    Tak stronę do wyświetlenia przełączamy poprzez zapis do rejestru VGA_CTRL jeżeli bit PNR=0 to wyświetlana jest zerowa strona jeżeli PNR=1 to wyświetlana jest pierwsza strona.

    Natomiast to czy "piszemy" po zerowej czy pierwszej stronie określa adres pod jakim zapisujemy. Adres jest ustawiany np. przez funkcję GotoXY i globalną zmienną vpage.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam
    JarekC
  • Poziom 14  
    Czyli połowę dobrze zrobiłem :D
    Ale
    Wpisałem ten program co podałeś tylko zmieniłem współrzędne i wyświetla się tylko litera B a jak zrobić by wyświetlała się litera A?
    I czy można zrobić tak że na stronie 0 wyświetla się tło całego ekranu a na stronie 1 chodzi myszka da się tak? żeby w tym samym czasie wyświetlało się z obu stron?
    A jeśli tak to jak zmazać wyraz na 1 stronie żeby odsłoniło wyraz co był na 0 stronie?
    Aha i czy da się usunąć tło np wyświetlam literę A a wokół niej musi być jakieś tło. To da się je usunąć żeby było przezroczyste?
  • Poziom 30  
    Witam,

    Nie da się jednocześnie wyświetlać informacji obydwu stron.

    Efekt odsłaniania drugiej strony można uzyskać tylko programowo przepisując dane pierwszej strony na 0 lub odwrotnie.

    Pozdrawiam
    JarekC
  • Poziom 14  
    Aha ok
    A z tym tłem? Da się usunąć?
    I jeszcze jedno da się zrobić by w foncie 8x16 ustawić kilka kolorów? np jedna kreska w tym na czerwono 2 obok niej na biało 3 na zielono itp??Czy nie?
    I co jeszcze można wycisnąć z tej karty?
  • Poziom 30  
    Witam,

    Nie bardzo rozumiem o co Ci chodzi z tym tłem.

    W znaku mogą występować tylko dwa kolory (kolor znaku i tło) ewentualnie może być jeszcze włączone miganie znaku lub podkreślenie.

    Nie jest to karta graficzna tylko tekstowa z opcją semigrafiki.
    Aby uzyzskać większe możliwości należałoby zastosować inny układ kontrollera.
    Z tego co wiem z aktualnie zastosowanego "wyciśnięto" wszystko co się da.

    Pozdrawiam
    JarekC
  • Poziom 14  
    Z tłem chodzi mi że po po prostu żeby nie było tła bo tło już jest.
    Zrobiłem pulpit coś jak w komputerze tło ma kolor niebieski i zrobiłem czarną myszkę co chodzi po tym pulpicie i gdy zrobiłem ramkę i najechałem myszką przez nią to tło myszki zaślepiło ramkę. A ma być tak ze ramkę ma być widać a tylko tam gdzie myszka jest to nie. Żeby tło tej myszki było przezroczyste.
    Da się tak zrobić?

    Cytat:
    Aby uzyskać większe możliwości należałoby zastosować inny układ kontrolera.

    Wiesz jaki ten układ?
  • Poziom 30  
    Witam,

    Do rysowania kursora myszki możesz wykorzystać możliwość wyświetlenia znaku bez zmiany atrybutu na danej pozycji.
    Normalnie wyświetlenie znaku składa się z dwóch kolejnych zapisów do rejestru VGA_DATA_WR, pierwszy zapis wpisuje kod znaku drugi zapis wpisuje atrybut znaku. Jeżeli pominiemy drugi zapis to nie zostanie zmieniony atrybut znaku, ale nie zostanie również przesunięty adres zapisu (nie nastąpi przejście na następną pozycję). Dlatego po jednokrotnym zapisie należy dodatkowo wykonać funkcje GotoXY.

    Przykład skok na pozycję 5,5 wyświetlenia znaku "myszki" skok na pozycję 6,5.

    Kod: c
    Zaloguj się, aby zobaczyć kod



    "Sercem" TeleVGA jest układ programowalny CPLD/PFGA.

    Pozdrawiam
    JarekC