; FT290R CTCSS Encoder v1.0 for 16f628A by Mike Hawkshaw G7AQA 11-3-2007 ; Based heavily on :- ; CTCSS Encoder v1.4 for 16c84 Tony Hunt VK5AH 14-4-99 ; Assemble with MPASM ; See below for wiring details ; Use 4MHz Crystal ;PTT IS ON RB7 (ACTIVE LOW) ;RPT SHIFT- IS ON RB6 (ACTIVE LOW) ;RPT SHIFT+ IS ON RB5 (ACTIVE LOW) ;TONE SEL IS ON RB0-RB3 (INVERTED) ;OUTPUT IS ON RA2 list p=16f628A ;list directive to define processor #include ;processor specific variable definitions __CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CNT1 EQU 20H ;PRESCALLER COUNTER REG 1 CNT2 EQU 21H ;PRESCALLER COUNTER REG 2 CNT3 EQU 22H ;PRESCALLER COUNTER REG 3 TONREG EQU 23H ;REGISTER FOR TONE NUMBER PRES1 EQU 24H ;PRESCALLER STORE 1 PRES2 EQU 25H ;PRESCALLER STORE 2 PRES3 EQU 26H ;PRESCALLER STORE 3 PC EQU 2 ORG 0x000 ;processor reset vector goto MAIN MAIN MOVLW 0x07 ;Turn comparators off and MOVWF CMCON ;enable pins for I/O BSF STATUS,RP0 ;SELECT REG BANK 1 BCF TRISA,2 ;SETUP RA2 AS OUTPUT FOR TONE BSF OPTION_REG,NOT_RBPU ;DISSABLE PULLUP RESISTORS ON PORTB MOVLW 0xFF ;SET PORTB AS I/Ps MOVWF TRISB ;RB0-7 all inputs BCF STATUS,RP0 ;SELECT REG BANK 0 BCF INTCON,GIE ;DISABLE GIE INTERUPTS BSF INTCON,RBIE ;ENABLE PORT B CHANGE INTERUPT START MOVF PORTB,W ;READ DIP SWITCHES INTO W MOVWF TONREG ;STORE IN TONREG COMF TONREG,f ;Invert BCF TONREG,4 ;CLEAR BITS 4,5,6&7 AS BCF TONREG,5 ;THEY ARE IRRELAVANT BCF TONREG,6 BCF TONREG,7 MOVF TONREG,W ;RE-STORE INTO W ADDWF TONREG,F ;MULTIPLY BY 3 ADDWF TONREG,F ;FOR TONE TABLE OFFSET MOVF TONREG,W ;RELOAD TO W FOR OFFSET CALL TONTBL ;GOTO TONE LOOKUP TABLE MOVWF PRES1 ;STORE FIRST VALUE FROM TABLE XORWF W ;Check if returned value is zero BTFSC STATUS,Z GOTO WAIT ;If it is then go back to sleep INCF TONREG,F ;INCREMENT FOR NEXT TABLE VALUE MOVF TONREG,W ;RELOAD W FOR OFFSET CALL TONTBL ;GOTO TONE LOOKUP TABLE MOVWF PRES2 ;STORE SECOND VALUE FROM TABLE INCF TONREG,F ;INCREMENT FOR NEXT TABLE VALUE MOVF TONREG,W ;RELOAD W FOR OFFSET CALL TONTBL ;GOTO TONE LOOKUP TABLE MOVWF PRES3 ;STORE THIRD VALUE FROM TABLE RELOAD MOVF PRES1,W ;LOAD W WITH PRESET FOR 1 MOVWF CNT1 ;PRELOAD PRESCALLER 1 MOVF PRES2,W ;LOAD W WITH PRESET FOR 3 MOVWF CNT3 ;PRELOAD PRESCALLER 3 MOVF PRES3,W ;LOAD W WITH PRESET FOR 2 READY PTTCHK ;Check PTT is low and at least one RPT shift line is low BTFSC PORTB,7 ;TEST PTT LINE GOTO WAIT ;SLEEP TILL LOW BTFSS PORTB,6 ;TEST RPT- SHIFT LINE GOTO OK ;DO DIVIDER/PRESCALLER ROUTINE BTFSS PORTB,5 ;TEST RPT+ SHIFT LINE GOTO OK ;DO DIVIDER/PRESCALLER ROUTINE GOTO WAIT ;SLEEP IF NOT ON RPT SHIFT OK CALL CHORUS OUTPUT BTFSS PORTA,2 ;TEST O/P HI OR LO AT PRESENT GOTO HI ;IF LO GO SET HI GOTO LO ;IF HI GO SET LO HI NOP ;BALANCE OUT CYCLE TIME MARK&SPACE BSF PORTA,2 ;MAKE O/P HI GOTO RELOAD ;RETURN TO START OF CYCLE LO BCF PORTA,2 ;MAKE O/P LO GOTO RELOAD ;RETURN TO START OF CYCLE CHORUS PRE1 DECFSZ CNT1,F ;DECREMENT PRESCALLER 1 GOTO PRE2 GOTO FINE ;CALL FINE ADJUST SUBROUTINE PRE2 MOVWF CNT2 ;RELOAD PRESCALLER 2 PREE DECFSZ CNT2,F ;DECREMENT PRESCALLER 2 GOTO PREE ;GO BACK AND DECREMENT PRE2 TILL 00 GOTO PRE1 ;GO BACK AND DECREMENT PRE1 TILL 00 FINE DECFSZ CNT3,F ;DECREMENT PRESCALLER 3 GOTO FINE ;GO BACK AND DECREMENT PRE3 TILL 00 RETURN ;RETURN TO CHANGE O/P AND CHECK PTT ETC WAIT BCF INTCON,RBIF ;CLEAR PORT B CHANGE INT FLAG SLEEP ;SLEEP AND WAIT FOR PTT NOP BCF INTCON,GIE ;DISABLE GLOBAL INTERUPTS AGAIN GOTO START ;Reload switch settnings from inputs and start again TONTBL ADDWF PC,F ; W+PC ->PC, JUMP DOWN TABLE ; FT290 16f628 PIN ; MEM SW 9 8 7 6 ; TONE FREQ Posn RB3 RB2 RB1 RB0 ; DT 86,82,10 ; A 67.0 1 1 1 1 1 DT 84,80,0F ; B 71.9 2 1 1 1 0 DT 7B,7C,0F ; C 77.0 3 1 1 0 1 DT 72,82,0F ; D 82.5 4 1 1 0 0 DT 63,91,10 ; E 88.5 5 1 0 1 1 DT 5B,47,11 ; F 94.8 6 1 0 1 0 DT 09,6E,0xB9 ; G 103.5 7 1 0 0 1 DT 0A,71,98 ; H 110.9 8 1 0 0 0 DT 0A,0xCA,83 ; J 118.8 9 0 1 1 1 DT 56,49,11 ; S 100.0 10 0 1 1 0 DT 00,00,00 ; MS 0 1 0 1 DT 00,00,00 ; MS 0 1 0 0 DT 00,00,00 ; X 0 0 1 1 DT 00,00,00 ; X 0 0 1 0 DT 00,00,00 ; X 0 0 0 1 DT 00,00,00 ; X 0 0 0 0 END All CTCSS tones are within EIA standard of .08% . Use a 4Mhz crystal with 2x18pF capacitors. All control lines are active LOW. RA2--------2k2----------RO----Output Pin1 | | 1uF | GND