INtime Tech

INtime Top


 °í¼Ó ADº¯È¯ È®Àå º¸µåÀÇ ÀÌ¿ë


1.¸ñÀû

¿©±â¿¡¼­´Â INtime ¾îÇø®ÄÉÀ̼ǿ¡¼­, DMA ±â´ÉÀ» žÀçÇÑ Ãʰí¼Ó ADº¯È¯ PCI º¸µåÀÇ »ç¿ë¿¹¸¦ ÇØ¼³Çϰí ÀÖ½À´Ï´Ù.

2.º¸µå °³¿ä

ÀÌÇÏÀÇ PCI È®Àå º¸µå¸¦ ¿¹¿¡ ÇØ¼³Çϰí ÀÖ½À´Ï´Ù.

¸ÞÀÌÄ¿   ÁÖ½Äȸ»ç ÀÎÅÍÆäÀ̽º

Á¦Ç°¹øÈ£  PCI-3525

±â´É °³¿ä

PCI ¹ö½º¿¡ ÁذÅÇÑ Ãʰí¼Ó 12ºñÆ® ADº¯È¯/I/O¹æ½Ä 12ºñÆ® DAº¯È¯ º¸µåÀÔ´Ï´Ù. 2 ä³Î µ¿½Ã ÀÔ·ÂÀ¸·Î ÃÖ°í 10 MHz »ùÇøµÀÌ °¡´ÉÇÕ´Ï´Ù.PCI bus master ¹æ½ÄÀÇ ¹ö½ºÆ® Àü¼Û°ú ½ºÄ³ÅͰ³ÀÚ ¹æ½ÄÀ» ¼­Æ÷Æ®ÇØ, °í¼ÓÀÌ°í ´ë¿ë·®ÀÇ DMA Àü¼ÛÀÌ °¡´ÉÇÕ´Ï´Ù.

3.ÇÁ·Î±×·¡¹Ö ÇØ¼³

3.1.ÇÁ·Î±×·¥ °³¿ä

PCI-3525¸¦ »ç¿ëÇϴµ¥ÀÇ Æ÷ÀÎÆ®·Î¼­ ½ºÄ³ÅÍ ±â´ÉÀÌ ÀÖ½À´Ï´Ù. ½ºÄ³ÅͿʹ DMA ¹öÆÛ ÁÖ¼Ò¸¦ FIFO ¹æ½ÄÀ¸·Î º¸À¯ÇØ, »ùÇøµÀÌ °³½ÃµÇ¸é µî·ÏÇÑ DMA ¹öÆÛ¿¡ µ¥ÀÌÅͰ¡ Àü¼Û µÇ´Â ±¸Á¶ÀÔ´Ï´Ù.¿©±â¿¡¼­´Â, ½ºÄ³ÅÍ ±â´ÉÀ» »ì¸° DMA µ¥ÀÌÅÍ Àü¼Û¿¡ ÀÇÇÑ AD»ùÇøµ ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù.

 

3.1.1.ÇÁ·Î±×·¥ ¼ø¼­ Ç÷οì

 

3.1.2. ADC º¸µåÀÇ ÁÖµÈ ±â´É

¼³Á¤Ä¡ÀÇ ÀÚ¼¼ÇÑ °ÍÀº º¸µå ¸ÞÀÌÄ¿ ȨÆäÀÌÁö¿¡¼­ °ø°³µÇ°í ÀÖ´Â ¡¸PCI-3525 I/O°ø°³ Àڷ᡹¸¦ ºÁ ÁÖ¼¼¿ä.

1) »ùÇøµ Á¶°Ç ¼³Á¤(»ùÇøµÀÇ °³½Ã ¹æ¹ýÀÇ ÀüÀ¸·Î ¼³Á¤ÇÏ´Â)

  • ¨ç ADº¯È¯ ¸ðµå(º£À̽º ÁÖ¼Ò£«0 x05)
    ±â´É£º»ùÇøµ Ŭ¶ô ¼³Á¤(³»Àå Ŭ¶ô/external clock)À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x05, 0x00 );¡¡¡¡// »ùÇøµ Ŭ¶ô ¼³Á¤À» ³»Àå Ŭ¶ô·Î
                                                                                           // ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
  • ¨è ADº¯È¯ °³½Ã/Á¾·á Æ®¸®°Å ¼³Á¤(º£À̽º ÁÖ¼Ò£«0 x06)
    ±â´É£º»ùÇøµ °³½Ã Á¶°Ç ¼³Á¤/Á¾·á Á¶°Ç ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x06, 0x90 );¡¡¡¡// »ùÇøµ °³½Ã Á¶°Ç ¼³Á¤À» AD¼ÒÇÁÆ®¿þ¾î
                                                                                           // ½ºÅ¸Æ®, Á¾·á Á¶°Ç ¼³Á¤À» ADÁöÁ¤ °Ç¼ö Á¾·á·Î
                                                                                           // ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
    ¡Ø»ùÇøµ Á¾·á Á¶°Ç¿¡¼­ ¡¸ADÁöÁ¤ °Ç¼ö Á¾·á¡¹¸¦ ¼³Á¤ÇßÀ» °æ¿ì, ÀÌÈÄ¿¡ ±âÀçÇÏ´Â ¡¸ADº¯È¯ ÁöÁ¤ °Ç¼ö/ADº¯È¯ Æ÷½ºÆ®Æ®¸®°Å °Ç¼ö ¼³Á¤¡¹ À¸·Î ¼³Á¤     ÇÑ   °Ç¼ö ºÐÀÇ »ùÇøµÀÌ ¿Ï·áÇÑ ½ÃÁ¡¿¡¼­ Á¾·á°¡ µË´Ï´Ù.
  • ¨é ADº¯È¯ ÀÔ·Â »ç¾ç ¼³Á¤(º£À̽º ÁÖ¼Ò£«0 x07)
    ±â´É£ºÀÔ·Â ¸ðµå ¼³Á¤(Åë»ó/¹è¼Ó) ¹× »ùÇøµ Ä¿¸àµå ¼³Á¤(ADC¿¡ÀÇ Å¬¶ô °ø±Þ À¯¹«)
          À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x07, 0x40 );¡¡¡¡// ÀÔ·Â ¸ðµå ¼³Á¤À» Åë»ó ¸ðµå, »ùÇøµ
                                                                                           // Ä¿¸àµå¸¦ Ŭ¶ô °ø±ÞÇÏ´Â °ÍÀ¸·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡Ø»ùÇøµ Ä¿¸àµå´Â ¡¸Å¬¶ô °ø±ÞÇÑ´Ù¡¹¸¦ ¼³Á¤ÇØ ÁÖ¼¼¿ä.¡¸Å¬¶ô °ø±ÞÇÏÁö ¾Ê´Â´Ù¡¹·Î Çϸé, DMA Àü¼ÛÀ» ÇÏÁö ¾Ê½À´Ï´Ù.¶Ç, ¼³Á¤ ÈÄ´Â 1 msecÀÇ ¿þÀÌÆ®¸¦ µÎ°í ³ª¼­ ´ÙÀ½ÀÇ ¼³Á¤À» ½Ç½ÃÇØ ÁÖ¼¼¿ä.

  • ¨ê ADº¯È¯ ÀÔ·Â ·¹ÀÎÁö Ch1(º£À̽º ÁÖ¼Ò£«0 x08)
    ±â´É£ºCH1ÀÇ ÀÔ·Â ·¹ÀÎÁö ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x08, 0x00 );¡¡¡¡// ÀÔ·Â ·¹ÀÎÁö ¼³Á¤À»±5 V·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
  • ¨ë ADº¯È¯ ÀÔ·Â ·¹ÀÎÁö Ch2(º£À̽º ÁÖ¼Ò£«0 x09)
    ±â´É£ºCH2ÀÇ ÀÔ·Â ·¹ÀÎÁö ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x09, 0x00 );¡¡¡¡// ÀÔ·Â ·¹ÀÎÁö ¼³Á¤À»±5 V·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
  • ¨ì AD»ùÇøµ Ŭ¶ô/ÀÎÅ͹ú ŸÀÌ¸Ó ¼³Á¤(º£À̽º ÁÖ¼Ò£«0 x0C~0 x0E)
    ±â´É£ºAD»ùÇøµ Ŭ¶ô ¼³Á¤ ¹× ÀÎÅ͹ú ŸÀÌ¸Ó ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºouthword( dwBaseAddr + 0x0C, 0x0002 );¡¡¡¡// AD»ùÇøµ Ŭ¶ôÀ» 10 MHz·Î ¼³Á¤
                                                                                                    // ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    SET[15..0]

    »ùÇøµ Á֯ļö(Hz)

    ÁÖ±â(s)

    0002h

    10M

    100n

    0003h

    6.667M

    150n

    0004h

    5M

    200n

    0005h

    4M

    250n

    0014h

    1M

    1¥ì

    00C8h

    100k

    10¥ì

    07D0h

    10k

    100¥ì

    4E20h

    1k

    1m

    FFFFh

    302.2

    3.27675m

    ¡ØAD»ùÇøµ Ŭ¶ôÀº, »ó±â·Î ±âÀçÇÑ ¡¸ADº¯È¯ ¸ðµå¡¹°¡ ³»Àå Ŭ¶ôÀÇ °æ¿ì¿¡ À¯È¿ÇÕ´Ï´Ù.

  • ¨í ADº¯È¯ ÁöÁ¤ °Ç¼ö/ADº¯È¯ Æ÷½ºÆ®Æ®¸®°Å °Ç¼ö ¼³Á¤(º£À̽º ÁÖ¼Ò£«0 x10~0 x12)
    ±â´É£º»ùÇøµ °Ç¼ö ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x10, 100 );¡¡¡¡// »ùÇøµ °Ç¼ö¸¦ 101°ÇÀ¸·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.
           outbyte( dwBaseAddr + 0x11, 0 );
           outbyte( dwBaseAddr + 0x12, 0 );

    ¡Ø¡¸PCI-3525 I/O°ø°³ Àڷ᡹¿¡¼­´Â, ¼³Á¤Ä¡°¡ 0ÀÇ °æ¿ìÀÇ °Ç¼ö°¡ 0°ÇÀÌ µÇ°í ÀÖ½À´Ï´Ù¸¸ 1°ÇÀÇ ½Ç¼öÀÔ´Ï´Ù.

  • ¨î µ¿±âÈ­ ¼³Á¤(º£À̽º ÁÖ¼Ò£«0 x1E)
    ±â´É£ºº¹¼ö¸Åº¸µåÀÇ µ¿±â »ùÇøµ À¯¹« ¼³Á¤ ¹× AD/DAº¯È¯ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x1E, 0x00 );¡¡¡¡// º¹¼ö¸Åµ¿±â »ùÇøµÀ» »ç¿ëÇÏÁö ¾Ê´Â,
                                                                                            // ADº¯È¯À¸·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

