; AFA v 0.7 ;Morse Frequency Readout for NorCal 20 ;By Don Cantrell, ND6T 8/1/15 ; 191 bytes ;Pin 4: Button ;Pin 5,6: RF input ;Pin 7: Audio out ;************************************************************************************** ; list P=12F675 ; list directive to define processor #include P12F675.inc ; processor specific variable definitions errorlevel -302 ; suppress message 302 from list file errorlevel -305 ; suppress message 305 from list file ; __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC ; ;************************************************************************************** ;Defines ;************************************************************************************** #define BANK1 banksel 80h ;Select Bank1 #define BANK0 banksel 0h ;Select Bank0 #define SPKR GPIO,GP0 ;Pin 7 #define GATE GPIO,GP1 ;Pin 6 ;************************************************************************************** ;General Purpose Registers (GPR's) ;************************************************************************************** #Define TEMP 20h #Define CNT 21h #Define HUNDREDS 22h #Define TENS 23h #Define DUR 24h #Define FREQ 25h #Define WAIT1 26h #Define WAIT2 27h ;************************************************************************************** ORG 0 ;Reset vector ;************************************************************************************** INITIALIZE CLRF TEMP CLRF CNT CLRF DUR CLRF FREQ CLRF WAIT1 CLRF WAIT2 CLRF GPIO CLRF INTCON ;Disable interrupts MOVLW b'00000111' MOVWF CMCON ;Turn off comparator BANK1 MOVLW b'11100111' ;External clock,disable WPU MOVWF OPTION_REG ;Rising edge triggering CLRF VRCON ;Disable internal volt ref CLRF ANSEL ;Digital inputs BANK0 ;************************************************************************************** MAIN ;Gate a 1 millisecond RF sample and count it. CLRF TMR0 ;Clear counter and prescaler MOVLW .3 ;1 millisecond gate time MOVWF WAIT1 INCF WAIT2 BANK1 ;Start frequency sample MOVLW b'00000110' ;Pin 4,5,6 input, others outputs MOVWF TRISIO BANK0 CALL DELAY NOP ;Pad it out. 40 usec per NOP for 1 ms. sample time BANK1 MOVLW b'00000100' ;End frequency sample. Keep gate for toggle MOVWF TRISIO BANK0 MOVF TMR0,W ;To avoid clearing prescaler, move to temp MOVWF TEMP TOG ;Read prescaler by incrementing until output changes INCF CNT ;Compute how far we are from rolling over BCF GATE ;by counting how many fake input toggles it takes to fill BSF GATE ;up the remaining space in the prescaler. MOVF TMR0,W SUBWF TEMP,W BTFSC STATUS,Z GOTO TOG COMF CNT ;Toggle count complete. Determine initial prescaler value. MOVLW .83 ;Correction factor SUBWF CNT,F MOVF CNT,W ;This is the prescaler count MOVWF TEMP ;************************************************************************************** Convert ;Binary to BCD conversion CLRF HUNDREDS ;Zero digit registers CLRF TENS HUNSL MOVLW .100 ; Is Temp >= 100? SUBWF TEMP,W BTFSS STATUS,C ; Is there a Carry?, then "yes" GOTO TENSL MOVWF TEMP ; Save the Result INCF HUNDREDS,F ; Increment the Number of 100s GOTO HUNSL TENSL MOVLW .10 ; Is Temp >= 10? SUBWF TEMP,W BTFSS STATUS,C ; Is there a Carry?, then "yes" GOTO READ MOVWF TEMP ; Save the Result INCF TENS,F ; Increment the Number of 10s GOTO TENSL ;************************************************************************************** READ MOVF HUNDREDS,F ;Is it a zero? BTFSC STATUS,Z GOTO SUP ;Yes, suppress it MOVF HUNDREDS,W ;Else go ahead and announce 100'S CALL INDEX SUP MOVF TENS,W ;10'S CALL INDEX MOVF TEMP,W ;Units CALL INDEX SLEEP ;************************************************************************************** INDEX ADDWF PCL GOTO ZERO GOTO ONE GOTO TWO GOTO THREE GOTO FOUR GOTO FIVE GOTO SIX GOTO SEVEN GOTO EIGHT GOTO NINE ;************************************************************************************** ;CHARACTERS ZERO CALL DAH CALL DAH CALL DAH CALL DAH CALL DAH CALL PAUSE RETURN ONE CALL DIT CALL DAH CALL DAH CALL DAH CALL DAH CALL PAUSE RETURN TWO CALL DIT CALL DIT CALL DAH CALL DAH CALL DAH CALL PAUSE RETURN THREE CALL DIT CALL DIT CALL DIT CALL DAH CALL DAH CALL PAUSE RETURN FOUR CALL DIT CALL DIT CALL DIT CALL DIT CALL DAH CALL PAUSE RETURN FIVE CALL DIT CALL DIT CALL DIT CALL DIT CALL DIT CALL PAUSE RETURN SIX CALL DAH CALL DIT CALL DIT CALL DIT CALL DIT CALL PAUSE RETURN SEVEN CALL DAH CALL DAH CALL DIT CALL DIT CALL DIT CALL PAUSE RETURN EIGHT CALL DAH CALL DAH CALL DAH CALL DIT CALL DIT CALL PAUSE RETURN NINE CALL DAH CALL DAH CALL DAH CALL DAH CALL DIT CALL PAUSE RETURN ;*************************************************************************************** ;ELEMENTS DAH MOVLW .168 MOVWF DUR CALL BEEP ;198 ms MOVLW .2 MOVWF WAIT2 ;Add element space CALL DELAY ;62 ms RETURN DIT MOVLW .56 ;66 MS MOVWF DUR CALL BEEP MOVLW .2 MOVWF WAIT2 ;Add element space CALL DELAY RETURN PAUSE ; Character space MOVLW .8 MOVWF WAIT2 INCF WAIT1 CALL DELAY RETURN BEEP MOVLW .6 MOVWF FREQ CALL TONE DECFSZ DUR GOTO BEEP RETURN ;*************************************************************************************** TONE DECFSZ FREQ GOTO TONE BTFSS SPKR GOTO NO BCF SPKR RETURN NO BSF SPKR RETURN ;*************************************************************************************** DELAY DECFSZ WAIT1 ; Variable delay routine GOTO DELAY DECFSZ WAIT2 GOTO DELAY END