/****************************************************
 *
 * ULTRA SONIC Range Finder Demonstration Program
 * (c) SAMPLE Electronics co. http://www.SAMPLE.co.kr
 * Programmed by Junghoon Kim
 *
 *
 * ÀÌÇÁ·Î±×·¥Àº Robot Electronics»çÀÇ ÃÊÀ½ÆÄ ¸ðµâÀ» ÀÌ¿ëÇÏ¿©
 * °Å¸®¸¦ °¨ÁöÇÏ´Â ¿¹¸¦ ¼³¸íÇÏ±âÀ§ÇÑ µ¥¸ð ÇÁ·Î±×·¥ÀÔ´Ï´Ù.
 *
 * Å¸ÀÌ¸Ó 3 ¸¦ ÀÌ¿ëÇÏ¿© 55 mSÀÇ ÁÖ±âÀûÀÎ ÆÞ½º¸¦ ¸¸µì´Ï´Ù.
 * ¸ðµâ·ÎºÎÅÍ Ãâ·ÂµÇ´Â ½ÅÈ£¸¦ INT0 ¿¡ ¿¬°áÇÏ¿© Falling ¿¡Áö¿¡¼­
 * ÀÎÅÍ·´Æ®°¡ ¹ß»ýµÇµµ·Ï ÇÕ´Ï´Ù. INT0 ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇÏ¸é
 * Timer 3 ÀÇ °ªÀ»ÀÐ¾î Àü¹æÀÇ ¹°Ã¼ÀÇ °Å¸®¸¦ ¾Ë ¼ö ÀÖ½À´Ï´Ù.
 * °Å¸®°ªÀº DAC0 ¿¡¼­ ¾Æ³¯·Î±× Àü¾ÐÀ¸·Î Ãâ·ÂµÇ¸ç
 * P1 ¿Í P3 ¿¡¼­ ¹ÙÀÌ³Ê¸®°ª(Timer 3)À» Ãâ·ÂÇÏµµ·Ï ÇÏ¿´½À´Ï´Ù.
 *
 *
 *
 * ÀÌ ¿¹Á¦¿¡¼­ »ç¿ëÇÑ ÇÁ·Î¼¼¼­´Â CYGNALÀÇ C8051F000 ÀÌ¸ç
 * 11.0592 MHz ·Î µ¿ÀÛÇÕ´Ï´Ù.
 * ÇÁ·Î±×·¥Àº C ¾ð¾î·Î ÀÛ¼ºÇÑ °ÍÀÌ¸ç CrosswareÀÇ
 * 8051 C ÄÄÆÄÀÏ·¯ µ¥¸ð¹öÁ¯À¸·Î ÄÄÆÄÀÏ ÇÏ¿´½À´Ï´Ù.
 *
 *
 *              1. SRF04 Timing Diagram
 *
 *       Æ®¸®°Å ÆÞ½º
 *       ÃÖ¼Ò 10 uS
 *      +--+                                   +--+
 *      |  |                                   |  |
 *      |  |                                   |  |
 *  ----+  +-----------------------------------+  +--
 *  Æ®¸®°Å ÆÞ½º(¸ðµâ·Î ÀÔ·Â)
 *                                      |------|
 *           ++++ 8 °³ÀÇ ÃÊÀ½ÆÄ ÆÞ½º    ¿¡ÄÚ ÆÞ½º Á¾·áÈÄ 10mS
 *           ||||
 *           ||||
 *  ----------++++------------------------------------
 *
 *                  +-------------------+
 *                  |ÆÞ½º ¿¡ÄÚ          |
 *                  | 100 uS ¿¡¼­ 18mS  |
 *  ----------------+                   +-------------
 *   ¿¡ÄÚ ÆÞ½º(¸ðµâ¿¡¼­ Ãâ·Â)
 *                                    Àü¹æ¿¡ ¹°Ã¼°¡ ¾øÀ»¶§
 *                                     36mS ÀÇ ÆÞ½º Ãâ·Â
 *
 *              2. °á¼±µµ
 *                                    SFR04
 *                                +----------+
 *                                |         O|
 *                                |          |
 *                                |          |
 *                                |          |
 *                 5V Supply ---->|o         |
 * P0.2(INT0) Echo Pulse Out ---->|o         |
 * P0.3 Trigger  Pulse Input ---->|o         |
 *            Do not Connect ---->|o         |
 *                 0V Ground ---->|o         |
 *                                |          |
 *                                |          |
 *                                |          |
 *                                |O         |
 *                                +----------+
 *
 *              3. ÀÚ·á 
 *
 *   http://www.robot-electronics.co.uk/htm/srf04.shtml
 *
 ****************************************************/

#include <stdio.h>
#include <sfr.h>
#include <os.h>


_sfrbit TRIGER  = _p0^3;           // Triger Pulse Out

void _InitSerialPort(void);


void _interrupt IVN_INTERRUPT0 sonar_data_out() { // INT0 ÀÎÅÍ·´Æ®

      char vl;
      char vh;

     _tmr3cn &= 0xFB;              // Timer 3 Stop

      vl = _tmr3l;
      vh = _tmr3h;

     _p1 = vl;                     // Port 1 ¿¡¼­ Low
     _p3 = vh;                     // Port 3 ¿¡¼­ High

     _dac0l = vl;                  // DAC0 ¿¡ Ãâ·Â
     _dac0h = vh;

     _tmr3cn |= 0x04;              // Timer 3 Run

}

void _interrupt IVN_TIMER3 sonar_start() { // Timer 3 ¿À¹öÇÃ·Î¿ì ÀÎÅÍ·´Æ®

     int i;
    _tmr3cn &= 0x7F;               // Timer 3 Overflpw Flag Clear


     TRIGER = 1;                   // Trigger Pulse High
     for ( i = 0; i<3; i++) { ; }  // 12 uSEC Delay Time (11.0592MHz OSC)
     TRIGER = 0;                   // Trigger Pulse Low

}


void main(void) {

        _wdtcn = 0xDE;       // Watch Dog Disable
        _wdtcn = 0xAD;       //
        _oscxcn = 0x65;      // XFCN = '101' for 11.0592 MHz crystal
        _oscicn = 0x08;      // ³»Àå ¿À½Ç·¹ÀÌÅÍ ±ÝÁöÇÏ°í ¿ÜºÎ Å©¸®½ºÅ» »ç¿ë
        _xbr0 = 0x04;        // UART Enable
        _xbr1 = 0x04;        // INT0 Enable
        _xbr2 = 0x40;        // Crossbar Enable
        _prt0cf = 0x08;      // Port P0.3 Trigger Pulse Bit Push-Pull Mode


        _ref0cn = 0x03;      // Internal Band Gap On Reference Buffer On
        _dac0cn = 0x80;      //

        _tmr3rll = 0x00;     // Timer 3 Auto Re-load register low
        _tmr3rlh = 0x40;     // Timer 3 Auto Re-load register high
        _tmr3l = 0x00;       // Timer 3 Start Value Low
        _tmr3h = 0x00;       // Timer 3 Start Value High
        _tmr3cn |= 0x04;     // Timer 3 Run


         TRIGER = 0;

        _InitSerialPort();   // 11.0592MHz ¿À½Ç·¹ÀÌÅÍ¿¡¼­ 19200 BPS

        _it0 = 1;            // Falling Edge Triger (INT0)
        _ex0 = 1;            // INT0 Enable
        _eie2 |= 0x01;       // Timer 3 Interrupt Enable

        do { ; } while(1);


}

