/**************************************************************************** underground_locator_tx.c This program is a transmitter for an underground locator that operates at 512Hz or 8192Hz. Transformer coupled, modified sine wave WORKING CODE +5 | 14 ---------- | RA0 |-17-- output 1 MODE ----7-| RB1 | | RA1 |-18-- output 2 | | | 16F628 |-1--- LED | | | RB6 |-12-- PGD | RB7 |-13-- PGC 20MHz XTAL-15-| MCLR |-4--- MCLR XTAL-16-| | ---------- 5 | Gnd ***************************************************************************/ #include < 16F628a.h > #fuses HS, NOPROTECT, PUT, NOWDT, BROWNOUT, NOMCLR, NOLVP #include < jonsinc.h > #use standard_io ( A ) #use standard_io ( B ) #use delay ( clock = 20000000 ) // one cycle = 0.2uS @ 20MHz #define OUTPUT1 PIN_A0 #define OUTPUT2 PIN_A1 #define LED PIN_A2 #define MODE_SW PIN_B1 #define HIGH_FINE_ADJ 93 #define LOW_FINE_ADJ 80 void main ( void ) { char cCnt, cLedFlag; delay_ms ( 100 ); port_b_pullups ( ON ); output_high ( LED ); delay_ms ( 500 ); // wait for mode switch to stabilize after power-on output_low ( LED ); delay_ms ( 500 ); cCnt = 0; cLedFlag = 0; if ( input ( MODE_SW ) == HIGH ) { while ( TRUE ) { // 8192Hz = 122uS period output_low ( OUTPUT2 ); delay_us ( 16 ); output_high ( OUTPUT1 ); delay_us ( 25 ); delay_cycles ( HIGH_FINE_ADJ ); output_low ( OUTPUT1 ); delay_us ( 16 ); output_high ( OUTPUT2 ); delay_us ( 25 ); delay_cycles ( HIGH_FINE_ADJ - 1 - 21 ); if ( cCnt++ == 0 ) { cLedFlag ^= 1; } else { delay_cycles ( 4 ); } output_bit ( LED, cLedFlag ); } } else { while ( TRUE ) { // 512Hz = 1953uS period output_low ( OUTPUT2 ); delay_us ( 380 ); output_high ( OUTPUT1 ); delay_us ( 580 ); delay_cycles ( LOW_FINE_ADJ ); output_low ( OUTPUT1 ); delay_us ( 380 ); output_high ( OUTPUT2 ); delay_us ( 580 ); delay_cycles ( LOW_FINE_ADJ - 1 - 21 ); if ( cCnt++ == 0 ) { cLedFlag ^= 1; } else { delay_cycles ( 4 ); } output_bit ( LED, cLedFlag ); } } }