Èíôîðìàöèîííûé ïîðòàë MSEVM






Ãëàâíàÿ > Arduino > VGA íà Arduino




VGA ýòî ñîêðàùåíèå îò Video Graphics Array, ïðîòîêîëà îòîáðàæåíèÿ âèäåî, êîòîðûé ÷àñòî âñòðå÷àåòñÿ â ìèðå ýëåêòðîíèêè.  VGA èñïîëüçóåòñÿ îäíà "÷àñòîòà ñëåäîâàíèÿ ïèêñåëåé" è óñòàíîâëåííàÿ ÷àñòîòà âûâîäà âèäåî äàííûõ ãîðèçîíòàëüíî, ñòðîêà çà ñòðîêîé, ïîêà âåñü êàäð íå áóäåò îòîáðàæåí, à ïîòîì âñ¸ íà÷èíàåòñÿ ñíîâà.

Öåëü è îáçîð ýòîãî ïðîåêòà



Öåëüþ äàííîãî ïðîåêòà ÿâëÿåòñÿ èñïîëüçîâàíèå Arduino äëÿ âûâîäà ñòàíäàðòíîãî èçîáðàæåíèÿ ñ êðàñíûì, çåëåíûì è ñèíèì öâåòîì íà êîìïüþòåðíûé VGA ìîíèòîð. Êðîìå ïëàòû Arduino èñïîëüçóåòñÿ ïëàòà ñ VGA ðàçúåìîì.

Äëÿ òîãî, ÷òîáû âûâåñòè êðàñíûé, çåëåíûé è ñèíèé öâåòà íà êîìïüþòåðíûé VGA ìîíèòîð, ìû äîëæíû äîãîâîðèòüñÿ î ðàçðåøåíèè, êîòîðîå ìû áóäåì ïûòàòüñÿ èìèòèðîâàòü. Íàïðèìåð, 800x600 óäîáíî, ò.ê. èñïîëüçóþòñÿ öåëûå êðóãëûå ÷èñëà, è ÷àñòîòà ñëåäîâàíèÿ ïèêñåëåé ñîñòàâëÿåò 40ÌÃö. È ìîæíî èìèòèðîâàòü VGA ðàçðåøåíèå 800x600 è âûâîäèòü 200 ëèíèé êðàñíîãî, 200 ëèíèé çåëåíîãî è 200 ëèíèé ñèíåãî öâåòîâ. Ïîñêîëüêó Arduino ðàáîòàåò íà ÷àñòîòå 16ÌÃö, íåâîçìîæíî ïîëó÷èòü äîñòóï ê êàæäîìó ïèêñåëþ, ïîýòîìó ìû áóäåì âûâîäèòü öåëèêîì ëèíèè.

Ýëåìåíòû:

Îñîáåííîñòè ñõåìû

RGB ñîåäèíåíèÿ

 VGA èñïîëüçóåòñÿ ñìåøèâàíèå êðàñíîãî çåëåíîãî è ñèíåãî öâåòîâ äëÿ ïîëó÷åíèÿ âñåõ öâåòîâ ðàäóãè. Ïàðàìåòðû íà êàæäîì èç ýòèõ êîíòàêòîâ ïîêàçûâàþò ìîíèòîðó, íàñêîëüêî èíòåíñèâíî äîëæåí ãîðåòü ýòîò öâåò. Ìû íå ðåãóëèðóåì èíòåíñèâíîñòü öâåòà, ïîýòîìó ó íàñ âñåãäà äëÿ êàæäîãî èç öâåòîâ 100% êðàñíîãî, 100% çåëåíîãî èëè 100% ñèíåãî.

Hsync è Vsync ñîåäèíåíèÿ

Äëÿ òîãî ÷òîáû çíàòü, êàêàÿ ëèíèÿ ñåé÷àñ îòîáðàæàåòñÿ è çàâåðøåí ëè êàäð, èñïîëüçóåòñÿ äâà ñèãíàëà ñèíõðîíèçàöèè: ãîðèçîíòàëüíàÿ ñèíõðîíèçàöèÿ H-SYNC è âåðòèêàëüíàÿ ñèíõðîíèçàöèÿ V-SYNC. Ýòî ñàìûå âàæíûå ñèãíàëû, è åñëè èõ òàéìèíãè áóäóò íàðóøåíû, òî VGA âûõîä íå áóäåò ðàáîòàòü êàê íàäî.

