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

ATMEGA - generowanie kolorowego sygnalu video composite

18 Lut 2012 11:45 6229 20
  • Poziom 18  
    Udało mi się wysterować atmegą sygnał compostite video (czarno biały). Wszystko niby fajnie tyle że mam problem z ustaleniem pewnego szczegółu. Algorytm mój działa na takiej zasadzie:

    - zero ( sygnał synchronizacji 4uS) - dane o kolorach pikseli w linii 0V dla czarnego 1V dla białego (60uS).

    Chciałbym mieć jednak dostęp do każdego piksela na ekranie i nie wiem (nie mogę ustalić ) ile linii wchodzi na cały ekran. Poza tym chcąc kolorować piksel w każdej linii. Co jaki odstęp czasowy powinienem zmieniać tam wartość (jeśli linia trwa 60uS ) aby sterować poszczególnymi pikselami?
  • PCBway
  • Poziom 30  
    Upraszając nieco problem ...
    Sygnał PAL składa się sygnału luminancji (to co teraz generujesz) i sygnału chrominancji. Ta chrominancja to informacja o kolorze. Jest to sygnał 4.43 MHz modulowany w odpowiedni sposób tzw. sygnałami różnicowymi.
    Wygenerowanie tego wszystkiego w przez procesor AVR jest dość trudne ale technicznie możliwe. Konieczny jest jednak szybki przetwornik DAC, odpowiednio duża zewnętrzna pamięć RAM i szybki procesor np. ATXmega.
  • PCBway
  • Poziom 18  
    Jasne tylko mnie zastanawia jak to się ma do długości i czasu. Czyli ile linii wchodzi na jeden ekran oraz jak czasowo wyglądają impulsy między poszczególnymi pikselami w linii.
  • Poziom 30  
    Sygnał composite jest "analogowy" czyli nie ma czegoś takiego jak piksele.
    W systemie PAL jedna kompletna ramka składa się 625 linii. Jednak stosowany jest tzw. przeplot czyli jedna ramka to w rzeczywistości dwa półobrazy po 312,5 linii. Stare telewizory zwykle akceptowały również obraz bez przeplotu czyli ramki składające się z 312 linii.
  • Poziom 33  
    Piksel to najmniejszy niepodzielny element obrazu i to ty ustalasz ile ma ich być w poziomie i w pionie. Moze być np. 9x6 na cały ekran lub 800x600. Dla PAL-u bodajże obliczeniowo 512 na linię ale sprawdź w wiki.
    Oddzielna sprawa to rozdzielczość czyli ile widać linii.
    I oddzielna ile możesz z biednej megi wygenerować impulsów w linii.
    No i kwestia modulacji koloru, stosuje się enkodery analogowe z własnym kwarcem.
    Jak masz wejście scart to można bez enkodera podawać rgb i synchro.

    Tu byś zobaczył:
    http://www.riccibitti.com/dvm.htm
    i tu http://www.riccibitti.com/bingo.htm

    N.
  • Poziom 32  
    Jeśli chodzi o pixele, to ZXSpectrum (256 pixeli w linii) miał zegar ULI 7MHz (pixclock), natomiast Amiga
    (~640 pixeli w linii) - 14MHz. Oba w PAL. Zostawało jeszcze trochę na border. Są to częstotliwości zegara taktującego pojawianie się kolejnych pixeli na wyjściu.
  • Poziom 22  
    prociomen007 --> jak byś podał schemat i listingi, to chyba by się nic złego nie stało?
  • Poziom 18  
    Postanowiłem uprościć nieco sprawę i przerzucić się na VGA. Sygnał monitorowy. Gdzie sterujemy tak:

    PORTA - sygnał synchronizacji ramki
    PORTB - sygnał synchronizacji linii
    PORTC - wartość koloru RGB (dane obrazu)

    kod napisałem taki:

    Code:

    void wyslij_sygnal_synchronizacji_ramki(void)
    {
      PORTA = 0xFF;
      PORTA = 0x00;
    }

    void wyslij_sygnal_synchronizacji_lini(void)
    {
      PORTB = 0xFF;
      PORTB = 0x00;
    }

    void ustaw_piksel(int a){

        if((a%2)==0)
        {
         PORTC = 0xFF;
        }else{
         PORTC = 0x00;   
        }

    }

    void rysuj(void){

     int wiersz=0;
     int linia=0;

    wyslij_sygnal_synchronizacji_ramki();

    for(wiersz=0; wiersz>240; wiersz++)
    {
       wyslij_sygnal_synchronizacji_lini();

       for(linia=0; linia>320; linia++)
       {
       ustaw_piksel(linia);      
       }
    }

    }

    ...

    void main(){

    while(1){
    rysuj();
    }
    }


    Powinno wygenerować mi to szachownice ale niestety nic nie widzę. Problem zapewne polega na czasie. Pomiędzy poleceniami generowana jedyneczki dla synchronizacji powinny pojawić się jakieś pauzy. Pytanie jak długie? Całość taktowana zegarem 16Mhz.
  • Poziom 30  
    Wszystkie sygnały muszą być bardzo precyzyjnie generowane. Inaczej mówiąc poszczególne części programu muszą się wykonywać ściśle określoną liczbę cylkli zegara. W C bardzo trudno będzie to osiągnąć.

    Dla VGA częstotliwość linii jest dwa razy większa niż dla PAL. Generowanie programowe potrzebnych sygnałów będzie więc trudniejsze.
  • Poziom 18  
    No więc idąc za linkami udoskonaliłem swój kod. Niestety wciąż coś nie gra. Po podłączeniu na ekranie dostaję monit: Optymalna rozdzielczość ekranu to 1280*720 60Hz. Monit znika i na ekranie widzę "czarnść". Znika jednak informacja o braku połączenia co świadczy o tym że monitor się synchronizuje. Aktualny kod wygląda tak:

    Code:


    void wyslij_sygnal_synchronizacji_lini(void)
    {
        int pomoc=0;

      PORTB = 0x00;   //generujemy impuls   
     
        for(pomoc=0; pomoc<124; pomoc++)
            #asm("nop"); 
       
      PORTB = 0xFF;  //wracamy do jednynki
     
    }

    void wyslij_sygnal_synchronizacji_ramki(void)
    {
        int linia=0;
        int wiersz=0;
       
        //Front porch       
        for(wiersz=0; wiersz<11; wiersz++)
        {
       wyslij_sygnal_synchronizacji_lini();

       for(linia=0; linia<320; linia++)
       {
        PORTC = 0x00;   
       }
        }


       

        for(wiersz=0; wiersz<2; wiersz++)
        {
       wyslij_sygnal_synchronizacji_lini();

       for(linia=0; linia<320; linia++)
       {
           PORTA = 0x00;  //generujemy impuls dla synchronizacji ramki
       }
        }
         
        PORTA = 0xFF;
       
        for(wiersz=0; wiersz<31; wiersz++)
        {
       wyslij_sygnal_synchronizacji_lini();

       for(linia=0; linia<320; linia++)
       {
          PORTC = 0x00;
       }
        }
                                         

    }


    void ustaw_piksel(int a){

        if((a%2)==0)
        {
         PORTC = 0xFF;
        }else{
         PORTC = 0x00;   
        }

    }

    void rysuj(void){

     int wiersz=0;
     int linia=0;
     
    for(wiersz=0; wiersz<240; wiersz++)
    {
       wyslij_sygnal_synchronizacji_lini();

       for(linia=0; linia<320; linia++)
       {
       ustaw_piksel(linia);   
       }
    }

    wyslij_sygnal_synchronizacji_ramki();

    }

    ...

    PORTB = 0xFF;
    PORTA = 0xFF;

    while (1)
          {
          // Place your code here
          rysuj();
          }
  • Poziom 30  
    Nie wiem czego więcej oczekujesz. Generujesz sygnały synchronizacji zupełnie nie przejmując się standardem. Musisz zadbać aby ich częstotliwość miała ściśle określoną wartość. Tak jak już napisałem wcześniej zapanowanie nad tym w programie napisanym w C będzie bardzo trudne.
  • Poziom 18  
    No niby stosuje się już do wszelkich porad i dalej mi to nie działa. Timing dla danego rezonatora obliczam sobie tak:

    ( Dany timing / (25.175MHz) ) * aktualna częstotliwość

    mam na stanie tylko 8Mhz więc z obliczeń wychodzi mi tak

    (640/25.175)*8 = 204 cykle procesora.

    obliczyłem sobie jak to się ma w moim przypadku stosując się to tych tabelek:
    ATMEGA - generowanie kolorowego sygnalu video composite

    i wychodzi mi coś takiego:
    ATMEGA - generowanie kolorowego sygnalu video composite

    Teraz idąc za waszymi poradami opóźnienia realizuję sobie assemblerem. Cały układ testowałem oscyloskopem i widać że przebiegi się ładne generują po podłączeniu do monitora niestety dostaję czarno. Nic nie widać. Kod powinien mi pokolorować ekran na biało. Tak się pieczętuje:

    Code:

    void czekaj203();
    void czekaj5();
    void czekaj31();
    void czekaj15();

    void liniakolor(){

        PORTA=0xFF;
        czekaj203();
        PORTA=0x00;
        czekaj5();
        PORTB=0x00; //sygnał synchronizacji
        czekaj31();
        PORTB=0xFF; 
        czekaj15();
    }

    void liniapusta(){
        czekaj203();
        czekaj5();
        PORTB=0x00; //sygnał synchronizacji
        czekaj31();
        PORTB=0xFF; 
        czekaj15();
    }


    void rysuj(){
        int i=0;

       for(i=0; i<480; i++)
          liniakolor();     
       
       for(i=0; i<10; i++)
        liniapusta(); 
                     
        PORTC=0x00; //synchronizacjia ramki
        liniapusta();
        liniapusta();                     
        PORTC=0xFF;
       
       for(i=0; i<33; i++)
        liniapusta();
    }

    void main(void)
    {
    ....
    while (1)
          {
          // Place your code here
          rysuj();
          }
    }


    void czekaj203(){
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
    }

    void czekaj5(){
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
    }

    void czekaj31(){
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");
    }

    void czekaj15(){
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
    }

  • Poziom 19  
    Tu masz podstawowe wiadomości o PAL Link

    Tu o VGA Link

    Generować kolor też się da na prostym DAC zrobionym na rezystorach popatrz tu Link jest mnustwo w sieci projektów a nawet gier generujacych prosta grafike kolorową tu troche teorii Link

    a na yotube pełno przykładów.

    A to schemat DAC to PAL
    ATMEGA - generowanie kolorowego sygnalu video composite

    Jak się zapoznasz i zrozumiesz to poradzisz sobie z napisaniem programu.
  • Poziom 18  
    Dziękuję wam za wszystkie odpowiedzi wiele mi to pomogło jednak ciągle mam problem. Jest lepiej bo coś tam już widać ale jeszcze nie jest ok. Zaznaczam na początku że nie mam należytego sprzętu aby zrobić to jak należy jednak zanim zainwestuję w mikrokontroler taktowany 25 Mhz chcę mieć już jakiś wstęp na sprzęcie który posiadam a posiadam Atmegę16 taktowaną 8 Mhz. Na LCD dostaję aktualnie monit: "to nie jest optymalna rozdzielczość" i widzę ciemność. ( Program powinien kolorować cały ekran na czerwono. ) Tak to wygląda:

    ATMEGA - generowanie kolorowego sygnalu video composite

    Na CRT jest lepiej widać w tle czerwone paski które skaczą po całym ekranie jak na video:

    http://www.youtube.com/watch?v=Eol8QKXS6AY&feature=youtu.be

    Widać również tam monit o nie optymalnej rozdzielczości. Nie mam pojęcia czym to jest spowodowane. Kod prezentuje się tak:

    Code:

    #include <mega16a.h>

    // Declare your global variables here
    void czekaj202();
    void czekaj3();
    void czekaj30();
    void czekaj13();

    void liniakolor(){
        czekaj3();
        PORTB=0x00;   //sygnał synchronizacji
        czekaj30();
        PORTB=0xFF;
        czekaj13();
        czekaj3();
        PORTA=0xFF;  //dane kolory
        czekaj202();
        PORTA=0x00;
        czekaj3();
    }

    void liniapusta(){
        czekaj3();
        PORTB=0x00;   //sygnał synchronizacji
        czekaj30();
        PORTB=0xFF;
        czekaj13();
        czekaj3();
        czekaj202();
        #asm("NOP");
        czekaj3();
    }


    void rysuj(){
        int i=0;

        liniapusta();
        liniapusta();
       
        PORTC=0x00; //synchronizacjia ramki
        liniapusta();
        liniapusta();                     
        PORTC=0xFF;   
       
        for(i=0; i<25; i++)
            liniapusta();
             
        for(i=0; i<8; i++)
            liniapusta();
               
        for(i=0; i<480; i++)
            liniakolor();     
       
        for(i=0; i<8; i++)
            liniapusta(); 
                     
    }



    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
    PORTA=0x00;
    DDRA=0xFF;

    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
    PORTB=0xFF;
    DDRB=0xFF;

    // Port C initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
    PORTC=0xFF;
    DDRC=0xFF;

    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1
    PORTD=0xFF;
    DDRD=0xFF;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // USART disabled
    UCSRB=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;

    // SPI initialization
    // SPI disabled
    SPCR=0x00;

    // TWI initialization
    // TWI disabled
    TWCR=0x00;

    while (1)
          {
          // Place your code here
          rysuj();
          }
    }


    void czekaj202(){
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
        #asm("NOP");#asm("NOP");
    }

    void czekaj3(){
        #asm("NOP");#asm("NOP");#asm("NOP");;
    }

    void czekaj30(){
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
    }

    void czekaj13(){
       #asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");#asm("NOP");
       #asm("NOP");#asm("NOP");#asm("NOP");
    }
  • Poziom 19  
    Niestety nie czytasz i nie zaglądasz nawet do linków co podałem, masz tam projekt działający, jest źródło w GCC, możesz na tym przykładzie dużo się nauczyć i zrobić swój program na bazie tego gotowego przykładu. To co robisz w Twoim przykładzie to nieporozumienie i szkoda Twojego i Naszego czasu. Generować powinieneś wszystkie zależności czasowe używając do tego Timerów a nie "NOPów". Monitor źle wysterowujesz, nie podajesz mu właściwych sygnałów synchronizacji, więc monitor wyświetla monit o tym, nie dziw się.

    Działający program, jego źródła, opisy budowy, wyjaśnienie budowy i podłączeń do monitora VGA, schemat na ATmega8 i 16MHz link => Link czytaj

    Jeśli chcesz dalej sie męczyć na nopach Twoja sprawa. Przeczytaj i zrób na bazie tego projektu a dużo sie nauczysz.
  • Poziom 18  
    Co ty opowiadasz że cały kod jest do kitu. Autor tego postu https://www.elektroda.pl/rtvforum/viewtopic.ph...a+xamrex&sid=4fec9d1c2aea63cefb8f893ff7312ce2 realizował sprawę podobnie i jak widać mu się udało. Nie twierdzę że to jest optymalne i genialne rozwiązanie jednak uważam że powinno działać. Może ta atmega 8Mhz nie daje rady (mimo że uwzględniłem to w programie). Proszę zauważyć że na CRT jakieś efety widać.
  • Poziom 30  
    Całkowicie się zgadzam z WOBI. Program, który napisałeś raczej nie ma szans zadziałać.
    Kompletnie nie panujesz nad zależnościami czasowymi.
  • Poziom 21  
    Robiłem taki generator tylko że na FPGA i błąd w timingu rzędu 1% psuł cały obraz.
    Żeby sobie tak sterować obrazem przez VGA + kolory to musisz mieć przetwornik , chociażby na rezystorach i do tego pamięć SRAM (żeby było prościej).

    Mogę Ci teraz pokazać ile będzie zajmował pamięci RAM sam bufor.
    Załóżmy że skromnie użyjesz rozdzielczości 640x480 i głębię kolorów 9-cio bitową 3 bity na każdy kolor. Będziesz więc potrzebować :

    640*480*9 = 345600 B = 338kB pamięci. Więc nie licz na to że załatwisz wszystko Atmegą. Jest to dobry uC ale nie w takich aplikacjach. Tu by się przydał ARM lub właśnie jakiś układ programowalny , gdzie byś zrobił na nim sterowanie i interfejs a później tylko z Atmegi wysyłał polecenia np. line(10,10,100,100); :)

    Jednak do tego daleka droga. Widziałem też gdzieś gotowe do kupienia sterowniki VGA z prostym interfejsem, gdzie bez problemu by sobie Atmega poradziła. Może to coś dla Ciebie ?

    Pozdrawiam.
  • Poziom 19  
    To że ktoś na świecie jeździ furmanką z koniem i kopie rowy łopata to nie znaczy że Ty masz to robić, ja Tobie pokazuje tylko że można jeżdzic samochodem i kopać koparką. Grzecznie podałem linki, pisze przez grzeczność Tobie z dużej litery. Za to Ty upierasz się i coś chcesz udowodnić tylko sam nie wiesz co. Masz gotowy projekt na ATMEGA8, podałem link wyżej (sam go też zrobiłem) i to działa. Jeśli tak chcesz postępować to życe Ci powodzenia i nie oczekuj na pomoc. Kasuje więc linki i moje posty. Nie licz więcej że Tobie pomogę, skoro chcesz "jeździc furmanka" Twoja wola, ale przykro mi że za pomoc odpłaciłes agresją.

    Myśle że forumowicze zostawią ten post bez komentarza. Pozdrawiam wszystkich.

    PS. Jeśli wystawiasz na forum swoje projekty to badź gotowy na rady i krytykę. Nie jest wstyd nie wiedzieć bo nikt nie wie wszystkiego a mądrośc to powiedzenie dziękuje.