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.

AVR i karta graficzna ISA - pomysł na takie połączenie

30 Gru 2004 18:05 3702 22
  • Poziom 10  
    Witam.. znalazłem na tym forum wątek o tworzeniu obrazu graficznego na monitorze za pomocą mikrokontrolerów, lecz była tam mowa a FPGA bodajże, ale ktoś też wspomniał o wykorzystaniu starej karty graficznej.. ten pomysł wydaje mi sie dość sensowny, jednak nie został rozwinięty wystarczająco dobrze, a ja szukając w necie, nie natrafiłem na żadne konkretne strony dotyczące sterowania kartami graficznymi,...
    chodzi mi ogólnie o to, jakie są piny na na szynie ISA (właściwie to znalazłem... ale może ktoś zna jeszcze jakąś strone), no i, co najważniejsze, w jaki sposób przebiega komunikacja procesora z kartą graficzną po tej szynie.. jakie rozkazy, czy sygnały gdzie podać, w jakim formacie i takie tam.... czy może ktos się orientuje jak to powinno wyglądać, lub zna może jakies strony, gdzie takie projekty były by opisane? (mysle o wykorzystaniu Attiny2313, ale jesli bedzie trzeba to kupie 8535... zastanawiam sie jescze nad czestotliwoscia, bo szyna isa z tego co wiem, chodzi chyba na 33 Mhz.. a te procki maja max 20 (chyba) ale może mimo to da sie coś zrobic?

    Pozdrawiam
    Darek
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Pomocny post
    Poziom 34  
    http://www.pirx.com/pcq/xvga.txt <- opis jak w pascalu/asemblerze zaprogramować i obsługiwać garte graficzną (uruhamianie portowe więc jak najbardziej można zrealizować na mikrokontrolerze..)
    na internecie krąży dużo opisów na temat złącza ISA. do takiego zadania najlepiej nadał by sie układ który ma conajmniej 33 wejścia/wyjścia.. obsługiwać taką grafike można przez złącze 8-bitowe.. 8 pinów danych, 20 adresowych i 5 sterujących (Ior,Iow,Memr,Memw,Ale).. w programie wystarczą 4 funkcje które bendą odpowiednio: odczytywać/zapisywać do przestrzeni IO/pamięci i za pomocą powyższego linku można oprogramować karte..
    p.s. ISA jest taktowana częstotliwością 8MHz, ale nic nieszkodzi aby master był wolniejszy..
  • Poziom 10  
    To jak to jest?
    Karta cały czas wyświetla na ekranie obraz który pobiera z pamięci. teraz jesli zmienimy w tej pamieci wartosci jakiegos piksela, to przy nastepnym okresie "ruchu plamki" ten piksel zostanie wyswietlony na ekranie tak, jak go wpisalismy do pamieci? Rozumiem, że gdzies w rejestrze karty wpisuje sie wartości pamięci (zakres), z których ma pobierac wartości pikseli do wyświetlenia (bo tutaj na przykład są te 4 chyba strony, i można ustawiać, która ma być widoczna, a która nie - domyslam sie ze właśnie zmieniając ten zakres pamieci w rejestrze)?

    wpisywanie poszczególnych "pikseli" polega na ustawieniu odpowiedniego adresu pamieci na 20 pinach adresu, nastepnie podaniu wartosci na 8 pinach danych i ustawieniu odpowiedniego bitu sterowania (ktorego Memw czy Iow??) na wysoki?. na tej stronie, która podałeś jest taka funkcja jak VRT (czekaj na powrót pionowy) - to znaczy, ze karta sama z siebie nie "pilnuje" synchronizacji, tylko musi to robić master?

    rozumiem, ze w przypadku 256 kolorów po prostu jeden bajt pamieci, to jeden piksel i wpisujac do tego bajtu odpowiednia wartość ustalamy tym samym kolor pixela?

    wiesz może gdzie znaleźć cos stylu datasheeta do przeciętnej karty graficznej? (chodzi o adresy rejestrów, zakresy ich wartości, i co znaczą poszczególne z nich.. no tak jak w notach aplikacyjnych do uC)?
    niestety te najważniejsze funkcje sa w assemblerze.. a ja z tego jestem raczej cienki :( wiec nie bardzo moge rozgryźć o co w nich chodzi... ]

    Pozdrawiam i z góry dzieki!
    Darek
  • Pomocny post
    Poziom 34  
    więc tak.. grafika ma własną pamięć aby nieobciążać łącza dużą ilością pobieranych danych.. kontroler wpisuje dane do grafiki a ta odczytuje ze swojej pamięci i wyświetla.. jeśli master nic niewysyła do pamięci grafiki to ta ma swoją zawartość i w kółko ją odczytuje wyświetlając jedną tą samą klatke.. zapisanie do grafiki niejest równoznaczne z natychmiastowym wyświetleniem piksla.

    o ile pamiętam sygnały ior iow memr i memw aktywne są w stanie niskim a więc np zapis do pamięci wygląda tak:
    wystawienie adresu na szyne A
    ustawienie pinu ALE w stan wysoki
    wystawienie danych na szyne D
    ustawienie pinu MEMW na 0
    odczekanie kilku cykli
    ustawienie pinu MEMW na 1
    ustawienie pinu ALE w stan niski..
    IOR - odczyt z przestrzeni IO.. w pascalu odczytuje sie z tej przestrzeni za pomocą port[ .. ]
    IOW - jak wyżej tylko zapis..
    MEMR - odczyt z pamięci..
    MEMW - zapis do pamięci..
    ALE - address latch enable - oznacza że stan na liniach adresowych jest stabilny i można go wpisać do wewnętrznych zatrzasków

    VRT hm... karta ma swój sequencer dzięki któremu generowanie wszystkich sygnałów synchronizacji poziomej i pionowej odbywa sie sprzętowo bez mastera.. w programie występuje to aby zsynchronizować wykonywanie sie programu z powrotem pionowym generowanym przez grafike.. jeśli niedokonuje sie synchronizacji to może dojść do efektu pływania obrazu: np. grafika będzie wyświetlać np środkową linie obrazu a program zechce zmienić zawartość obrazu.. zanim grafika dokończy malowanie klatki to program zmieni zawartośc pamięci i w efekcie otrzymujemy 2 wycinki na jednej klatce.. jest to niemiły i nieprofesionalny efekt..

    co do 256 kolorów:
    tak, jeśli grafika działa na 256 kolorach to do opisania 1 pixla wystarczy 1 bajt..

    te najważniejsze fragmenty w asm moge przetłumaczyć na czystego pascala i wrzucić na forum..
  • Poziom 10  
    Oki... rozumiem już prawie wszystko. z tym, że nie bardzo rozumiem, czym różni się IOW od MEMW... znaczy to, że można bezpośrednio wpisywać dane do pamięci (jeśli MEMW zostanie ustawione w stan niski po zapisaniu bajta), a jeśli MEMW jest w stanie wysokim, za to IOW jest w stanie niskim, to to co jest na szynie danych zostanie przekazane do procesora obslugującego karte graficzną (np. rozkaz wyświetl zawartość pamieci, skoro napisałeś, ze zapisanie do pamieci nie jest równoznaczne z wyświetleniem sie jej uaktualnionej zawartości na monitorze)? MEMW i IOW służą po prostu do określenia, gdzie ma pójść informacja na szynie danych - czy bezposrednio zapisana w pamięci pod adresem wskazanym na szynie adresu (bezposrednio w formie w jakiej pojawila sie na szynie), czy zapisana do rejestru procesora pod adresem podanym na szynie adresu... czyli za pomocą IOW i danych na szynie danych sterujemy praca procesora, a za pomocą MEMW sterujemy zawartoscia danych, do wyswietlenia?

    Rozumiem ze wszelkie dane zostają zapisane (bądz wysłane) dopiero po ustawieniu bitu ALE w stan niski?

    A co do tłumaczenia - byłbym BAAARRDZZOOOO wdzięczny! a jeszcze, jeśli znasz C, to już w ogóle było by super! (pascala też znam, ale docelowo i tak będe programować w C :) )

    Jeszcze jedna sprawa... co do rozkazów dla procesora kart graficznej... właśnie - do jakich rejestrów i co wpisywać, żeby procesor odświerzył obraz na podstawie nowej zawartości pamieci, skoro piszesz, że zmiana zawartosci pamierci nie koniecznie przenosi sie na zmiane wyswietlanego obrazu, znaczy ze musi być coś w stylu flagi "refresh"...)
    I tak dzięki już za to co napisałeś :) jutro ide kupić złącze isa :) i bede testowac :) (jeśli bedzie jutro otwarty jakikolwiek sklep :) )

    Pozdrawiam
    Darek
  • Poziom 35  
    Nie znam sie na laczu isa, ale mysle ze wiem dosyc dokladnie jak dziala karta wiec postaram sie to opisac.

    1.Karta ma swoja pamiec gdzie trzyma dane obrazu. w starych kartach bylo to np 512kb. Ma rozne tryby wyswietlania obrazu.
    np 640x400x16kolorow czy 320x200x256kolorow.

    w zaleznosci od trybu potrzeba tyle i tyle pamieci, np dla 320x200x256kolor potrzeba 320x200x1bajtow czyli 64000bajtow ~64kb.

    2.Zasada dzialania karty/wait for vertical retrace..
    karta sobie z pamieci ladnie wyswietla dane.. i teraz jak my je chcemy zmienic, to nie mozemy karcie w polowie wyswietlonego ekranu podrzucic danych i oczekiwac, ze to bedzie dobrze wygladalo.

    Wyobraz sobie, ze rysujesz i kasujesz bez przerwy pionowa linie. Jezeli ja narysujesz, gdy karta jest w polowie wyswietlania danych do monitora to sie okaze, ze linia bedzie widoczna tylko od polowy ekranu w dol... Wiec takie postepowanie moze wywolywac niezamierzone miganie obiektow czy wrecz ich nie pokazywanie sie na ekranie (szybciej narysujesz/skasujesz obiekt niz zostanie on wyswietlony).
    Dlatego jest czekanie na plamke.. czekamy az plamka zakonczy rysowanie i wtedy mamy moment na zmiane stanu ekranu (moment zanim plamka znowu zacznie rysowac, no i jezeli zmienamy dane gora-dol to plamka musi nas jeszcze dogonic)

    W praktyce na PC'tach robi sie tak, ze w pamieci komputera rysuje sie nowy stan ekranu i w momencie gdy karta konczy wyswietlac jeden obraz przerzuca sie cale xxkb danych do karty i w ten sposob ona juz rysuje ladnie nowy obraz, caly przygotowany. Pozwala to uzyskac szybka i plynna animacje, bez zadnych rozmazan czy innych problemow.


    Jezeli ktos by potrzebowal troche wiadomosci o tworzeniu grafiki itd... to znam sie na tym ;-) mam nawet na karku program graficzny, wiec od strony software'u moge wiele pomoc.
  • Poziom 10  
    MirekCz - ok. ale w takim, z tego co mówisz znaczy, że każda zmiana danych w pamieci karty równa się zmianie wyswietlanego obrazu bez konieczności wysyłania rozkazu do procesora, który "odświeży" zawartość ekranu na podstawie AKTUALNEJ zawartości pamieci (nie wiem.. może ma jakiś cache, do którego przerzuca aktualny obraz, żeby zmiany pamięci nie "wchodziły w życie" dopóki nie zostanie zakończona procedura ich wpisywania? i jak już zostanie zakonczona (bit ALE ustawiony w stan niski) wtedy przerzuca dane z pamięci do cache'a i wyświetla nową zawartośc- ale nadal z cache'a...), czy po prostu pobiera dane bezpośrednio z pamięci, którą można w każdej chwili zmienić i od razu przekłada się to na efekt w obrazie (który, jeśli nie zgramy sie z odświerzaniem, może mieć nieciekawy efekt - właśnie owego migotania obrazu)?

    druga sprawa - jak z tą pamięcią - mówisz że dla różnych trybów potrzeba różnej pamięci.. rozumiem to jak najbardziej ale w takim razie musi być gdzieś w rejestrze procesora (karty graficznej) informacja, z jakiego obszaru ma pobierać dane.. czy po prostu ustawia mu sie tryb graficzny i on sam pobiera dane od pierwszego bajta pamieci do ostatniego bajta pamieci zarezerwowanego dla danego trybu (np. dla 320x200x256 ostatnim bajtem bedzie bajt nr 64000 (0xFA00))...
    kolejne pytanie: jeśli jest tryb 640x480x16 kolorów na przykład.. to jeden bajt miesci informacje o 32 kolejnych pikselach?) bo jak karta ma powiedzmy.. pamieci 1 Mb a chcemy działać w trybie 320x200x256 to nie może próbować wyświetlić CAŁEJ zawartości pamięci, bo wyświetlił by pierwszy ekran (pierwsze 64 Kb) a kolejene ekrany (dokładnie 15.625 :)) były by czarne.. więc.. gdzie i jak definiuje sie ten obszar? Poza tym na stronie podanej przez Boskiego Dialera :) jest kod który zmienia czestotliwość zegara karty dostosowując go do powiekszonej rozdzielczosci (tam jest akurat sytuacja nadzwyczajna bo probują troche zrobić rzeczy, do których karta nie była zaprojektowana :)) czy do każdej zmiany trybu video trzeba zmieniac czestotliwosc zegara karty?
    ech.. dużo pytań wiem...
    najlepiej by wlasnie było gdyby znalazła sie jakaś nota aplikacyjna do jakiejs karty vga albo po porstu do standardu vga i wtedy było by wszystko jasne... wtedy było by jasne co gdzie i jak wpisywac zeby działało :)

    Ale i tak dzieki za pomoc :)


    pozdrawiam!
    Darek

    p.s. Sorry jeśli coś jest niezrozumiałe, ale już późno jest.. i troche zmęczony jestem :) ale wolałem odpowiedzieć tak szybko jak to możliwe :)
  • Pomocny post
    Poziom 34  
    Code:

    procedure ClearXScreen;
    var i:word;
    begin
      port[$3c4] := 2; { wybranie 4 płatów obrazu }
      port[$3c5] := $0f;
      for i := 0 to 65535 do
        mem[$a000:i] := $00;
    end;

    procedure PutPixel(X,Y,Width: word; Color: byte);
    var addr:word;
    begin
      port[$3c4] := 2;
      port[$3c5] := 1 shl (x and 3);
      addr := (x shr 2) + Y*width + ScrOff;
      mem[$a000:addr] := color;
    end;


    procedure SetVisualPageOffset(pageoffs: word);
    { ustawienie strony widocznej }
    begin
      port[$3d4] := $0c;
      port[$3d5] := pageoffs shr 8; { górne 8 bajtów }
      port[$3d4] := $0d;
      port[$3d5] := pageoffs and $ff; { dolne 8 bajtów }
    end;

    procedure VRT;
    begin
      while (port[$3da] and $08) > 0 do ; { oczekiwanie na malowanie obrazu }
      while (port[$3da] and $08) = 0 do ; { oczekiwanie na powrót pionowy }
    end;

    hm...
    istnieją 2 przestrzenie.. przestrzeń pamięci i przestrzeń wejść/wyjść.. przestrzeń pamięci (memr/memw) służy do przechowywania danych które potem mogą być wykorzystane.
    przestrzeń wejść/wyjść (ior/iow.. w pascalu port[ ]) służy do bezpośredniego programowania urządzeń.. wysyła sie tam bajty sterujące i kontrolne.. odczytuje różne stany itp..

    mówiąc wpisanie danych do grafiki niejest równoznaczne z wyświetleniem pixla chodziło mi oto że to jest karta graficzna A NIE przetwórnik cyfrowo-analogowy który po dostaniu danych odrazu je wysyła do monitora..
    grafika cały czas wysyła zawartość swojej pamięci na monitor bez żadnego cache'u.. jeśli TYLKO coś wpiszemy do pamięci grafiki, ta przy kolejnym wyświetlaniu tego piksla odczyta inną wartość i taką też wyświetli..
    i inna sprawa.. karta graficzna działa w przestrzeni IO na kilku adresach (około 20).. a w pamięci siedzi na całych 2 segmentach (adresy fizyczne od 0xA0000 do 0xBFFFF).. aby zaprogramować grafike sięgamy do przestrzeni IO ale żeby zmienić zawartość klatki do wyświetlenia sięgamy do przestrzeni pamięci..

    p.s. samo to że istnieje efekt pływania obrazu wyklucza pamięć cache grafiki i wyświetlanie klatki dopiero na żądanie..
  • Poziom 10  
    SUPER!!! teraz to już wszystko jasne :)
    nie powinno być w takim razie to takie trudne... zobaczymy co uda mi sie zdzaiłać w tym zakresie :) jesli tylko te adresy są pewnego rodzaju standardem (chodzi o przestrzeń IO) to w takim razie powinienem dać sobie rade :)
    jeszce sie tylko upewnie: rozumiem że funkcja port[..] automatycznie wysyła odpowiednie dane i po ich wyslaniu ustawia Iow i ALE w stan niski (bądź odpbierając Ior i ALE w stan niski), a funkcja mem[...] ustawia memw w stan niski, jak zapisuje lub memr w stan niski, jak odczytuje.?

    co do tego migotania.. to wiem.. rozumiem ze to właśnie swiadczy o tym, ze nie ma cache'u.. ale chciałem sie upewnic :)

    Dzięki wielkie za odpowiedz i w ogole za pomoc...

    A powiedz mi jeszcze, co z przerwaniami? nie używa sie przerwań do pracy z kartą graficzną ISA?

    Niom.
    Pozdrawiam i szczesliwego nowego 2005. roku!!!

    Pozdrawiam
    Darek
  • Pomocny post
    Poziom 34  
    karty graficzne muszą sie trzymać jakiegoś standardu.. inaczej nawet dos by na nich niechodził bez odpowiednich sterowników..
    sygnał ALE służy do poinformowania wszystkich układów że adres na magistrali A jest stabilny.. sygnał ten jest aktywny w stanie wysokim.. niewolno wystawić żadnego żądania (ior/iow/memr/memw) bez uwcześniejszego wystawienia adresu.. (wyjątek stanowi DMA ale to nie ten temat..)
    Opisze wszystkie 4 sekwencje bo widze że musze..

    Zapisanie do IO:
    - port[Adres] := Data;
    1/ A0-A15 <- Adres
    2/ ALE <- 1
    3/ D0-D7 <- Data
    4/ IOW <- 0
    5/ odczekanie kilku cykli..
    6/ IOW <- 1
    7/ ALE <- 0

    Odczyt z IO:
    - Data := port[Adres]
    1/ A0-A15 <- Adres
    2/ ALE <- 1
    3/ IOR <- 0
    4/ odczekanie kilku cykli
    5/ Data <- D0-D7
    6/ IOR <- 1
    7/ ALE <- 0

    Zapisanie do pamięci:
    - mem[Adres] := Data;
    1/ A0-A19 <- Adres
    2/ ALE <- 1
    3/ D0-D7 <- Data
    4/ MEMW <- 0
    5/ odczekanie kilku cykli..
    6/ MEMW <- 1
    7/ ALE <- 0

    Odczyt z pamięci:
    - Data := mem[Adres]
    1/ A0-A19 <- Adres
    2/ ALE <- 1
    3/ MEMR <- 0
    4/ odczekanie kilku cykli
    5/ Data <- D0-D7
    6/ MEMR <- 1
    7/ ALE <- 0

    w pascalu adresy zapisuje sie w postaci segment:adres np $a000:$1234.. adres taki trzeba najpierw przeliczyć aby zmieścił sie na magistrali adresowej 20bitowej.. liczy sie tak:
    adres_liniowy = segment*16 + offset;

    karte graficzną jak najbardziej da sie obsługiwać za pomocą przerwań.. można wykorzystać przerwanie z grafiki do sygnalizowania różnych stanów takich jak powrót pionowy itd.. ale dodatkowe programowanie kontrolera grafiki aby wystawiał przerwania i kod dla atmelka aby je obsługiwał... wystarczy obsługa bez przerwań..
  • Poziom 10  
    Masz Ci los :) jaśnie sie już chyba nie da :)
    Dziekuje Ci bardzo za te wszystkie odpowiedzie i bede próbował :)musze tylko kupic dłuższa płytke, bo na moich niestety złącze ISA sie nie miesci :) Natomiast, jeśl mi sie uda, to właściwie tylko dzieki Tobie :)
    Pozdrawiam jeszce raz i jescze raz wszystkiego najlepszego w nowym roku :)

    Darek
  • Poziom 10  
    Witam ponownie!
    Mam jeszce takie pytanko... na szynie jest jeszcze taki pin jak OSC (pin B30)... napisane jest że "High-speed Clock 70ns, 14.31818 MHz, 50% duty cycle)... czy to znaczy, że na tym pinie mam podać taką czestotliwośc, bo karta nie ma swojego oscylatora (ten pin na karcie istnieje, więc najwyraźniej przewidziany jest do uzytku)?

    Pozdrawiam
    Darek
  • Poziom 15  
    Odkopuje tak stary temat, ponieważ nie chcę zakładać nowego wątku. Jestem bardzo, ale to bardzo, ale to baaaaaaaardzo zainteresowany tym tematem, ponieważ właśnie takiego wyświetlania potrzebuję do projektu, który teraz akurat robię. Czy ktoś ma już może gotowy kod? Chodzi mi bardziej o te adresy itd. niż o gotowy kod. A może podłączyćby kartę na PCI?

    Proszę o pomoc,

    SM

    P.S. Proszę o przeniesienie wątku do działu AVR.
  • Poziom 30  
    Witam,

    A jakie masz wymagania w stosunku do karty?
    Czy ma pracować w trybie graficznym czy wystarczy tryb tekstowy?

    Jeżeli wystarczy ci tryb tekstowy lub semi-grafika to zerknij na dwa moje projekty w dziale DIY konstrukcje, wykorzystujące kartę TeleVga.
    Dostępne są pełne kody źródłowe.

    https://www.elektroda.pl/rtvforum/viewtopic.php?p=10120357#10120357
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=10473627#10473627


    Zalety:
    - Łatwe podłączenie do AVR (szyna SPI)
    - Pełne biblioteki obsługi
    - Mniejszy pobór prądu niż karta VGA-ISA

    Pozdrawiam
    JarekC
  • Poziom 15  
    Niestety nie posiadam karty TeleVGA(nie pamiętam takiej karty, co to jest za karta?), muszę wykorzystać jakoś karty ISA (PCI i AGP chyba się nie da, nie wspominając o PCI-E :D )
    Starczy mi tryb tekstowy, używać chyba będę Atmega 16/32.
  • Poziom 30  
    Witam,

    Karta do kupienia u producenta lub na znanym portalu aukcyjnym A...
    Jest dedykowana do systemów z uP typu AVR,C51,ARM,PIC itp

    PCI, PCI-E i AGP raczej nie podłączysz do AVR bez sporego pośredniego interfejsu.
    ISA do podłączenia ale zajmuje sporo pinów 16-linii adresowy, 8 linii danych IOW, IOR,ALE.
    W przypadku ATmega16/32 albo zajmiesz wszystkie porty albo będziesz musiał dołożyć trochę "logiki" na zewnątrz.

    Aktualnie jedyną zaletą starych kart ISA jest to, że można je wyszperać z szuflady lub kupić za grosze.

    Pozdrawiam
    JarekC
  • Poziom 15  
    Może być np. ATmega128 lub ATmega163, ale koniecznie potrzebuję rozwiązanie z ISA (odpadają TeleVGA itd.).
  • Poziom 30  
    Projekt z ATMEGA128 znajdziesz tutaj:
    http://tinyvga.com/avr-isa-vga

    Jest od dość mocno rozbudowany ale sporo rzeczy można wyrzucić.
    Projekt będzie trochę zależał od typu karty jaką posiadasz (tzw Chipset).
    Część kart wymagała specyficznej inicjalizacji, pamiętaj o tym że stare karty VGA-ISA posiadały własne ROM-BIOS.


    Pozdrawiam
    JarekC
  • Poziom 26  
    JarekC napisał:
    ISA do podłączenia ale zajmuje sporo pinów 16-linii adresowy


    Zwykle operuje się na 10 bitach (zakres 0x3FF).
  • Poziom 30  
    Witam,

    10 bitów dotyczy przestrzeni I/O, natomiast w przypadku pamięci adres był 20 bitowy. Karty zajmowały zarówno przestrzeń I/O jak i memory.

    Mam gdzieś w pracy dwie polskie książki poświęcone kartom VGA ale teraz nie pamiętam ich tytułów.

    ISA to teraz już archeologia.

    Pozdrawiam
    JarekC
  • Poziom 15  
    JarekC napisał:
    Witam,

    10 bitów dotyczy przestrzeni I/O, natomiast w przypadku pamięci adres był 20 bitowy. Karty zajmowały zarówno przestrzeń I/O jak i memory.

    Mam gdzieś w pracy dwie polskie książki poświęcone kartom VGA ale teraz nie pamiętam ich tytułów.

    ISA to teraz już archeologia.

    Pozdrawiam
    JarekC


    Gdybyś mógł zrobić skan tych książek i wrzucić na elektrodę był bym ci bardzo wdzięczny.

    EDIT: Z czego zrobić takie gniazdo do ISA, ale kątowe (z płyty głównej mogę wylutować, ale są to gniazda proste)?

    Edit2: Zaraz wygrzebie moją kartę z szuflady i napisze jaka to jest.

    Dodano po 2 [godziny] 28 [minuty]:

    BoskiDialer napisał:
    karty graficzne muszą sie trzymać jakiegoś standardu.. inaczej nawet dos by na nich niechodził bez odpowiednich sterowników..
    sygnał ALE służy do poinformowania wszystkich układów że adres na magistrali A jest stabilny.. sygnał ten jest aktywny w stanie wysokim.. niewolno wystawić żadnego żądania (ior/iow/memr/memw) bez uwcześniejszego wystawienia adresu.. (wyjątek stanowi DMA ale to nie ten temat..)
    Opisze wszystkie 4 sekwencje bo widze że musze..

    Zapisanie do IO:
    - port[Adres] := Data;
    1/ A0-A15 <- Adres
    2/ ALE <- 1
    3/ D0-D7 <- Data
    4/ IOW <- 0
    5/ odczekanie kilku cykli..
    6/ IOW <- 1
    7/ ALE <- 0

    Odczyt z IO:
    - Data := port[Adres]
    1/ A0-A15 <- Adres
    2/ ALE <- 1
    3/ IOR <- 0
    4/ odczekanie kilku cykli
    5/ Data <- D0-D7
    6/ IOR <- 1
    7/ ALE <- 0

    Zapisanie do pamięci:
    - mem[Adres] := Data;
    1/ A0-A19 <- Adres
    2/ ALE <- 1
    3/ D0-D7 <- Data
    4/ MEMW <- 0
    5/ odczekanie kilku cykli..
    6/ MEMW <- 1
    7/ ALE <- 0

    Odczyt z pamięci:
    - Data := mem[Adres]
    1/ A0-A19 <- Adres
    2/ ALE <- 1
    3/ MEMR <- 0
    4/ odczekanie kilku cykli
    5/ Data <- D0-D7
    6/ MEMR <- 1
    7/ ALE <- 0

    w pascalu adresy zapisuje sie w postaci segment:adres np $a000:$1234.. adres taki trzeba najpierw przeliczyć aby zmieścił sie na magistrali adresowej 20bitowej.. liczy sie tak:
    adres_liniowy = segment*16 + offset;

    karte graficzną jak najbardziej da sie obsługiwać za pomocą przerwań.. można wykorzystać przerwanie z grafiki do sygnalizowania różnych stanów takich jak powrót pionowy itd.. ale dodatkowe programowanie kontrolera grafiki aby wystawiał przerwania i kod dla atmelka aby je obsługiwał... wystarczy obsługa bez przerwań..


    Post kolegi BoskiDialer bardzo mi rozjaśnił całą sprawę ale:

    1. Czym różni się zapis do IO a zapis do pamięci (rozumiem chyba, że to jest pamięć obrazu, ale IO - co to i po co tam coś zapisywać)?
    2. Jak "rozkłada" się na bity adresu adres dajmy na to 0x79? Po prostu przeliczyć na binarne i wystawić na bity A** ?
    3. Od jakiego do jakiego adresu jest pamięć obrazu?
  • Poziom 32  
    Podział na pamięć i IO to taka uroda niektórych procków np. Intela i stąd szyny ISA. Są tam oddzielne rozkazy, które przesyłają dane jako IO. Trochę upraszcza to konstrukcję, ale nie tworzy jakiejś nowej jakości.
    Dostęp na poziomie sprzętowym różni się wysterowaniem innych sygnałów - MEMx daje dostęp do pamięci, IOx - dostęp do przestrzeni IO.

    Typowe karty peryferyjne, typu COM, LPT, MultiIO itp, które do szczęścia potrzebują kilku rejestrów, korzystają wyłącznie z przestrzeni IO. Natomiast karta graficzna potrzebuje spory obszar na pamiętanie obrazu - stąd wykorzystanie obszaru memory.

    Proste karty graficzne miały układ kontrolera graficznego (w CGA, Hercules był to 6845), który posiadał swoje rejestry do skonfigurowania trybu graficznego, oraz pamięć graficzną, do której był bezpośredni dostęp. AFAIR 6845 umożliwiał dostęp do pamięci graficznej poprzez swoje rejestry, ale jest to znacznie wolniejsze niż dostęp bezpośredni. Odwzorowanie konkretnych komórek pamięci graficznej na pixele obrazu zależy od aktualnego trybu.

    Nowsze karty graficzne (EGA i wyżej) miały więcej pamięci niż było to zarezerwowane w mapie pamięci IBM-PC i wtedy był odpowiedni rejestr do wybrania części pamięci graficznej, która będzie dostępna w okienku.
  • Poziom 30  
    Witam,

    Odszukałem książki o VGA:

    1 Sterownik graficzny VGA N.Kowlczyk. D.Krzemiński Wydawnictwo LUPUS 1993
    2.Karty graficzne. Sterowniki EGA,VGA Super VGA przewodnik dla programistów R.Jarża Wydawnictwo PALMApress 1993

    Pozdrawiam
    JarekC