2) DMA ÀÌ¿ë Á¶°Ç ¼³Á¤

DMA¸¦ ÀÌ¿ëÇϰí, ADµ¥ÀÌÅ͸¦ ÃëµæÇÏ·Á¸é , DMA¿ë ¹öÆÛÀÇ ¼±µÎ ÁÖ¼Ò¿Í ¹öÆÛ »çÀÌÁ ½ºÄ³ÅÍ·Î ºÒ¸®´Â ·¹Áö½ºÅÍ¿¡ µî·ÏÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ´Ã»ó ½ºÄ³ÅÍ´Â, DMA¿ë ¹öÆÛ¸¦ ÃÖ´ë 64°³±îÁö µî·Ï °¡´ÉÇϰí, AD»ùÇøµÁß¿¡ ½ºÄ³ÅÍ¿¡ µî·ÏµÈ DMA¿ë ¹öÆÛ¸¦ Ãß°¡µî·Ï °¡´ÉÇÕ´Ï´Ù.(DMA ½ºÄ³ÅÍ Àüȯ Interrupt·Î Ãß°¡µî·Ï ÇÕ´Ï´Ù.)

  • ¨ç ADº¯È¯ DMA º£À̽º ÁÖ¼Ò(º£À̽º ÁÖ¼Ò£«0 x24~0 x27)
    ±â´É£º½ºÄ³ÅÍ¿¡ DMA ¹öÆÛÀÇ ¹°¸® ÁÖ¼Ò ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutword((WORD)( dwBaseAddr + 0x24), dwPhyAddr );¡¡¡¡// DMA ¹öÆÛÀÇ ¹°¸® ÁÖ¼Ò¸¦
                                                                                                                         // ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡Ø½ºÄ³ÅÍ¿¡ ¼³Á¤ÇÏ´Â DMA ¹öÆÛ´Â 4ÀÇ ¹è¼öÀÏ Çʿ䰡 ÀÖ½À´Ï´Ù. À̰ÍÀº, 1 CHºÐÀÇ DMA ¹öÆÛ¿¡ Àü¼Û µÇ´Â »çÀÌÁî´Â 2 ByteÀÔ´Ï´Ù¸¸, PCI-3525ÀÇ »ç¾ç¿¡ ÀÇÇØ 1ȸÀÇ µ¥ÀÌÅÍ Àü¼ÛÀ¸·Î CH1/2µ¿½Ã¿¡ Àü¼Û µÇ±â ¶§¹® ÀÔ´Ï´Ù.

  • ¨è ADº¯È¯ DMA ¾×¼¼½º Ä«¿îÆ® ¼¼Æ®(º£À̽º ÁÖ¼Ò£«0 x2C~0 x2D)
    ±â´É£º½ºÄ³ÅÍ¿¡ ¼³Á¤ÇÑ DMA ¹öÆÛÀÇ Àü¼Û »çÀÌÁî ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºouthword((WORD)( dwBaseAddr + 0x2C), 32768 - 1 );¡¡¡¡// DMA ¹öÆÛÀÇ Àü¼Û »çÀÌÁî¿¡ 32767Byte ¸¦
                                                                                                                        // ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡ØDMA ¹öÆÛÀÇ Àü¼Û »çÀÌÁ ¼³Á¤ÇÒ ¶§´Â, ½ºÄ³ÅÍ¿¡ ¼³Á¤ÇÑ DMA ¹öÆÛ »çÀÌÁî ¹«´Ì 1À» »« °ªÀ» ¼³Á¤ÇÕ´Ï´Ù. À̰ÍÀº, ÇÏÀ§ 2 Bit¸¦ ¼³Á¤ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ Àü¼Û »çÀÌÁî´Â 4ÀÇ ¹è¼ö-1ÀÌ µË´Ï´Ù.

  • ¨é ADº¯È¯ DMA ÀÎÅÍ·´Æ®(º£À̽º ÁÖ¼Ò£«0 x31)
    ±â´É£ºDMA ¹öÆÛ µ¥ÀÌÅÍ Àü¼Û½ÃÀÇ Interrupt ¹ß»ý¼ö ¹× ½ºÄ³ÅÍ Àüȯ½Ã Interrupt ¹ß»ý¼öÀÇ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x31, 0x0F );¡¡¡¡// DMA ¹öÆÛ µ¥ÀÌÅÍ Àü¼Û½ÃÀÇ ÀÎÅÍ·´Æ® ¹ß»ý¼ö¸¦ 32768 Dword,
                                                 // ½ºÄ³ÅÍ Interrupt ¹ß»ý¼ö¸¦ 4·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡ØDMA ¹öÆÛ µ¥ÀÌÅÍ Àü¼Û½ÃÀÇ ÀÎÅÍ·´Æ® ¹ß»ý¼ö¸¦ 32768(¼³Á¤ °¡´ÉÇÑ ÃÖ´ë¼ö)ÀÎ ÀÌÀ¯´Â, ÀûÀº °ªÀ» ¼³Á¤Çϸé Interrupt°¡ ¿¬¼ÓÇØ µé¾î°¡±â À§ÇØ ÃÖ´ë¼ö¸¦ ¼³Á¤ÇØ ÀÖ½À´Ï´Ù.¶Ç, ÀÌ »ùÇÿ¡¼­´Â DMA ¹öÆÛ µ¥ÀÌÅÍ Àü¼Û½ÃÀÇ Interrupt´Â »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù.

  • a) DMA µ¥ÀÌÅÍ Àü¼Û Interrupt¹ß»ý¼ö´Â, DMA ¹öÆÛ¿¡ ´ëÇØ »ùÇøµ µ¥ÀÌÅͰ¡ ¸î°³ Àü¼Û µÇ¾úÀ» ¶§¿¡ ÀÎÅÍ·´Æ®¸¦ ¹ß»ýÇұ °áÁ¤ÇÕ´Ï´Ù.

  • b) DMA ½ºÄ³ÅÍ ÀüÈ¯ÇØ Interrupt ¹ß»ý¼ö´Â, ½ºÄ³ÅÍ·Î ¼³Á¤µÇ¾î ÀÖ´Â DMA ¹öÆÛ¼ö°¡ ¸î°³·ÎºÎÅÍ ¸î°³¿¡ º¯È­ÇßÀ» ¶§¿¡ Interrupt¸¦ ¹ß»ý½Ãų±î¸¦ °áÁ¤ÇÕ´Ï´Ù. ¾Æ·¡¿Í °°Àº ¿¹´Â, ½ºÄ³ÅÍ·Î ¼³Á¤µÇ¾î ÀÖ´Â DMA ¹öÆÛ¼ö°¡ 5¿¡¼­ 4¿¡ º¯È­ÇßÀ» ¶§¿¡ Interrupt°¡ ¹ß»ýÇÕ´Ï´Ù.

