;************************************************************************************************** ;* G4USP Beakon control logic * ;* version 1.0.0 24 May 2009 * ;* Using devicde type PIC12F509 * ;* * ;* Vdd (pin 1) Gnd. * ;* Vss (pin 8) +5vDC. * ;* GPIO_b0 (pin 7) Heartbeat LED 2k2R resistor in seriese with LED down to Vdd. * ;* GPIO_b1 (pin 6) TX key LED 2k2R resistor in seriese with LED down to Vdd. * ;* GPIO_b2 (pin 5) CW key LED 2k2R resistor in seriese with LED down to Vdd. * ;* GPIO_b3 (pin 4) *** UNUSED *** * ;* GPIO_b4 (pin 3) TX key (relay) 4k7R resistor feeding base of relay switching transistor. * ;* GPIO_b5 (pin 2) CW audio 470R resistor in seriese with 470nF capacitor * ;* down to Vdd, audio is taken from junction of * ;* resistor and capacitor. * ;* * ;* * ;************************************************************************************************** list p=12F509, f=inhx8m ;microcontroller & base include "P12F509.inc" ;register memory mapping file ;_CONFIG options available ;code protect _CP_ON _CP_OFF ;Oscillator _LP_OSC _XT_OSC _IntRC_OSC _ExtRC_OSC ;Watch Dog Timer _WDT_ON _WDT_OFF ;MasterCLR MCLRE_ON MCLRE_OFF __CONFIG _CP_OFF & _WDT_ON & _MCLRE_OFF & _IntRC_OSC ;************************************************************************************************** ;* System variables * ;************************************************************************************************** IDENT_WORD equ H'0010' ; Current ident word IDENT_BIT_COUNT equ H'0011' ; Ident bit counter IDENT_BYTE_COUNT equ H'0012' ; Ident byte counter PIP_COUNT equ H'0013' ; PIP tone counter PIP_MARK_COUNT equ H'0014' ; PIP tone mark timing PIP_SPACE_COUNT equ H'0015' ; PIP tone space timing TEN_mS_COUNT equ H'0016' ; Ten mS counter HUN_mS_COUNT equ H'0017' ; Hundred mS counter HALF_S_COUNT equ H'0018' ; Half second counter SIXTY_S_COUNT equ H'0019' ; Minut counter TEN_M_COUNT equ H'001A' ; Ten minute counter FLAGS_ONE equ H'001B' ; General purpose flags ; b0 - IDENT active ; b1 - IDENT reset ; b2 - PIPS active ; b3 - PIPS reset ; b4 - TX keying marker ; b5 - CW keying marker ; b6 - CW timing marker ; b7 - 1.67mS (600Hz) timing marker ;************************************************************************************************** ;* System constants * ;************************************************************************************************** W equ H'0000' ; destination W - Working register f equ H'0001' ; destination f - File CW_ind equ H'0002' ; (CW_ind) Morse keying indicator - GPIO_b2 CW_aud equ H'0005' ; (CW_aud) Morse audio output - GPIO_b5 CW_marker equ H'0005' ; CW key flag TX_ind equ H'0001' ; (TX_ind) Tx keying indicator - GPIO_b1 TX_key equ H'0004' ; (TX_key) Tx key output - GPIO_b4 TX_marker equ H'0004' ; TX key flag Heartbeat equ H'0000' ; Heartbeat indicator - GPIO_b0 Tone_marker equ H'0007' ; 600Hz marker ;************************************************************************************************** ;* reset vector * ;************************************************************************************************** RESET org H'0000' ;reset vector address goto INITIALISE ;start program execution ;************************************************************************************************** ;* system initialisation * ;************************************************************************************************** INITIALISE bcf STATUS,PA0 ;goto bank0 movlw b'11000101' OPTION ;/GPWU off, /GPPU off, TOCS fOSC/4, TOSE TE, PSA TMR0, Ratio 64:1 (b'11000101') ;OPTION REGISTER setup... ; b7 - /GPWU wake up on change (GP1,GP2,GP3) 0=enabled, 1=disabled ; b6 - /GPPU weak pull up resistors (GP1,GP2,GP3) 0=enabled, 1=disabled ; b5 - TOCS TMR0 timer scourse 0=fOCS/4 pin 1=TOCKI ; b4 - TOSE TMRO edge select 0=leading edge 1= trailing edge ; b3 - PSA 0=TMR0 1=WDT ; b2-b0 - Preescaler ratio clrwdt ;clear watchdog timer clrf TMR0 ;clear TMR0 clrf GPIO ;GPIO configuration (all output where available)... movlw b'001000' ; b0 - (OUTPUT) Heartbeat indicator. TRIS GPIO ; b1 - (OUTPUT) (TX_ind) Tx keying indicator. ; b2 - (OUTPUT) (CW_ind) Morse keying indicator. ; b3 - (INPUT) Unused port ; b4 - (OUTPUT) (TX_key) Tx key output. ; b5 - (OUTPUT) (CW_aud) Morse audio output. movlw H'0006' movwf TEN_mS_COUNT ; Ten mS counter. movlw H'000A' movwf HUN_mS_COUNT ; Hundred mS counter. movlw H'0005' movwf HALF_S_COUNT ; Half second counter. movlw H'0078' movwf SIXTY_S_COUNT ; Minute counter. movlw H'0001' movwf TEN_M_COUNT ; Ten minute counter, though ; initial cycle is one minute. clrf FLAGS_ONE ; Clear all flags. movlw H'0008' ;Reset ident bit counter movwf IDENT_BIT_COUNT ; - " - movlw H'000F' ;Reset ident byte counter movwf IDENT_BYTE_COUNT ; - " - call IDENT_DATA ;Pre-load first ident word movwf IDENT_WORD ; - " - decf IDENT_BYTE_COUNT,1 ; *** bcf FLAGS_ONE,0 ;Clear routine active flag. bsf FLAGS_ONE,1 ;Set routine ready flag. movlw H'0028' ; Reset PIP counter movwf PIP_COUNT ; - " - movlw H'0001' ; Reset PIP mark counter movwf PIP_MARK_COUNT ; - " - movlw H'000D' ; Reset PIP space counter movwf PIP_SPACE_COUNT ; - " - bcf FLAGS_ONE,2 ; Clear routine active flag. bsf FLAGS_ONE,3 ; Set routine ready flag. ;******************************************************************************** ;* Main program loop * ;******************************************************************************** MAIN_LOOP clrwdt ;Reset WDT register movlw b'00000001' ;Timer service... addwf TMR0,W ; btfsc STATUS,C ; goto SOFT_TIMING ; RET_FM_TIMING goto TX_CONTROL ;Transmitter control... RET_FM_TX_CTL btfsc FLAGS_ONE,6 ;CW - IDENT/PIPS service goto CW_ROUTINES RET_FM_CW goto MAIN_LOOP ;******************************************************************************** ;* Morse signalling generator routines * ;* Totalling 9 instructions. * ;******************************************************************************** CW_ROUTINES btfsc FLAGS_ONE,0 ;IDENT (priority 0), ident will goto IDENT_MORSE ; btfsc FLAGS_ONE,2 ;PIPS (priority 2), pips will goto PIPS_MORSE ; goto RET_FM_CW ;returns to main program loop ;******************************************************************************** ;* IDENT * ;* Totalling 41 instructions. * ;******************************************************************************** IDENT_MORSE bcf FLAGS_ONE,6 ;Clear 100mS timing marker rlf IDENT_WORD,1 ;Rotate rssi_word left through btfsc STATUS,C ; carry - test carry bit, setting goto #IM1 ; tone generator on if true (1) bcf GPIO,CW_ind ; and off if false (0) bcf FLAGS_ONE,CW_marker ; goto #IM2 ; #IM1 bsf GPIO,CW_ind ; bsf FLAGS_ONE,CW_marker ; #IM2 decfsz IDENT_BIT_COUNT,1 ;Check for next stage. goto RET_FM_CW ;return to main program loop... **** movlw H'0008' ;Reset bit counter movwf IDENT_BIT_COUNT ; - " - movf IDENT_BYTE_COUNT,0 ; **************** call IDENT_DATA ;Load next ident data word movwf IDENT_WORD ; - " - decfsz IDENT_BYTE_COUNT,1 ;Check for next stage. goto RET_FM_CW ;return to main program loop... **** IDENT_RESET movlw H'0008' ;Reset ident bit counter movwf IDENT_BIT_COUNT ; - " - movlw H'000F' ;Reset ident byte counter movwf IDENT_BYTE_COUNT ; - " - call IDENT_DATA ;Pre-load first ident word movwf IDENT_WORD ; - " - decf IDENT_BYTE_COUNT,1 ; *** bcf FLAGS_ONE,0 ;Clear routine active flag. bsf FLAGS_ONE,1 ;Set routine ready flag. goto RET_FM_CW ;return to main program loop... **** IDENT_DATA addwf PCL,F ;IDENT data structure nop ; nop ; retlw b'00000000' ;IDENT 00000000 retlw b'00000000' ;IDENT 00000000 retlw b'11101000' ;IDENT 11101000 retlw b'00101110' ;IDENT 00101110 P retlw b'00101010' ;IDENT 00101010 S retlw b'10101110' ;IDENT 10101110 U retlw b'10111000' ;IDENT 10111000 4 retlw b'00101010' ;IDENT 00101010 G retlw b'10111010' ;IDENT 10111010 retlw b'00000011' ;IDENT 00000011 E retlw b'10001000' ;IDENT 10001000 D retlw b'00111010' ;IDENT 00111010 retlw b'00000000' ;IDENT 00000000 retlw b'00000000' ;IDENT 00000000 ;******************************************************************************** ;* PIPS * ;* PIP duration 100mS, inter PIP delay 1400mS, total duration 60 seconds. * ;* totalling 34 instructions. * ;******************************************************************************** PIPS_MORSE bcf FLAGS_ONE,6 ; Clear 100mS timing marker movf PIP_MARK_COUNT,1 ; MOVF f,1 used here to effect Z in STATUS btfsc STATUS,Z ; set if Z, clr if not Z (in effect BTFS NZ) goto #PM1 ; tone generator on if true (1) decf PIP_MARK_COUNT,1 ; bsf GPIO,CW_ind ; bsf FLAGS_ONE,CW_marker ; goto RET_FM_CW ;return to main program loop... **** #PM1 movf PIP_SPACE_COUNT,1 ; MOVF f,1 used here to effect Z in STATUS btfsc STATUS,Z ; set if Z, clr if not Z (in effect BTFS NZ) goto #PM2 ; tone generator on if true (1) decf PIP_SPACE_COUNT,1 ; bcf GPIO,CW_ind ; bcf FLAGS_ONE,CW_marker ; goto RET_FM_CW ;return to main program loop... **** #PM2 movf PIP_COUNT,1 ; MOVF f,1 used here to effect Z in STATUS btfsc STATUS,Z ; set if Z, clr if not Z (in effect BTFS NZ) goto PIPS_RESET ; #PM5 decf PIP_COUNT,1 ; movlw H'0001' ; Reset PIP mark counter movwf PIP_MARK_COUNT ; - " - movlw H'000D' ; Reset PIP space counter movwf PIP_SPACE_COUNT ; - " - goto RET_FM_CW ;return to main program loop... **** PIPS_RESET movlw H'0028' ; Reset PIP counter movwf PIP_COUNT ; - " - movlw H'0001' ; Reset PIP mark counter movwf PIP_MARK_COUNT ; - " - movlw H'000D' ; Reset PIP space counter movwf PIP_SPACE_COUNT ; - " - bcf FLAGS_ONE,2 ; Clear routine active flag. bsf FLAGS_ONE,3 ; Set routine ready flag. bsf FLAGS_ONE,0 ;Force IDENT CYCLE. goto RET_FM_CW ;return to main program loop... **** ;******************************************************************************** ;* Transmitter control * ;* Totalling 8 instructions, * ;******************************************************************************** TX_CONTROL movlw b'00000101' ; Mask all but IDENT_ACTIVE (b0), andwf FLAGS_ONE,W ; and PIPS_ACTIVE (b2). btfsc STATUS,Z ; goto TX_OFF ; TX_ON bsf GPIO,TX_ind ; Set TX indicator bsf GPIO,TX_key ; Key TX bsf FLAGS_ONE,TX_marker ; Set TX flag goto RET_FM_TX_CTL ;return to main program loop... **** TX_OFF bcf GPIO,TX_ind ; Clear TX indicator bcf GPIO,TX_key ; DeKey TX bcf FLAGS_ONE,TX_marker ; Clear TX flag goto RET_FM_TX_CTL ;return to main program loop... **** ;******************************************************************************** ; Master clock & timing signal generator routine * ;* Totalling 38 instructions. * ;******************************************************************************** SOFT_TIMING clrwdt ;Cleear Watchdog timer. movlw H'00E6' movwf TMR0 ;Reload timer register... bsf FLAGS_ONE,7 ;1.67mS marker for fancy heartbeat code... btfss FLAGS_ONE,5 ;CW audio generator keying... goto #T4 ; -"- btfss GPIO,CW_aud ;CW audio generator... goto #T0 ; -"- #T4 bcf GPIO,CW_aud ; -"- goto #T1 ; -"- #T0 bsf GPIO,CW_aud ; -"- #T1 decfsz TEN_mS_COUNT,F ;10mS timimg... goto RET_FM_TIMING ;return to main program loop... **** movlw H'0006' ; -"- movwf TEN_mS_COUNT ;...and finally arives here every 10mS. decfsz HUN_mS_COUNT,F ;100mS timing... goto RET_FM_TIMING ;return to main program loop... **** movlw H'000A' ; -"- movwf HUN_mS_COUNT ;...and finally arives here every 100mS. bsf FLAGS_ONE,6 ;100mS marker for CW code timing... decfsz HALF_S_COUNT,F ;500mS timing... goto RET_FM_TIMING ;return to main program loop... **** movlw H'0005' ; -"- movwf HALF_S_COUNT ;...and finally arives here every 500mS. btfss GPIO,Heartbeat ;Heartbeat indicator... goto #T2 ; -"- bcf GPIO,Heartbeat ; -"- goto #T3 ; -"- #T2 bsf GPIO,Heartbeat ; -"- #T3 decfsz SIXTY_S_COUNT,F ;Minute timing... goto RET_FM_TIMING ;return to main program loop... **** movlw H'0078' ; -"- movwf SIXTY_S_COUNT ;...and finally arives here every minut. decfsz TEN_M_COUNT,F ;10 minute timing... goto RET_FM_TIMING ;return to main program loop... **** movlw H'000A' ; -"- movwf TEN_M_COUNT ;...and finally arives here every 10 minutes. bsf FLAGS_ONE,0 ;Start IDENT CYCLE. bsf FLAGS_ONE,2 ;Start PIP CYCLE. goto RET_FM_TIMING ;return to main program loop... **** end ;End of program