;Frequency display and VFO stabiliser (c)1993 - 2002 E.Skelton. ;nom d'origine Gadget40 ;Crystal freq. 4.000MHz ;I.F. offests. 8.902.000 Mgh ; ; programme modifier par F1ARO pour F1BBU ; nom actuel BBU04.ASM ; ***********************BUT******************************** ; Mesurer la frequence de ocsillateur local de son kit transceiver 144 ; cette frequence est divise par circuit integre (diviseur par dix) injecte ; dans le frequecemetre puis additionne par le programme de la valeur de ; la FI ici 10.700.000 MGH ; par exemple l'oscillateur local est 133.300.000 MGH il est divise par 10 ; cela egal 13.330.000 Mgh on additionne la FI ici 10.700.000 Mgh ; l'afficheur LCD affiche 144.000.0 Mgh ; la dizaine et unite de hertz ne sont pas affichees sur le LCD car ; le temps de comptage serais trop long et on aurai lors d'un changement ; de frequence de l'oscillateur local l'impression d'avoir du "mou" dans la ; commande LIST P=16F84 ;SET PIC TYPE FOR ASSEMBLER ; THE FOLLOWING LINE SETS THE CONFIGURATION WORD FUSES. I USE ; THE GPASM ASSEMBLER FOR LINUX. IT SHOULD ALSO WORK WITH MPASM. ; IF YOUR ASSEMBLER DOESN'T SUPPORT __CONFIG, DELETE THE NEXT ; LINE. __CONFIG 0x3FF9 ;XT, NO WDT, PWR-UP, NO CP CARRY EQU 0x00 STATUS EQU 0x03 Z EQU 0x02 RA EQU 0x05 RB EQU 0x06 RTCC EQU 0x01 PC EQU 0x02 FSR EQU 0x04 W EQU 0x00 F EQU 0x01 PS0 EQU 0x00 PS1 EQU 0x01 PS2 EQU 0x02 PSA EQU 0x03 RTE EQU 0x04 RTS EQU 0x05 INTEDG EQU 0x06 RBPU EQU 0x07 ;********* USER DEF'S ********** GATE EQU 0x03 ;COUNTER GATE UP_CNT EQU 0x02 ;CLOCK UP 1 (ALSO ACTS AS SECOND GATE) RESET EQU 0x01 ;COUNTER RESET RS EQU 0x03 ENA EQU 0x02 UDC EQU 0x10 COUNT EQU 0x16 TEMP EQU 0x17 COUNT1 EQU 0x18 COUNT2 EQU 0x19 COUNT3 EQU 0x1A COUNT4 EQU 0x1B CHR EQU 0x1C H_BYTE EQU 0x20 M_BYTE EQU 0x21 L_BYTE EQU 0x23 R0 EQU 0x24 R1 EQU 0x25 R2 EQU 0x26 R3 EQU 0x27 COUNT5 EQU 0x28 ORG 0x00 GOTO START ;******** DELAY LOOP ******** ;** WATCH OUT FOR CALL TO MS100 DECI MOVWF COUNT4 ;DELAY 100MS X CONTENTS (W) NXT6 CALL MS100 DECFSZ COUNT4,1 GOTO NXT6 RETLW 0 ;***************************** ;******** DELAY LOOP 100MS *********** MS100 MOVLW 0x2D ;100 MS DELAY LOOP MOVWF COUNT1 ;EXACT TIMING .1 SEC L1 MOVLW 0x0C ;INCLUDING CALL AND RETURN MOVWF COUNT2 ;4 MHZ XTAL L2 MOVLW 0X3C MOVWF COUNT3 L3 DECFSZ COUNT3,1 GOTO L3 DECFSZ COUNT2,1 GOTO L2 DECFSZ COUNT1,1 GOTO L1 MOVLW 0x96 MOVWF COUNT1 LP99 DECFSZ COUNT1,1 GOTO LP99 NOP NOP RETLW 0 ;**************************************** ;******** DELAY LOOP 200 MICRO SEC. ************* DELAY MOVLW 0x42 ;DELAY LOOP 200 MICROSEC MOVWF COUNT1 NXT5 DECFSZ COUNT1,1 GOTO NXT5 RETLW 0 ;************************************************* ;*********** DELAY LOOP 2MS *********************** MS2 MOVLW 0x0A ;DELAY 2MS MOVWF COUNT1 LP15 MOVLW 0x42 MOVWF COUNT2 LP16 DECFSZ COUNT2,1 GOTO LP16 DECFSZ COUNT1,1 GOTO LP15 RETLW 0 ;************************************************** ;******* CONVERT 24 BIT BIN TO PACKED BCD ********** B2_BCD BCF STATUS,CARRY MOVLW 0x18 MOVWF COUNT CLRF R0 CLRF R1 CLRF R2 CLRF R3 LOOP16 RLF L_BYTE,F RLF M_BYTE,F RLF H_BYTE,F RLF R0,F RLF R1,F RLF R2,F RLF R3,F DECFSZ COUNT,1 GOTO ADJDEC RETLW 0 ADJDEC MOVLW R3 MOVWF FSR CALL ADJBCD MOVLW R2 MOVWF FSR CALL ADJBCD MOVLW R1 MOVWF FSR CALL ADJBCD MOVLW R0 MOVWF FSR CALL ADJBCD GOTO LOOP16 ADJBCD MOVLW 0x03 ADDWF 0,W MOVWF TEMP BTFSC TEMP,3 MOVWF 0 MOVLW 0x30 ADDWF 0,W MOVWF TEMP BTFSC TEMP,7 MOVWF 0 RETLW 0 ;**************************************** ;*********** INITIALISE LCD MODULE 4 BIT MODE *********************** LCDINIT CALL MS100 ;WAIT FOR LCD MODULE HARDWARE RESET BCF RA,RS ;REGISTER SELECT LOW BCF RA,ENA ;ENABLE LINE LOW MOVLW 0x03 MOVWF RB ;8 BIT MODE BSF RA,ENA ;ENA HIGH NOP ;MORE THAN 470 NS BCF RA,ENA ;ENA LOW CALL MS100 ;WAIT FOR DISPLAY TO CATCH UP MOVLW 0x03 MOVWF RB ;8 BIT MODE BSF RA,ENA ;ENA HIGH NOP ;MORE THAN 470 NS BCF RA,ENA ;ENA LOW CALL DELAY ;WAIT FOR DISPLAY TO CATCH UP MOVLW 0x03 MOVWF RB ;8 BIT MODE BSF RA,ENA ;ENA HIGH NOP ;MORE THAN 470 NS BCF RA,ENA ;ENA LOW CALL DELAY ;WAIT FOR DISPLAY TO CATCH UP MOVLW 0x02 MOVWF RB ;4 BIT MODE BSF RA,ENA ;ENA HIGH NOP ;MORE THAN 470 NS BCF RA,ENA ;ENA LOW CALL DELAY ;WAIT FOR DISPLAY MOVLW 0x0C ;DISPLAY ON CALL STROBE CALL DELAY MOVLW 0x06 ;ENTRY MODE SET CALL STROBE CALL DELAY MOVLW 0x01 ;CLEAR DISPLAY CALL STROBE CALL MS2 RETLW 0 ;********************************************************** ;******* STROBE/DATS ****************** ; SENDS DATA TO LCD DISPLAY MODULE (4 BIT MODE) STROBE BCF RA,RS ;SELECT COMMAND REGISTER GOTO CM DATS BSF RA,RS ;SELECT DATA REGISTER CM MOVWF CHR ;STORE CHAR TO DISPLAY SWAPF CHR,0 ;SWAP UPPER AND LOWER NIBBLES (4 BIT MODE) ANDLW 0x0F ;MASK OFF UPPER 4 BITS MOVWF RB ;SEND DATA TO DISPLAY BSF RA,ENA ;ENA HIGH NOP BCF RA,ENA ;ENA LOW MOVLW 0x42 ;DELAY LOOP MOVWF COUNT1 DL3 DECFSZ COUNT1,1 GOTO DL3 MOVF CHR,0 ;GET CHAR AGAIN ANDLW 0x0F ;MASK OFF UPPER 4 BITS MOVWF RB ;SEND DATA TO DISPLAY BSF RA,ENA ;ENA HIGH NOP BCF RA,ENA ;ENA LOW MOVLW 0x42 ;DELAY LOOP MOVWF COUNT1 DL4 DECFSZ COUNT1,1 GOTO DL4 RETLW 0 ;******************************************************************** ;************ MOVE TO START OF LINE 2 ***************** LINE2 MOVLW 0xC0 ;ADDRESS FOR SECOND LINE OF DISPLAY CALL STROBE CALL DELAY RETLW 0 ;****************************************************** ;************ CLEAR DISPLAY *************************** CLEAR MOVLW 0x01 ;COMMAND TO CLEAR DISPLAY CALL STROBE CALL MS2 ;LONGER DELAY NEEDED WHEN CLEARING DISPLAY RETLW 0 ;****************************************************** ;*********** MOVE TO HOME ***************************** HOME MOVLW 0x02 ;COMMAND TO HOME DISPLAY CALL STROBE CALL MS2 RETLW 0 ;****************************************************** ;********* MAIN PROG ************ ;INITIALISE PORTS START BSF 3,5 ;SWITCH TO F REGISTER PAGE 1 MOVLW 0x10 MOVWF RA ;RA 0 TO 3 OUTPUTS, RA 4 INPUT MOVLW 0xF0 ;RB 4 TO 7 INPUTS MOVWF RB MOVLW 0xB7 MOVWF 0X01 ;PRESCALER /256, RB PULL UP DIS. BCF 3,5 ;SWITCH TO F REGISTER PAGE 0 CLRF RA CLRF RB CALL LCDINIT ;INITIALIZE LCD MODULE MOVLW ' ' CALL DATS MOVLW ' ' CALL DATS MOVLW 'F' CALL DATS MOVLW '1' CALL DATS MOVLW 'A' CALL DATS MOVLW 'F' CALL DATS MOVLW 'Z' CALL DATS MOVLW ' ' CALL DATS CALL LINE2 MOVLW ' ' CALL DATS MOVLW '2' CALL DATS MOVLW '0' CALL DATS MOVLW '0' CALL DATS MOVLW '3' CALL DATS MOVLW 0x28 ;Delay for 4 sec. CALL DECI CALL CLEAR MOVLW 0xC3 ;ADDRESS FOR SECOND LINE OF DISPLAY CALL STROBE CALL DELAY ;WRITE "Mhz" AT START OF LINE 2 MOVLW ' ' CALL DATS MOVLW 'M' CALL DATS MOVLW 'H' CALL DATS MOVLW 'z' CALL DATS MOVLW ' ' CALL DATS MOVLW 0x03 MOVWF UDC ;UPDATE DISPLAY EVERY 4 COUNTS CNT_AGN CLRF RB ;CLOSE BOTH GATES, RESET LOW CLRF M_BYTE ;RESET LOW AND MID BYTE COUNT REGISTERS CLRF L_BYTE BSF RB,RESET ;RESET EXTERNAL COUNTER (393) NOP BCF RB,RESET CLRF RTCC ;RESET INTERNAL COUNT (INCLUDING PRESCALER) BSF RB,UP_CNT BSF RB,GATE ;OPEN GATE'S CALL MS100 ;100MS DELAY BCF RB,GATE ;CLOSE GATE(COUNT COMPLETE) BCF RB,UP_CNT MOVF RTCC,W ;GET HIGH BYTE MOVWF H_BYTE ;STORE HIGH BYTE BSF 3,5 ;SWITCH TO F REGISTER PAGE 1 MOVLW 0x70 MOVWF RB ;MAKE RB,7 AN OUTPUT BCF 3,5 ;SWITCH TO F REGISTER PAGE 0 MOVF H_BYTE,W MOVWF TEMP CLK_AGN MOVF TEMP,W XORWF RTCC,W BTFSC STATUS,Z GOTO UP_1 NOP NOP BCF STATUS,CARRY MOVLW 0xFF MOVWF TEMP MOVF M_BYTE,W SUBWF TEMP,W MOVWF M_BYTE GOTO M_DONE UP_1 BSF RB,7 ;CLOCK INTERNAL PRESCALER UP 1 NOP BCF RB,7 INCF M_BYTE,1 GOTO CLK_AGN M_DONE BSF 3,5 ;SWITCH TO F REGISTER PAGE 1 MOVLW 0xF0 MOVWF RB ;MAKE RB,7 AN INPUT AGAIN BCF 3,5 ;SWITCH TO F REGISTER PAGE 0 NY BTFSS RB,7 GOTO UP_IT CLK1 BTFSC RB,7 GOTO UP_MOR NOP NOP BCF STATUS,CARRY MOVLW 0xFF MOVWF TEMP MOVF L_BYTE,W SUBWF TEMP,W MOVWF L_BYTE INCF L_BYTE,F ;!!!!!!!!!!!!!! BTFSC STATUS,CARRY INCF M_BYTE,F ;******************************************************************** MOVLW 0x00 XORWF RTCC,W BTFSC STATUS,Z GOTO CNT_AGN ;*********************************************************************** GOTO CONVERT UP_MOR INCF L_BYTE,1 BSF RB,UP_CNT NOP BCF RB,UP_CNT GOTO CLK1 UP_IT INCF L_BYTE,1 BSF RB,UP_CNT NOP BCF RB,UP_CNT GOTO NY ;The IF addition/subtraction begins here. CONVERT MOVLW 0xF8 ;Add IF 8.902.0 Add FI 10.700.0 ADDWF L_BYTE,F BTFSC STATUS,CARRY ;015BBC HEX = 8.902.0 Dec. INCF M_BYTE,F ;01A1F8 HEX = 10.700.0 DEC MOVLW 0xA1 ADDWF M_BYTE,F BTFSC STATUS,CARRY INCF H_BYTE,F MOVLW 0x01 ADDWF H_BYTE,F GOTO O_DONE ;CONVERT O_DONE DONE DECFSZ UDC,F GOTO CNT_AGN ;DON'T UPDATE DISPLAY MOVLW 0x03 MOVWF UDC ;UPDATE DISPLAY EVERY 2 COUNTS CALL B2_BCD ;CONVERT COUNT TO BCD CALL HOME ;HOME DISPLAY MOVLW 0x30 MOVWF TEMP ;AMOUNT TO ADD TO CONVERT TO ASCII ;*************************************************************************** ;******************LUTTE CONTRE LE BUG************************************* goto ICI ;la freq de 005.898.24 Mgh EST AFFI SUR LE LCD bien qu'on inject 006.553.60 MOVLW 0X00 ;charge 0X00 dans w SUBWF R3,W ;soustr de R3 BTFSS STATUS,Z ;SI r3 -0X00 =0000 alors Z = 1 ON SAUTE goto goto PABUG ;si la valeur est differente aller a PABUG MOVLW 0X58 ;charge 0X58 dans w SUBWF R2,W ;soustr de R3 BTFSS STATUS,Z ;SI r2 -0X58 =0000 alors Z = 1 ON SAUTE goto goto PABUG ;si la valeur est differente aller a PABUG MOVLW 0X98 ;charge 0X98 dans w SUBWF R1,W ;soustr de R3 BTFSS STATUS,Z ;SI r1 -0X00 =0000 alors Z = 1 ON SAUTE goto goto PABUG ;si la valeur est differente aller a PABUG MOVLW 0X24 ;charge 0X24 dans w SUBWF R0,W ;soustr de R0 BTFSS STATUS,Z ;SI r0 - 0X24 =0000 alors Z = 1 ON SAUTE goto goto PABUG ;si la valeur est differente aller a PABUG ; apres avoir verifier que R3 = BIEN 0X00 ; apres avoir verifier que R2 = BIEN 0X58 ; apres avoir verifier que R1 = BIEN 0X98 ; apres avoir verifier que R0 = BIEN 0X24 ;donc on est BIEN en presence du BUG ;on donne de nouvelles donnees de facon a afficher sur le lcd 00655360 ;au lieu DU BUG qui autrement afficherai 00589824 sur le LCD movlw 0X60 MOVWF R0 movlw 0X53 MOVWF R1 movlw 0X65 MOVWF R2 movlw 0X00 MOVWF R3 CALL MS100 ; antirebond ICI ;********************************************************************* PABUG MOVLW 0x81 ;ADDRESS FOR SECOND LINE OF DISPLAY CALL STROBE CALL DELAY MOVF R3,0 ;GET FIRST BCD DIGIT ANDLW 0x0F ;MASK OFF OTHER PACKED BCD DIGIT ADDWF TEMP,W CALL DATS SWAPF R2,0 ;GET NEXT DIGIT ANDLW 0x0F ;MASK OFF OTHER PACKED BCD DIGIT ADDWF TEMP,W CALL DATS ;DISPLAY IT MOVF R2,0 ;GET OTHER BCD DIGIT ANDLW 0x0F ;MASK OFF OTHER PACKED BCD DIGIT ADDWF TEMP,W CALL DATS MOVLW '.' CALL DATS SWAPF R1,0 ;GET NEXT DIGIT ANDLW 0x0F ;MASK OFF OTHER PACKED BCD DIGIT ADDWF TEMP,W CALL DATS ;DISPLAY IT MOVF R1,0 ;GET OTHER BCD DIGIT ANDLW 0x0F ADDWF TEMP,W CALL DATS SWAPF R0,0 ;GET NEXT DIGIT ANDLW 0x0F ;MASK OFF OTHER PACKED BCD DIGIT ADDWF TEMP,W CALL DATS ;DISPLAY IT MOVLW 0xC0 ;ADDRESS FOR SECOND LINE OF DISPLAY CALL STROBE CALL DELAY MOVLW '.' CALL DATS MOVF R0,0 ;GET OTHER BCD DIGIT ANDLW 0x0F ADDWF TEMP,W CALL DATS ;DISPLAY IT CALL HOME GOTO CNT_AGN ;ALL DONE , START AGAIN END