ad4.jpg

  • ¨ê ¹ö½ºÆ®Àå ¼³Á¤(º£À̽º ÁÖ¼Ò£«0 x32)±â´É£ºDMA ¹öÆÛ¿¡ÀÇ µ¥ÀÌÅÍ Àü¼Û ´ÜÀ§ÀÇ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù. ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x32, 0x01 );¡¡¡¡// µ¥ÀÌÅÍ Àü¼Û ´ÜÀ§¿¡ 1À» ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡Ø¸®¾óŸÀÓ¼ºÀ» ¿Ã¸®·Á¸é 1À» ¼³Á¤ÇÕ´Ï´Ù.

3) ¿ÜºÎ ½ÅÈ£ ÀÔ·Â Á¶°Ç ¼³Á¤

CN3, CN4ÀÇ ¿¬°á±â¸¦ »ç¿ëÇØ ¿ÜºÎ·ÎºÎÅÍÀÇ ½ÅÈ£¸¦ °³½Ã Á¶°ÇÀ̳ª »ùÇøµ Ŭ¶ôÀ¸·Î¼­ ÀÔ·Â °¡´ÉÇÕ´Ï´Ù.

  • ¨ç ADº¯È¯ ¿ÜºÎ Æ®¸®°Å °³½Ã/Á¾·á Á¶°Ç(º£À̽º ÁÖ¼Ò£«0 x18)
    ±â´É£º¿ÜºÎ Æ®¸®°ÅÀÇ °³½Ã ¹× Á¾·á Á¶°ÇÀÇ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x18, 0x01 );¡¡¡¡// °³½Ã Á¶°ÇÀ» ÀϾ °ËÃâ, Á¾·á Á¶°ÇÀ»
                                                                                          // ¹«È¿·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡Ø¾Æ·¡¿Í °°Àº ¿ÜºÎ ½ÅÈ£±Ø¼º ¼³Á¤¿¡ ÁÖÀÇÇØ ÁÖ¼¼¿ä.

  • ¨è ¿ÜºÎ ½ÅÈ£±Ø¼º(º£À̽º ÁÖ¼Ò£«0 x19)
    ±â´É£º¿ÜºÎ Æ®¸®°Å ¹× ¿ÜºÎ ÀÎÅÍ·´Æ® ¹× external clockÀÇ ±Ø¼ºÀÇ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x19, 0x01 );¡¡¡¡// ¿ÜºÎ Æ®¸®°Å¸¦ »ó½Â ¸ð¼­¸® À¯È¿Çϰí
                                                                                          // ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡ØADº¯È¯ ¿ÜºÎ Æ®¸®°Å °³½Ã/Á¾·á Á¶°Ç ¼³Á¤¿¡¼­ ¡¸¿ÜºÎ Æ®¸®°ÅÀÇ Ã¹ ½ÃÀÛ °ËÃâÀ» À¯È¿¡¹·Î ÇßÀ» °æ¿ì, EXTRG IN±Ø¼º ¼³Á¤À» ¡¸»ó½Â ¸ð¼­¸® À¯È¿¡¹·Î ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¹Ý´ë·Î ADº¯È¯ ¿ÜºÎ Æ®¸®°Å °³½Ã/Á¾·á Á¶°Ç ¼³Á¤¿¡¼­ ¡¸¿ÜºÎ Æ®¸®°ÅÀÇ ¼­ ³»·Á°¨ °ËÃâÀ» À¯È¿¡¹·Î ÇßÀ» °æ¿ì, EXTRG IN±Ø¼º ¼³Á¤À» ¡¸Çϰ­ ¸ð¼­¸® À¯È¿¡¹·Î ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

  • ¨é CN3 ¿ÜºÎ Á¦¾î ½ÅÈ£ ¼±ÅÃ(º£À̽º ÁÖ¼Ò£«0 x1A)
    ±â´É£ºCN3ÀÇ ¿ÜºÎ Á¦¾î ½ÅÈ£ÀÇ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x1A, 0x01 );	// ¿ÜºÎ Æ®¸®°Å ÀÔ·ÂÀ¸·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡Ø¼³Á¤ ÈÄ´Â 1 msecÀÇ ¿þÀÌÆ®¸¦ µÎ°í ³ª¼­ ´ÙÀ½ÀÇ ¼³Á¤À» ½Ç½ÃÇØ ÁÖ¼¼¿ä.CN4·Î ¼³Á¤ÇØ ÀÖ´Â °ÍÀº ¼³Á¤ÇÒ ¼ö ¾ø½À´Ï´Ù.

  • ¨ê CN4 ¿ÜºÎ Á¦¾î ½ÅÈ£ ¼±ÅÃ(º£À̽º ÁÖ¼Ò£«0 x1B)
    ±â´É£ºCN4ÀÇ ¿ÜºÎ Á¦¾î ½ÅÈ£ÀÇ ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
     ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x1A, 0x03 );	// external clock ÀÔ·ÂÀ¸·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

    ¡Ø¼³Á¤ ÈÄ´Â 1 msecÀÇ ¿þÀÌÆ®¸¦ µÎ°í ³ª¼­ ´ÙÀ½ÀÇ ¼³Á¤À» ½Ç½ÃÇØ ÁÖ¼¼¿ä.CN3·Î ¼³Á¤ÇØ ÀÖ´Â °ÍÀº ¼³Á¤ÇÒ ¼ö ¾ø½À´Ï´Ù.