Îñíîâû òåîðèè VGA

 ñïåöèôèêàöèè VGA îïèñûâàåòñÿ îòîáðàæåíèå öâåòîâûõ äàííûõ, ãîðèçîíòàëüíîé è âåðòèêàëüíîé ñèíõðîíèçàöèè, è îá îïðåäåëåííîì âðåìåíè íà êàæäîå äåéñòâèå, êîòîðîå íåëüçÿ ïðîïóñêàòü.

Arduino UNO òàêòèðóåòñÿ êâàðöåâûì ãåíåðàòîðîì 16ÌÃö è îäíà èíñòðóêöèÿ âûïîëíÿòüñÿ çà îäèí öèêë, ÷òî îçíà÷àåò, ÷òî êàæäàÿ èíñòðóêöèÿ â íàøåé ïðîãðàììå áóäåò âûïîëíÿòüñÿ òî÷íî çà (1/16000000) ñåêóíäû èëè ïðèìåðíî 62,5 íàíîñåêóíäû.



Òàê êàê êàæäàÿ èíñòðóêöèÿ âûïîëíÿåòñÿ 62,5 íàíîñåêóíäû, è ìû äîëæíû ïðîâîäèòü ñèíõðîíèçàöèþ â îïðåäåëåííîå âðåìÿ, âàæíî, ÷òî êàæäîå âðåìÿ ñ êàðòèíêè âûøå äåëèòüñÿ íà 62,5 íàíîñåêóíäû, à ýòî çíà÷èò, ÷òî ìû ìîæåì èñïîëüçîâàòü èíñòðóêöèè ñ çàäåðæêîé, ÷òîáû ïîëó÷èòü èäåàëüíîå âðåìÿ äëÿ ñèíõðîíèçàöèè.



Ïðè èñïîëüçîâàíèè 800x600VGA, êàæäàÿ ñòðîêà çàêàí÷èâàåòñÿ ãîðèçîíòàëüíûì èìïóëüñîì ñèíõðîíèçàöèè, êîòîðûé ñîîáùàåò ìîíèòîðó äàííûå ñëåäóþùåé ñòðîêè. Ïîñëå ñèíõðîíèçàöèè 601 ëèíèè, ìîíèòîð îæèäàåò èìïóëüñ âåðòèêàëüíîé ñèíõðîíèçàöèè ïðîäîëæèòåëüíîñòüþ 4 ëèíèè.  ýòîò ìîìåíò åñòü ïàóçà â 23 ëèíèè. Áëàãîäàðÿ âåðòèêàëüíîé ñèíõðîíèçàöèè è çàäíåé ïëîùàäêè ñòðî÷íîãî ãàñÿùåãî èìïóëüñà, ëèíèè îòîáðàæàþòñÿ, íî èíôîðìàöèÿ î öâåòå íå èñïîëüçóåòñÿ.

Ïðîãðàììíàÿ ÷àñòü

Åñòü äâå îñíîâíûõ ÷àñòè êîäà:
- Öâåò äëÿ öèêëîâ + Hsync
- Âåðòèêàëüíàÿ ñèíõðîíèçàöèÿ

3 öèêëà èñïîëüçóþòñÿ äëÿ ñîçäàíèÿ òðåõ ðàçëè÷íûõ öâåòîâ, êîòîðûå îòîáðàæàþòñÿ íà ýêðàíå. Âîò âûäåðæêà èç êîäà äëÿ ãåíåðàöèè 200 ëèíèé êðàñíîãî öâåòà. Âðåìÿ óêàçàíî â êîììåíòàðèÿõ, è âû ìîæåòå ëåãêî óâèäåòü ñîîòâåòñòâèå.
#include 

//Quickly Turn VSYNC On/Off
//Or You Can Change The VSYNC Pin..
#define VSYNC_LOW    PORTD &= ~_BV(6)
#define VSYNC_HIGH   PORTD |= _BV(6)

//Quickly Turn HSYNC On/Off
//Or You Can Change The HSYNC Pin..
#define HSYNC_LOW    PORTD &= ~_BV(7)
#define HSYNC_HIGH   PORTD |= _BV(7)

//RED
#define RED_ON       PORTB |= _BV(4)
#define RED_OFF      PORTB &= ~_BV(4)

//Green
#define GREEN_ON     PORTB |= _BV(3)
#define GREEN_OFF    PORTB &= ~_BV(3)