3.2.ÃʱâÈ­ ó¸®

PCI-3525¿¡¼­ DMA Àü¼Û¿¡ ÀÇÇÑ AD»ùÇøµÀ» °³½ÃÇϱâ±îÁö, ¹Ì¸® PCI-3525¿¡ ´ëÇØ ¼³Á¤À» ½Ç½ÃÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¼ø¼­¸¦ »ùÇà ÇÁ·Î±×·¥¿¡ ÀÇÇØ ÀÌÇÏ¿¡ ±âÀçÇÕ´Ï´Ù.

 

3.2.1. º¸µå Á¤º¸ÀÇ Ãëµæ

PCI-3525ÀÇ Á¦¾î Á¤º¸(I/OÆ÷Æ® º£À̽º ÁÖ¼Ò, IRQ ¹øÈ£)µîÀ» PCI ÄÁÇDZ׷¹ÀÌ¼Ç ·¹Áö½ºÅÍ·Î ºÎÅÍ ÃëµæÇÕ´Ï´Ù. º¸µå Á¤º¸ÀÇ Ãëµæ ¹æ¹ýÀ» ¾Æ·¡¿¡ ±âÀçÇÕ´Ï´Ù.

 

¡ØPCI º¸µå·ÎºÎÅÍÀÇ Á¤º¸ Ãëµæ¿¹(ÇÔ¼ö À̹ÌÁö)

 
PCIDEV	dev;
 
 dev.wVendorId	= 0x1147;		// º¥´õ IDÀÇ ¼³Á¤
 dev.wDeviceId	= 0x0DC5;		// µð¹ÙÀ̽º IDÀÇ ¼³Á¤
 dev.wDeviceIndex	= 0;		// ÃÖÃÊ·Î ¹ß°ßµÈ µð¹ÙÀ̽º¸¦ ÃëµæÇÏ´Â °æ¿ìÀÇ ÁöÁ¤
 
 if (PciFindDevice(&dev) == FALSE)	// PCI ÄÁÇDZַ¹ÀÌ¼Ç Á¤º¸ÀÇ Ãëµæ(IRQ, I/Oº£À̽º ÁÖ¼Òµî )
 	return ( -1 );		// ÁöÁ¤ µð¹ÙÀ̽º°¡ ¹ß°ßµÇÁö ¾Ê±â ¶§¹®¿¡ ¿¡·¯¸¦ µ¹·ÁÁÝ´Ï´Ù.
 
 // ÀÎÅÍ·´Æ® ·¹º§(IRQ)ÀÇ Ãëµæ
 if ((dev.byIntLine == 0) || (dev.byIntLine == 255))	
     return 0xFFFF;¡¡¡¡  // ÀÌ µð¹ÙÀ̽º¿¡´Â IRQ°¡ ¾ø´ÂÁö, ÀÎÁ¤¹ÞÁö ¸øÇÑ IRQÄ¡À̱⠶§¹®¿¡ ¿¡·¯¸¦ µ¹·ÁÁÝ´Ï´Ù.
 
 byInt = dev.byIntLine;
 // ÀÎÅÍ·´Æ® ·¹º§ÀÇ »êÃâ
 wIntLevel = (byInt < 8) ? (byInt * 16 + 8) : ((1 + byInt / 8) * 16 + (byInt % 8));
 
 // I/Oº£À̽º ÁÖ¼ÒÀÇ Ãëµæ
 dwBaseAddr = (WORD) dev.dwBaseAddr[0] & 0xfffc;¡¡¡¡¡¡¡¡// ÃëµæÇÑ 0¹øÂ°ÀÇ º£À̽º ÁÖ¼Ò°¡ AD¿ëÀ¸·Î
                                                                                                               // µË´Ï´Ù.
 
 

ÁÖÀÇÁ¡£ºINtime2.23 ȯ°æ¿¡¼­ ÀÎÅÍ·´Æ®¸¦ »ç¿ëÇÏ´Â °æ¿ì´Â, SetRtProcessMaxPriority() ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇØ, ÇÁ·Î¼¼½ºÀÇ ÃÖ´ë priority¸¦ 0À¸·Î ¼³Á¤ÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.

 

3.2.2. ADC º¸µåÀÇ ÃʱâÈ­

ADC º¸µåÀÇ ÃʱâÈ­ ¼ø¼­¸¦ »ùÇà ÇÁ·Î±×·¥À¸·Î ±âÀçÇÕ´Ï´Ù. ¼³Á¤ »ó¼¼ÇÏ°Ô °ü°èÇØ¼­´Â, º¸µå ¸ÞÀÌÄ¿º¸´Ù Ȩ ÆäÀÌÁö¿¡¼­ °ø°³µÇ°í ÀÖ´Â ¡¸PCI-3525 I/O°ø°³ Àڷ᡹¸¦ ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

 
// ÀÎÅÍ·´Æ® ¸¶½ºÅ©(0 x3Ch~0x3Dh)
 outhword((WORD)( dwBaseAddr + 0x3C), 0x0000);    // ADC ÀüÇÒÆ÷ÇÔ ±ÝÁö
 // ADº¯È¯ Ä¿¸àµå(0x04h)
 outbyte( dwBaseAddr + 0x04, 0x01 );        // ADº¯È¯ ½ºÅé(°­Á¦ Á¾·á)
 // ADº¯È¯ DMA Ä¿¸àµå(0x30h)
 outbyte( dwBaseAddr + 0x30, 0x02 );        // DMA Àü¼Û Á¤Áö
 // ADº¯È¯ ÀÔ·Â »ç¾ç ¼³Á¤(0x07h)
 outbyte( dwBaseAddr + 0x07, 0x40 );        // ¡ØDMA Àü¼Û½Ã´Â ¹Ýµå½Ã¡°bit6=1¡±
 knRtSleep(UsecsToKticks(1));
 // ADº¯È¯ ÀÔ·Â ·¹ÀÎÁö Ch1(0x08h)
 outbyte( dwBaseAddr + 0x08, 0x00 );        // 0x00£º±5V ÀÔ·Â ·¹ÀÎÁö
 // ADº¯È¯ ÀÔ·Â ·¹ÀÎÁö Ch1(0x09h)
 outbyte( dwBaseAddr + 0x09, 0x00 );        // (Àü¼ú)
 // ADº¯È¯ ¿ÜºÎ Æ®¸®°Å °³½Ã/Á¾·á Á¶°Ç(0x18h)
 outbyte( dwBaseAddr + 0x18, 0x01 );        // 0x00£º¿ÜºÎ Æ®¸®°Å °³½Ã Á¶°Ç ù ½ÃÀÛ ÁöÁ¤
 // ¿ÜºÎ ½ÅÈ£±Ø¼º(0x19h)
 outbyte( dwBaseAddr + 0x19, 0x00 );        // 0x00£º¿ÜºÎ ½ÅÈ£´Â ¸ðµÎ Çϰ­ ¸ð¼­¸® À¯È¿
 // CN3 ¿ÜºÎ Á¦¾î ½ÅÈ£ ¼±ÅÃ(0x1Ah)
 outbyte( dwBaseAddr + 0x1A, 0x01 );        // 0x01£ºCN3¿¡ ¿ÜºÎ Æ®¸®°Å¸¦ ÀÔ·ÂÇÑ´Ù
 knRtSleep(UsecsToKticks(1));
 // CN4 ¿ÜºÎ Á¦¾î ½ÅÈ£ ¼±ÅÃ(0x1Bh)
 outbyte( dwBaseAddr + 0x1B, 0x03 );        // 0x03£ºCN4¿¡ external clock¸¦ ÀÔ·ÂÇÑ´Ù
 knRtSleep(UsecsToKticks(1));
 // µ¿±âÈ­ ¼³Á¤(0x1Eh)
 outbyte( dwBaseAddr + 0x1E, 0x00 );	// 0x00£ºº¹¼öÀÇ º¸µå·Î µ¿±âÈ­ÇÏÁö ¾Ê´Â´Ù
 // DMA ÀÎÅÍ·´Æ®(0x31h)
 outbyte( dwBaseAddr + 0x31, 0x0f );	// 0x0f£ºDMA Àü¼ÛÇÒÀÔ£º32768 DWORD ´ÜÀ§, ½ºÄ³ÅÍ ÀüȯÇÒÀÔ£º4
 // DMA Àü¼Û ¹ö½ºÆ®Àå ¼³Á¤(0x32h)
 outbyte( dwBaseAddr + 0x32, 0x01 );	// ¸®¾óŸÀÓ¼ºÀ» Áß½ÃÇØ 1 »ùÇøµ¸¶´Ù DMA Àü¼ÛÀ» ½Ç½ÃÇÏ´Â ¼³Á¤

 

3.3.DMA Àü¼Û ¹öÆÛÀÇ ½ºÄ³ÅÍ µî·Ï

DMA¿ë ¹öÆÛ ¹°¸® ÁÖ¼Ò Ãëµæ°ú ½ºÄ³ÅÍ µî·Ï¿¹

 
// DMA Àü¼Û¿ë ¹öÆÛÀÇ È®º¸
 if((pDMAMem = AllocateRtMemory(0x40000)) == NULL)	// DMA¿ë ¹öÆÛ »ý¼º
     SuspendError("E$M_DMA", "%ld", 0x40000);	// ¿¡·¯À̱⠶§¹®¿¡, Interrupt ½º·¹µå¸¦ ÁßÁö
 
 // ¹°¸® ÁÖ¼Ò Ãëµæ
 if((dwPhyAddr = GetRtPhysicalAddress(pDMAMem, 0x40000, 0)) == BAD_PHYSICAL_ADDRESS)
     SuspendError("E$P_DMA", "%ld", 0x40000);	// ¿¡·¯À̱⠶§¹®¿¡, Interrupt, ½º·¹µå¸¦ ÁßÁö
 
 // ADº¯È¯ DMA Ä¿¸àµå(0x30h)
 outbyte( dwBaseAddr + 0x30, 0x40 );		// ½ºÄ³ÅÍ FIFO Ŭ¸®¾î
 
 // ADº¯È¯ DMA Ä¿¸àµå(0x30h)
 outbyte( dwBaseAddr + 0x30, 0x80 );		// ADµ¥ÀÌÅÍ ¹öÆÛ Ŭ¸®¾î
 
 dwAddr = dwPhyAddr;
 for(wCnt = 0;wCnt < 6;wCnt ++)
 {
     outword((WORD)( dwBaseAddr + 0x24), dwAddr);	// DMA º£À̽º ÁÖ¼Ò
     outhword((WORD)( dwBaseAddr + 0x2C), 0x8000 - 1);	// ¡¸DMA¿ë ¹öÆÛ »çÀÌÁ£­1À» ¼¼Æ®
  dwAddr += 0x8000;                          	// ´ÙÀ½ÀÇ ¹°¸®ÁÖ¼Ò
}
 
  ad5.jpg

 

3.4.»ùÇøµ °Ç¼öÀÇ ¼³Á¤

»ùÇøµ °Ç¼öÀÇ ¼³Á¤¿¡ ÀÇÇØ, DMA Àü¼ÛÀº ¿Ï·áÇÕ´Ï´Ù.
»ó, »ùÇøµ ÁöÁ¤ °Ç¼öÀÇ »ùÇøµÀÌ ¿Ï·áÇϸé, »ùÇøµ ¿Ï·á Interrupt°¡ µé¾î°©´Ï´Ù. »ùÇøµ °Ç¼ö´Â, »ùÇà ÇÏ´Â °Ç¼ö-1ÀÇ °ªÀ» ¼³Á¤ÇÕ´Ï´Ù.

¡Ø1°ÇÀº, 4¹ÙÀÌÆ®=2¹ÙÀÌÆ®×2ch

¡ß200¸¸°ÇÀ¸·Î, DMA Àü¼ÛÀ» ¿Ï·áÇÏ´Â °æ¿ìÀÇ ¼³Á¤¿¹

 
//ADº¯È¯ ÁöÁ¤ °Ç¼ö(0 x10h~0x12h)´Â, 24ºñÆ®·Î ¼³Á¤ÇÕ´Ï´Ù.
 dwData = 2000000 - 1;
 outbyte( dwBaseAddr + 0x10, (BYTE)(dwData & 0xFF) );          // Bit0~7À» ¼³Á¤
 outbyte( dwBaseAddr + 0x11, (BYTE)((dwData >> 8) & 0xFF) );   // Bit8~15¸¦ ¼³Á¤
 outbyte( dwBaseAddr + 0x12, (BYTE)((dwData >> 16) & 0xFF) );  // Bit16~23À» ¼³Á¤

 

3.5.³»ºÎ/¿ÜºÎ ½ÅÈ£ Á¶°ÇÀÇ ¼³Á¤

³»ºÎ/¿ÜºÎ ½ÅÈ£ Á¶°ÇÀÇ ¼³Á¤À¸·Î¼­ »ùÇøµ °³½ÃÀü¿¡, ÀÌÇÏÀÇ 2°³ÀÇ Á¶°ÇÀ» ¼³Á¤.

  • ADº¯È¯ °³½Ã/Á¾·á µå¸®°¡ ¼³Á¤
  • ADº¯È¯ ¸ðµå ¼³Á¤ ³»ºÎ/¿ÜºÎ ½ÅÈ£ Á¶°ÇÀÇ ¼³Á¤ÀÌ, AD»ùÇøµ¸¶´Ù º¯°æÀÌ ¾ø´Â ½Ã½ºÅÛÀ̸é, ÃʱâÈ­ 󸮷Π½Ç½ÃÇÕ´Ï´Ù. ´Ã»ó, º»Çؼ³¿¡¼­´Â, ¿ÜºÎ ½ÅÈ£ÀÇ ÀÔ·Â Á¶°ÇÀ», ÃʱâÈ­ 󸮷Π¼³Á¤ÇÏ´Â °Íó·³ ±âÀçÇϰí ÀÖ½À´Ï´Ù.(ÃʱâÈ­ ó¸® ÂüÁ¶)

 

¡ßÀÌÇÏ¿¡ »ùÇà ÇÁ·Î±×·¥À» ±âÀçÇÕ´Ï´Ù.

 
//ADº¯È¯ °³½Ã/Á¾·á Æ®¸®°Å ¼³Á¤(0x06h)
 if(¡°¼ÒÇÁÆ® Æ®¸®°ÅÀÇ ¿ä±¸Àΰ¡?¡±)
     outbyte( dwBaseAddr + 0x06, 0x90 );      // ¼ÒÇÁÆ® Æ®¸®°Å °³½Ã·Î, Á¾·á´Â ADÁöÁ¤ °Ç¼öÀÇ ¼³Á¤
 else
     outbyte( dwBaseAddr + 0x06, 0x91 );      // ¿ÜºÎ Æ®¸®°Å °³½Ã·Î, Á¾·á´Â ADÁöÁ¤ °Ç¼öÀÇ ¼³Á¤
 
 // ADº¯È¯ ¸ðµå(0x05h)
 if(¡°³»Àå Ŭ¶ôÀÇ ¿ä±¸Àΰ¡?¡±)
     outbyte( dwBaseAddr + 0x05, 0x00 );  // ³»Àå Ŭ¶ôÀ» ¼³Á¤
 else
     outbyte( dwBaseAddr + 0x05, 0x12 );  // external clock·Î, ¸®Æ®¸®°Å¸¦ À¯È¿ÇÏ°Ô ¼³Á¤

 