//BLUE
#define BLUE_ON      PORTB |= _BV(2)
#define BLUE_OFF     PORTB &= ~_BV(2)

void setup() {
}

void loop() {
//Initializations
int i = 0;
cli();
DDRB = 0xFF;
DDRD = 0xFF;
  
//Loop Over-And-Over Again
  while(1){
        //Clear The i counter
      i=0;
        //VSYNC Low
      VSYNC_LOW;
        //200 Lines Of Red
      while(i < 200){
            //Red Color High
          RED_ON;
          
            //2.2uS Back Porch
          delayMicroseconds(2);  
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          
            //20uS Color Data
          delayMicroseconds(20); // 1uS        
          
            //Red Color Low
          RED_OFF;  //Low
          
            //1uS Front Porch
          delayMicroseconds(1); // 1uS 
          i++;
          
            //3.2uS Horizontal Sync
          HSYNC_HIGH;  //HSYNC High
          delayMicroseconds(3);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          HSYNC_LOW;  //HSYNC Low
          
          //26.4uS Total
      }
         //Clear The i counter
      i=0;
        //VSYNC Low 
      VSYNC_LOW;
        //200 Lines Of Green
      while(i < 200){
            //Green Color High
          GREEN_ON;      
            
            //2.2uS Back Porch
          delayMicroseconds(2);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          
            //20uS Color Data
          delayMicroseconds(20); // 1uS        
          
            //Green Color Low
          GREEN_OFF;  //Low
          
            //1uS Front Porch
          delayMicroseconds(1); // 1uS 
          i++;
          
            //3.2uS Horizontal Sync
          HSYNC_HIGH;  //HSYNC High
          delayMicroseconds(3);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          HSYNC_LOW;  //HSYNC Low
          
            //26.4uS Total
      }    
  
        //Clear The i counter
      i=0;
        //VSYNC Low 
      VSYNC_LOW;  //Low
        //200 Lines Of Blue
      while(i<200){
            //Blue Color High
          BLUE_ON;  //Low      
          //2.2uS Back Porch
          delayMicroseconds(2);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          
            //20uS Color Data
          delayMicroseconds(20); // 1uS        
          
            //Blue Color Low
          BLUE_OFF;  //Low
          
            //1uS Front Porch
          delayMicroseconds(1); // 1uS 
          i++;
          
            //3.2uS Horizontal Sync
          HSYNC_HIGH;  //HSYNC High
          delayMicroseconds(3);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          HSYNC_LOW;  //HSYNC Low
          
            //26.4uS Total
      }    
        //Clear The i counter
      i=0;
        //VSYNC High
      VSYNC_HIGH;
        //4 Lines Of VSYNC   
      while(i<4){         
            //2.2uS Back Porch    
          delayMicroseconds(2);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          
            //20 uS Of Color Data
          delayMicroseconds(20);// 20uS
          
            //1uS Front Porch
          delayMicroseconds(1); // 1uS
          i++;
          
            //HSYNC for 3.2uS
          HSYNC_HIGH;  //High
          delayMicroseconds(3);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          HSYNC_LOW;  //Low  
          
            //26.4uS Total
      }
      
        //Clear The i counter
      i=0;
        //VSYNC Low
      VSYNC_LOW;
        //23 Lines Of Vertical Back Porch + 1 Line Of Front Porch
        //This is very, very flexible...Setting it to 22 Lines
      while(i < 22){
            //2.2uS Back Porch
          delayMicroseconds(2);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
    
            //20uS Color Data
          delayMicroseconds(20);// 20uS
            
            //1uS Front Porch
          delayMicroseconds(1); // 1uS
          i++;
          
            //HSYNC for 3.2uS
          HSYNC_HIGH;  //High
          delayMicroseconds(3);
          __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
          HSYNC_LOW;  //Low  
          
            //26.4uS Total
      }    
  }
}


Ïîäðîáíåå: /forum/index.php?topic=6289


Ôàéëû: vga.zip

Èñïîëüçîâàíû ìàòåðèàëû: http://www.pyroelectro.com/tutorials/arduino_basic_vga/





e-mail ðàññûëêè
Ðàäèîëþáèòåëü
Ïîäïèñàòüñÿ ïèñüìîì


















ßíäåêñ öèòèðîâàíèÿ Rambler's Top100