3.6.»ùÇøµÀÇ °³½Ã ¹æ¹ý

»ùÇøµ °³½ÃÀÇ Æ®¸®°Å·Î¼­ ¼ÒÇÁÆ®¿þ¾î Æ®¸®°Å/¿ÜºÎ Æ®¸®°Å°¡ ÀÖ½À´Ï´Ù
.PCI-3525ÀÇ »ùÇøµ °³½Ã ¼ø¼­¸¦ ÀÌÇÏ¿¡ ±âÀçÇÕ´Ï´Ù. ¡Ø°³½Ã Æ®¸®°Å´Â ±× ¹Û¿¡µµ Á¸ÀçÇÕ´Ï´Ù¸¸, ¿©±â¿¡¼­´Â »ó±âÀÇ 2Á¡¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù.

1) ¼ÒÇÁÆ®¿þ¾î Æ®¸®°Å

  • ¨ç ADÀÎÅÍ·´Æ® ¸¶½ºÅ©(º£À̽º ÁÖ¼Ò£«0 x3C~0 x3D)   
±â´É£ºInterrupt ½ÅÈ£ÀÇ ÀÔ·Â Çã°¡/±ÝÁö ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
ÇÔ¼ö£ºouthword( dwBaseAddr + 0x3C, 0x8F77 );	// DMA µ¥ÀÌÅÍ Àü¼Û ÀÎÅÍ·´Æ® Àܸ̿¦ Çã°¡·Î ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

     ¡ØInterrupt¸¦ Çã°¡ÇÏ´Â ºñÆ®¸¦ ¼¼¿ó´Ï´Ù.

  • ¨è ADº¯È¯ DMA Ä¿¸àµå(º£À̽º ÁÖ¼Ò£«0 x30)
±â´É£ºDMA Àü¼ÛÀÇ °³½Ã/Á¾·á, ½ºÄ³ÅÍ FIFO/ADµ¥ÀÌÅÍ ¹öÆÛÀÇ ¸®¼ÂÆ®¸¦ ½Ç½ÃÇÕ´Ï´Ù.
ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x30, 0x01 );	// DMA Àü¼Û °³½Ã¿¡ ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

¡Ø1À» ¾²´Â °ÍÀ¸·Î DMA Àü¼ÛÀÌ °³½ÃµË´Ï´Ù.

  • ¨é ADº¯È¯ Ä¿¸àµå/ADº¯È¯ ½ºÅÂÅͽº(º£À̽º ÁÖ¼Ò£«0 x04)
±â´É£ºADº¯È¯ÀÇ °³½Ã/Á¾·á ¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.
ÇÔ¼ö£ºoutbyte( dwBaseAddr + 0x04, 0x00 );	// ADº¯È¯ °³½Ã¿¡ ¼³Á¤ÇÏ´Â ¿¹ÀÔ´Ï´Ù.

¡Ø0À» ¾²´Â °ÍÀ¸·Î »ùÇøµÀÌ °³½ÃµÇ¾î »ùÇøµ °³½Ã ÀÎÅÍ·´Æ®°¡ µé¾î°©´Ï´Ù.

 

2) ¿ÜºÎ Æ®¸®°Å

¼ø¼­´Â ¼ÒÇÁÆ®¿þ¾î Æ®¸®°Å¿Í °°½À´Ï´Ù¸¸, ½ÇÁ¦·Î AD»ùÇøµÀÌ °³½ÃµÇ´Â °ÍÀº ¿ÜºÎ Æ®¸®°Å°¡ µé¾î°¬À» ¶§ÀÔ´Ï´Ù. »ùÇøµ °³½Ã Interrupt´Â, AD½ºÅ¸Æ® ¼³Á¤½Ã´Â ¾Æ´Ï°í ¿ÜºÎ Æ®¸®°Å °ËÃâ½Ã°¡ µË´Ï´Ù.


 

3.7.ÀÎÅÍ·´Æ® ó¸®

¿©±â¿¡¼­´Â Interrupt ½º·¹µå³»¿¡¼­ ½ºÄ³ÅÍ Ã³¸®¸¦ ½Ç½ÃÇÏ´Â °ÍÀ» ÀüÁ¦·Î ±âÀçÇÕ´Ï´Ù. ¶Ç, Interrupt ½º·¹µåÀÇ »ý¼º ¹× ÀÎÅÍ·´Æ® 󸮱âÀÇ µî·Ï ¹æ¹ý¿¡ ´ëÇØ¼­´Â, Æó»ç Ȩ ÆäÀÌÁö¸¦ ºÁ ÁÖ¼¼¿ä.

1) ÃʱâÈ­

Interrupt ½º·¹µå¿¡¼­ ÀÎÅÍ·´Æ® ´ë±â¿¡ µé¾î°¡±â Àü¿¡ ½ºÄ³ÅÍ¿¡ DMA ¹öÆÛÀÇ µî·ÏÀ» ½Ç½ÃÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù. ¿©±â¿¡¼­´Â, DMA ¹öÆÛÀÇ ½ºÄ³ÅÍ¿¡ÀÇ µî·Ï¿¡ ´ëÇØ ¼³¸íÇÕ´Ï´Ù. ÇÁ·Î±×·¥¿¹´Â¡¸3.3.DMA Àü¼Û ¹öÆÛÀÇ ½ºÄ³ÅÍ µî·Ï¡¹À» ÂüÁ¶ÇØ ÁÖ¼¼¿ä.

  • ¨ç DMA ¹öÆÛÀÇ »ý¼º PCI-3525´Â 1ȸÀÇ »ùÇøµ¿¡ ´ëÇØ 4 ByteºÐ DMA ¹öÆÛ¿¡ Àü¼Û µË´Ï´Ù. 1°³ÀÇ CHÀ̸é 2 ByteÀÔ´Ï´Ù¸¸, PCI-3525ÀÇ »ç¾çÀÌ CH1/2µ¿½Ã¿¡ Àü¼Û µÇ±â À§ÇØ Àü¼Û »çÀÌÁî°¡ ¹è°¡ µË´Ï´Ù. ±× ¶§¹®¿¡, DMA ¹öÆÛ »çÀÌÁî´Â 4 Byte °æ°è°¡ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù.
  • ¨è DMA ¹öÆÛÀÇ ¹°¸® ÁÖ¼Ò Ãëµæ DMA ¹öÆÛ ÁÖ¼Ò¸¦ ½ºÄ³ÅÍ¿¡ µî·ÏÇÏ´Â °æ¿ì, PCI-3525´Â INtime·Î »ý¼ºÇÑ DMA ¹öÆÛÀÇ °¡»ó ÁÖ¼Ò¸¦ ÂüÁ¶ÇÒ ¼ö ÇÒ ¼ö ¾ø±â ¶§¹®¿¡, °¡»ó ÁÖ¼Ò¿¡ ²ö±¸¹°¸® ÁÖ¼Ò¸¦ ÃëµæÇÒ Çʿ䰡 ÀÖ½À´Ï´Ù.
  • ¨é ½ºÄ³ÅÍÀÇ µî·Ï »ó±â·Î ÃëµæÇÑ DMA ¹öÆÛÀÇ ¹°¸® ÁÖ¼Ò¸¦ ½ºÄ³ÅÍ¿¡ µî·ÏÇÕ´Ï´Ù. ÀÌ ¶§, DMA ¹öÆÛ »çÀÌÁîÀÇ µî·Ïµµ µ¿½Ã¿¡ ½Ç½ÃÇÕ´Ï´Ù. DMA ¹öÆÛ »çÀÌÁî¿¡ µî·ÏÇÏ´Â °ªÀº, DMA ¹öÆÛ »çÀÌÁî·ÎºÎÅÍ 1À» »« °ªÀÌ µË´Ï´Ù. ¶Ç, ½ºÄ³ÅÍ µî·ÏÀü¿¡´Â ½ºÄ³ÅÍ FIFO, ADµ¥ÀÌÅÍ ¹öÆÛÀÇ Å¬¸®¾î¸¦ ½Ç½ÃÇÕ´Ï´Ù.

2) ÀÎÅÍ·´Æ® 󸮱â

¿©±â¿¡¼­´Â ½ºÄ³ÅÍÀÇ Ãß°¡µî·ÏÀÌ ¸ÞÀÎÀÌ µË´Ï´Ù. ó¸®ÀÇ ¿¹¸¦ ÀÌÇÏ¿¡ ±âÀçÇÕ´Ï´Ù.

¡ØÀÎÅÍ·´Æ® 󸮱â ó¸®ÀÇ ¿¹(ÇÔ¼ö À̹ÌÁö)

 

_ _INTERRUPT void IntHandler( WORD wCSRA, WORD wLevel, PVOID pv)
 {
     __SHARED_INTERRUPT_PROLOG();
     
     // ÀÎÅÍ·´Æ® ½ºÅÂÅͽº Àбâ
     wIntrStatus[byWriteP] = inhword( dwBaseAddr + 0x38 );
     
     // ÇöÀçÀÇ ½ºÄ³ÅÍ µî·Ï¼ö¸¦ Ãëµæ
     wSktCnt = inhword( dwBaseAddr + 0x3A ) & 0x3F;
     
     // AD DMA ½ºÄ³ÅÍ ÀÎÅÍ·´Æ®(½ºÄ³ÅͰ¡ ½ºÄ³Å¸ ÀÎÅÍ·´Æ® ¼³Á¤Ä¡·Î ¹Ù²î¾úÀ» ¶§¿¡ ¹ß»ý)
     if(((wIntrStatus[byWriteP] & 0x0400) == 0x0400) || (wSktCnt < 5)){
     
         for(wCnt = wSktCnt;wCnt < 5;wCnt ++){
     
             // DMA º£À̽º ÁÖ¼Ò
             outword((WORD)(dwBaseAddr + 0x24), dwAddr);
 
             // DMA ¾×¼¼½º Ä«¿îÆ®¡¡DMA Àü¼Û ¹ÙÀÌÆ®¼ö-1À» ¼¼Æ®
             outhword((WORD)(dwBaseAddr + 0x2C), 0x8000 - 1);
 
             dwAddr += 0x8000;           // Â÷ÀÇ ¹°¸® ÁÖ¼Ò
             if (dwAddr > BUF_MAX_SIZE)
                 dwAddr = BUF_TOP_ADDR;  // ¹öÆÛ ÁÖ¼Ò¸¦ ¼±µÎ¿¡ µÇµ¹¸°´Ù
         }
 
         if(wIntrStatus[byWriteP] == 0x0000)
             wIntrStatus[byWriteP] = 0x0400;
     }
 
     // DMA Àü¼Û »çÀÌÁ Ãëµæ
     dwDMATransSize[byWriteP] = inword( (WORD)(dwBaseAddr + 0x20) );
 
     byWriteP ++;
     SignalRtInterruptThread(wLevel);
  
     __SHARED_INTERRUPT_RETURN();
 }   // end of IntHandler()

 

3) Interrupt ½º·¹µå

¿©±â¿¡¼­´Â, ÇØ´çÀÇ Interrupt Çڵ鷯·Î ÃëµæÇÏ´Â Interrupt ½ºÅ×ÀÌÅÍ)¿¡ ´ëÀÀÇϴ ó¸®¸¦ ½Ç½ÃÇÕ´Ï´Ù.

¡ØInterrupt ½º·¹µå ó¸®ÀÇ ¿¹

 

// ÃʱâÈ­ 󸮷μ­ ÀÌÇϸ¦ ½Ç½ÃÇÕ´Ï´Ù.
 // ¨ç DMA ¹öÆÛ¸¦ ½ºÄ³ÅÍ¿¡ µî·Ï(¡¸3.3.DMA Àü¼Û ¹öÆÛÀÇ ½ºÄ³ÅÍ µî·Ï¡¹À» ÂüÁ¶)
 // ¨è Interrupt Çڵ鷯¿Í Interrupt ½º·¹µå°£ÀÇ °øÅë º¯¼öµîÀÇ ÃʱâÈ­
 byReadP  = 0;   // Interrupt ½ºÅÂÅͽº °Ý³³ ¹öÆÛÀϾîµéÀÓ À§Ä¡ Ŭ¸®¾î¿¹
 byWriteP = 0;   //         ¡±±âÀç À§Ä¡ Ŭ¸®¾î¿¹
 // ¨é ÀÎÅÍ·´Æ® Çڵ鷯ÀÇ µî·Ï(ÀÚ¼¼ÇÑ °ÍÀº, º°µµ ÀÎÅÍ·´Æ® ó¸® »ùÇà ÂüÁ¶)
 wLevel = SetRtInterruptHandlerEx( (WORD)(wLevel | SHARED_LEVEL), 255, IntHandler, NULL);
 
 for(;;) {
 
     if (!WaitForRtInterrupt(wLevel, WAIT_FOREVER))
         Fail("Cannot wait for interrupt signal for Pci(1147,0DC5)");¡¡¡¡// ¿¡·¯À̱⠶§¹®¿¡ Á¾·á
 
     // ÀÎÅÍ·´Æ® ¸¶½ºÅ© Ãëµæ
     wIntSts = wIntrStatus[byReadP];
 
     // AD»ùÇøµ °³½Ã Interrupt½Ã
     if((wIntSts & 0x0002) == 0x0002){
 
         // AD»ùÇøµ °³½Ã ó¸®
     }
 
     // AD DMA ½ºÄ³ÅÍ ÀüÈ¯ÇØ Interrupt(½ºÄ³ÅͰ¡ ½ºÄ³Å¸ ÀüÈ¯ÇØ Interrupt¼ö·Î ¹Ù²î¾úÀ» ¶§¿¡ ¹ß»ý)
     // ¶Ç´Â, AD DMA Àü¼Û ¿Ï·á Interrupt½Ã(»ùÇøµ µ¥ÀÌÅͰ¡ ¸ðµÎ DMA ¹öÆÛ¿¡ Àü¼Û µÇ¾úÀ» ¶§)
     if((wIntSts & 0x0500) != 0x000){
 
         // DMA ¹öÆÛ µ¥ÀÌÅÍÀÇ ÅðÇÇ, Àü¼ÛµîÀ» ½Ç½ÃÇÑ´Ù.
     }
 
     // AD DMA Àü¼Û ¿Ï·á ÀÎÅÍ·´Æ®½Ã(»ùÇøµ µ¥ÀÌÅͰ¡ ¸ðµÎ DMA ¹öÆÛ¿¡ Àü¼Û µÇ¾úÀ» ¶§)
     if((wIntSts & 0x0100) == 0x0100){
 
         // ´ÙÀ½ »ùÇøµ ÁغñµîÀ» ½Ç½ÃÇÑ´Ù.
     }
 
     // AD»ùÇà ¿À¹ö ·± Interrupt½Ã
     if((wIntSts & 0x0200) == 0x0200){
 
         // Áß´Ü Ã³¸®
         // Interrupt ¸¶½ºÅ©(0 x3C~0x3D)
         outhword((WORD)( dwBaseAddr + 0x3C), 0x0000);   // ADC ÀüÇÒÆ÷ÇÔ ±ÝÁö
 
         // ADº¯È¯ Ä¿¸àµå(0x04)
         outbyte( dwBaseAddr + 0x04, 0x01 ); // ADº¯È¯ ½ºÅé(°­Á¦ Á¾·á)
 
         // ADº¯È¯ DMA Ä¿¸àµå(0x30)
         outbyte( dwBaseAddr + 0x30, 0x02 ); // DMA Àü¼Û Á¤Áö
     }
 
     byReadP ++; // Interrupt Çڵ鷯¿¡ ÀÇÇØ ½ºÅà µÇ´Â Interrupt ½ºÅÂÅͽº °Ý³³ ¹öÆÛÀÇ ÀϾîµéÀÓ À§Ä¡¸¦ ¾÷
 }
 

4) DMA ¹öÆÛ µ¥ÀÌÅÍÀÇ ÃßÃâ

DMA ¹öÆÛ·Î ÁöÁ¤ µ¥ÀÌÅÍ »çÀÌÁîºÐ °Ý³³µÈ ÈÄ, ¹Ì¸® »ý¼ºÇØ µÐ »ùÇøµ µ¥ÀÌÅÍ °Ý³³¿ë ¹öÆÛ¿¡ DMA ¹öÆÛ·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÃßÃâÇØ, DMA ¹öÆÛÀÇ µ¥ÀÌÅ͸¦ ÀçÂ÷ DMA ¹öÆÛ¸¦ ½ºÄ³ÅÍ¿¡ µî·ÏÇÏ´Â ¿¹ÀÔ´Ï´Ù. ¿©±â¿¡¼­´Â, DMA ¹öÆÛ¸¦ ¸µ ¹öÆÛ·Î¼­ »ç¿ëÇϰí ÀÖ½À´Ï´Ù.

 

3.8.¹Ýº¹ÀÇ ¹æ¹ý

»ùÇøµÀ» °³½ÃÇØ, ÁöÁ¤ÇÑ °Ç¼ö ºÐÀÇ »ùÇøµÀÌ ¿Ï·á ÈÄ¿¡ ÀçÂ÷ »ùÇøµÀ» °³½ÃÇÒ ¶§ ¹æ¹ýÀ» ÀÌÇÏ¿¡ ±âÀçÇÕ´Ï´Ù.

 

1) DMA Àü¼Û ¿Ï·á Interrupt ¼ö½Å½Ã

ÁöÁ¤ °Ç¼ö ºÐÀÇ »ùÇøµÀÌ ¿Ï·áÇϸé, DMA Àü¼Û ¿Ï·á ÀÎÅÍ·´Æ®°¡ µé¾î°©´Ï´Ù.±× ¶§¿¡ ½ºÄ³ÅÍÀÇ Àç¼³Á¤À» ½Ç½ÃÇÕ´Ï´Ù.½ºÄ³ÅÍÀç¼³Á¤ÀÇ ¿¹¸¦ ÀÌÇÏ¿¡ ±âÀçÇÕ´Ï´Ù.

¡Ø½ºÄ³ÅÍÀç¼³Á¤ÀÇ ¿¹

 

// ÀÎÅÍ·´Æ® ¸¶½ºÅ©(0 x3C~0x3D)
 outhword((WORD)( dwBaseAddr + 0x3C), 0x0000);	// ADC ÀüÇÒÆ÷ÇÔ ±ÝÁö
 
 ¿©±â¿¡¼­´Â, ½ºÄ³ÅÍÀç¼³Á¤(¡¸3.3.DMA Àü¼Û ¹öÆÛÀÇ ½ºÄ³ÅÍ µî·Ï¡¹À» ÂüÁ¶)¸¦ ½Ç½ÃÇÕ´Ï´Ù.
 
 // ÀÎÅÍ·´Æ® ¸¶½ºÅ©(0 x3C~0x3D)
 outhword((WORD)( dwBaseAddr + 0x3C), 0x8F77);¡¡// ÀÎÅÍ·´Æ® À¯È¿

 

2) ¼ÒÇÁÆ®¿þ¾î Æ®¸®°Å½Ã

½ºÄ³ÅÍÀÇ Àç¼³Á¤ ÈÄ¿¡, ¡¸3.6.»ùÇøµÀÇ °³½Ã ¹æ¹ý¡¹À¸·Î ±âÀçÇÑ ¼ø¼­¸¦ ½ÇÇàÇϸé ÀçÂ÷ »ùÇøµÀÌ °³½ÃµË´Ï´Ù.

 

3) ¿ÜºÎ Æ®¸®°Å½Ã

½ºÄ³ÅÍÀÇ Àç¼³Á¤ ÈÄ¿¡, ¡¸3.6.»ùÇøµÀÇ °³½Ã ¹æ¹ý¡¹À¸·Î ±âÀçÇÑ ¼ø¼­¸¦ ½ÇÇàÇÑ ÈÄ, ¿ÜºÎ Æ®¸®°Å¸¦ °ËÃâÇÑ Å¸Àֿ̹¡ »ùÇøµÀÌ °³½ÃµË´Ï´Ù.

¡Ø¸®Æ®¸®°ÅÀÇ ÀÌ¿ë

¿ÜºÎ Æ®¸®°Å¿¡¼­´Â, ¸®Æ®¸®°Å¿¡ ÀÇÇØ ¿¬¼ÓÇØ »ùÇøµÀ» °³½Ã½Ãų ¼ö ÀÖ½À´Ï´Ù. ¸®Æ®¸®°Å¶õ, ÃÖÃÊ·Î ±âº»ÀÇ ¼³Á¤À» ½Ç½ÃÇØ µÎ¸é, ÀÌÈÄ´Â ¿ÜºÎ Æ®¸®°Å¸¸À¸·Î »ùÇøµÀÌ °³½ÃµÇ´Â ±â´ÉÀÔ´Ï´Ù.
±âº»ÀÇ ¼³Á¤À̶õ, ÃʱâÈ­º¸´Ù·ÎºÎÅÍ ¼ÒÇÁÆ®¿þ¾î Æ®¸®°Å ¹ßÇà±îÁöÀÇ Ã³¸®·Î, ¿ÜºÎ Æ®¸®°Å ¼³Á¤À» ÇßÀ» °æ¿ìÀÔ´Ï´Ù.
¸®Æ®¸®°Å ÀÌ¿ëÀÇ ÁÖÀÇÁ¡À¸·Î¼­´Â, ½ºÄ³Å͸¦ Ŭ¸®¾î ÇØ ¹ö¸®¸é ¸®Æ®¸®°Å¿¡ ÀÇÇÑ »ùÇøµÀÌ °³½ÃµÇÁö ¾Ê´Â °ÍÀÔ´Ï´Ù.  µû¶ó¼­, º»Çؼ³ÀÇ ¿¹¿¡¼­´Â ½ºÄ³Å͸¦ Ŭ¸®¾î Çϱâ À§ÇØ ¸®Æ®¸®°Å´Â »ç¿ë ÇÒ ¼ö ¾ø½À´Ï´Ù.

 

HOME | INtime