; ***** T23_syn universele synthesiser-sturing voor atv-TX ***** ; ; ***** Ver 1.0 first release aug'97 ******* ; ***** Ver 1.1 met save freq routine 20-9-'97 deze versie is in de eerste pakketjes uitgebracht ******* ; ; ***** Ver 1.12 250kHz stapgroote 01-01-'98 ******* ; ***** Ver 1.14 met interrupt op RB4-7 ******* ; ***** Ver 1.15 met read_syn routine ******* ; ***** Ver 1.16 met TX_on sequencer ******* ; ***** Ver 1.18 met set-up faciliteiten ******* ; ; ***** VERSIE 1.2 officiele release 9-3-98 deze versie is in de tweede serie pakk. uitgebracht ******* ; ; ***** ver 1.19 met verbeterde timing voor LCD display ivm verschillende merken lcd's ; ***** ver 1.20 met max freq 2650MHz ivm nieuw type vco voor 13cm met groter bereik. ; ; Speciale 10GHz versie voor mix zenders LO freq. vast op 9035MHz, min. stapgroote nu 1 MHz ; bereik 10000-10500 MHz, VCO type V1200 gebruiken! RGK 25-12-'99 ; LIST P=16C84 ; include "C74_reg.h" include "lcd.h" include "uni_syn2.h" ; #define TBL (Table+1) ; LCD_DATA EQU PORTB LCD_DATA_TRIS EQU TRISB LCD_CNTL EQU PORTA ; freq_fractional EQU 0x00C D_0 EQU 0x00D D_1 EQU 0x00E D_2 EQU 0x00F MSD EQU 0x010 LSD EQU 0x011 TEMP EQU 0x012 TEMP1 EQU 0x013 CHAR EQU 0X014 dly_teller EQU 0x015 iic_teller EQU 0x016 tdata EQU 0x017 syn_lo EQU 0x018 syn_hi EQU 0x019 ctrl EQU 0x01A ports EQU 0x01B TIME EQU 0x01C TX_teller EQU 0x01D freq_lo EQU 0x01E freq_hi EQU 0x01F Min_lo EQU 0x020 Min_hi EQU 0x021 Max_lo EQU 0x022 Max_hi EQU 0x023 Off_lo EQU 0x024 Off_hi EQU 0x025 Step_lo EQU 0x026 Step_hi EQU 0x027 Mode EQU 0x028 if_lo EQU 0x029 if_hi EQU 0x02A ; ; regs loopt bij C84 tot 2F maximaal ! ; ; eeprom lokaties in gebruik ; eefreq equ 0x00 ; 00 en 01 eemin equ 0x02 ; 02 en 03 eemax equ 0x04 ; 04 en 05 eeoff equ 0x06 ; 06 en 07 eestep_lo equ 0x08 eestep_hi equ 0x09 eemode equ 0x0A ; ; ; LCD Display Commands and Control Signal names. ; E EQU 0 ; LCD Enable R_W EQU 1 ; LCD Read/Write RS EQU 2 ; LCD Register Select ; ; org 0 ; goto init ; org 4 goto int_handler ; init BSF STATUS,RP0 ; Bank 1 bsf OPTION_R,RBPU ; disable pull-ups van poort b movlw 0x18 ; RA0/2 output, RA3,4 input movwf TRISA ; set port a movlw 0xF0 ; port b4-7 als input,0-3 als output movwf TRISB ; set port b BCF STATUS, RP0 ; Bank 0 CLRF PORTA ; clear de poorten. CLRF PORTB bcf INTCON,RBIE movf PORTB,W bcf INTCON,RBIF bsf STATUS,RP0 ; page one movlw 0x87 movwf OPTION_R ; set tmr0 bcf STATUS,RP0 ; page 0 clrf RTCC ; clear tmr0 register bcf INTCON,RTIF ; clear tmr0 int vlag CALL DISPLAY_INIT ; lcd display initialisatie call i2c_init ; initialiseer en test de i2c-bus goto MAIN ; ;********************* LCD display routines vlgs Microchip AN 587 ********* ; dispmsg movwf TEMP1 ;TEMP1 holds start of message address call Table andlw 0FFh ;Check if at end of message (zero btfsc STATUS,Z ;returned at end) return call SEND_CHAR ;Display character movf TEMP1,w ;Point to next character addlw 1 goto dispmsg ; ;************************************************************************** ; DISPLAY_INIT call delay_5ms ; Wacht 15 ms voor init start call delay_5ms call delay_5ms MOVLW 0x03 ; Power up sequence (1) HD 44780 MOVWF LCD_DATA ; BSF LCD_CNTL, E ; call delay BCF LCD_CNTL, E ; ; CALL delay_5ms ; Wacht 5 ms ; MOVLW 0x03 ; Power up sequence (2) HD 44780 MOVWF LCD_DATA ; BSF LCD_CNTL, E ; call delay BCF LCD_CNTL, E ; ; CALL delay_300 ; Wacht 300uS (100us moet genoeg zijn) ; MOVLW 0x03 ; Power up sequence (3) HD 44780 MOVWF LCD_DATA ; BSF LCD_CNTL, E ; call delay BCF LCD_CNTL, E ; ; MOVLW 0x02 ; Commando voor 4-bit interface low nibble; MOVWF LCD_DATA ; BSF LCD_CNTL, E ; call delay BCF LCD_CNTL, E ; CALL delay_5ms ; Wacht 5 ms (datash. hd44780) ; ; Command sequence for 2 lines of 5x7 characters =0x28h ; ; Busy Flag should be valid after this point ; movlw 0x28 call SEND_CMD MOVLW DISP_OFF ; CALL SEND_CMD ; MOVLW CLR_DISP ; CALL SEND_CMD ; MOVLW ENTRY_INC ; CALL SEND_CMD ; ; MOVLW DD_RAM_ADDR ; ; CALL SEND_CMD ; return ; ;******************************************************************* ;* SEND_CHAR - Sends character to LCD * ;* This routine splits the character into the upper and lower * ;* nibbles and sends them to the LCD, upper nibble first. * ;* The data is transmitted on the PORT<3:0> pins * ;******************************************************************* ; SEND_CHAR MOVWF CHAR ; Character to be sent is in W CALL BUSY_CHECK ; Wait for LCD to be ready SWAPF CHAR, W ANDLW 0x0F ; Get upper nibble MOVWF LCD_DATA ; Send data to LCD BCF LCD_CNTL, R_W ; Set LCD to read BSF LCD_CNTL, RS ; Set LCD to data mode BSF LCD_CNTL, E ; toggle E for LCD nop BCF LCD_CNTL, E MOVF CHAR, W ANDLW 0x0F ; Get lower nibble MOVWF LCD_DATA ; Send data to LCD BSF LCD_CNTL, E ; toggle E for LCD nop BCF LCD_CNTL, E RETURN ; SEND_CMD MOVWF CHAR ; Character to be sent is in W CALL BUSY_CHECK ; Wait for LCD to be ready SWAPF CHAR, W ANDLW 0x0F ; Get upper nibble MOVWF LCD_DATA ; Send data to LCD BCF LCD_CNTL, R_W ; Set LCD to read BCF LCD_CNTL, RS ; Set LCD to command mode BSF LCD_CNTL, E ; toggle E for LCD nop BCF LCD_CNTL, E MOVF CHAR, W ANDLW 0x0F ; Get lower nibble MOVWF LCD_DATA ; Send data to LCD BSF LCD_CNTL, E ; toggle E for LCD nop BCF LCD_CNTL, E RETURN ; ;******************************************************************* ;* This routine checks the busy flag, returns when not busy * ;* Affects: * ;* TEMP - Returned with busy/address * ;******************************************************************* ; BUSY_CHECK BSF STATUS, RP0 ; Bank 1 MOVLW 0xFF ; Set PortB for input MOVWF LCD_DATA_TRIS ; set tris-b register (bank1 is selected) BCF STATUS, RP0 ; Bank 0 BCF LCD_CNTL, RS ; Set LCD for Command mode BSF LCD_CNTL, R_W ; Setup to read busy flag BSF LCD_CNTL, E ; Set E high BCF LCD_CNTL, E ; Set E low SWAPF LCD_DATA, W ; Read upper nibble busy flag, DDRam address ANDLW 0xF0 ; Mask out lower nibble MOVWF TEMP ; BSF LCD_CNTL, E ; Toggle E to get lower nibble BCF LCD_CNTL, E MOVF LCD_DATA, W ; Read lower nibble busy flag, DDRam address ANDLW 0x0F ; Mask out upper nibble IORWF TEMP, F ; Combine nibbles BTFSC TEMP, 7 ; Check busy flag, high = busy GOTO BUSY_CHECK ; If busy, check again BCF LCD_CNTL, R_W BSF STATUS, RP0 ; Bank 1 MOVLW 0xF0 ; MOVWF LCD_DATA_TRIS ; RB7 - 4 = inputs, RB3 - 0 = output BCF STATUS, RP0 ; Bank 0 RETURN ; ; *********************************************************************** ; Table addwf PCL, F ; Jump to char pointed to in W reg txt1 retlw 'T' ; 1 retlw 'X' ; 2 retlw ' ' ; 3 retlw 'F' ; 4 retlw 'R' ; 5 retlw 'E' ; 6 retlw 'Q' ; 7 retlw ':' ; 8 retlw 0 ; 9 txt2 retlw ' ' ; 10 retlw ' ' ; 11 retlw ' ' ; 12 retlw ' ' ; 13 retlw ' ' ; 14 retlw 'M' ; 15 retlw 'H' ; 16 retlw 'z' ; 17 retlw 0 ; 18 txt_frac ; *** PAS OP hier niks tussen prutsen **** retlw '0' ; 19 retlw '0' ; 20 retlw 0 ; 21 nop ; 22 retlw '2' ; 23 retlw '5' ; 24 retlw 0 ; 25 nop ; 26 retlw '5' ; 27 retlw '0' ; 28 retlw 0 ; 29 nop ; 30 retlw '7' ; 31 retlw '5' ; 32 retlw 0 ; 33 nop ; 34 txti_err retlw 'I' ; 35 retlw '2' ; 36 retlw 'C' ; 37 retlw ' ' ; 38 retlw 'E' ; 39 retlw 'r' ; 40 retlw 'r' ; 41 retlw ':' ; 42 retlw 0 ; 43 txtno_ack retlw 'o' ; 44 retlw 'n' ; 45 retlw ' ' ; 46 retlw 'a' ; 47 retlw 'd' ; 48 retlw 'r' ; 49 retlw 'C' ; 50 retlw '2' ; 51 retlw 0 ; 52 txtbus_err retlw 'b' ; 53 retlw 'u' ; 54 retlw 's' ; 55 retlw ' ' ; 56 retlw 'l' ; 57 retlw 'o' ; 58 retlw 'w' ; 59 retlw ' ' ; 60 retlw 0 ; 61 ;txtpll_e1 ; retlw 'P' ; 62 ; retlw 'l' ; 63 ; retlw 'l' ; 64 ; retlw ' ' ; 65 ; retlw 'o' ; 66 ; retlw 'u' ; 67 ; retlw 't' ; 68 ; retlw ' ' ; 69 ; retlw 0 ; 70 ;txtpll_e2 ; retlw 'o' ; 71 ; retlw 'f' ; 72 ; retlw ' ' ; 73 ; retlw 'l' ; 74 ; retlw 'o' ; 75 ; retlw 'c' ; 76 ; retlw 'k' ; 77 ; retlw ' ' ; 78 ; retlw 0 ; 79 txt_menu1 retlw 'S' retlw 'e' retlw 't' retlw '-' retlw 'u' retlw 'p' retlw ' ' retlw 'M' retlw 0 txt_menu2 retlw 'e' retlw 'n' retlw 'u' retlw ' ' retlw 'V' retlw '1' retlw '.' retlw '2' retlw 0 txt_menu3 retlw 'F' retlw 'r' retlw ' ' retlw 'M' retlw 'i' retlw 'n' retlw ':' retlw 0 txt_menu4 retlw 'F' retlw 'r' retlw ' ' retlw 'M' retlw 'a' retlw 'x' retlw ':' retlw 0 txt_menu5 retlw 'S' retlw 't' retlw 'e' retlw 'p' retlw ' ' retlw 'L' retlw 'o' retlw 0 txt_menu6 retlw 'S' retlw 't' retlw 'e' retlw 'p' retlw ' ' retlw 'H' retlw 'i' retlw 0 ; ;txt_menu7 ; retlw 'S' ; retlw 'e' ; retlw 't' ; retlw ' ' ; retlw 'm' ; retlw 'o' ; retlw 'd' ; retlw 'e' ; retlw 0 ; Table_End ; if ( (Table & 0x0FF) >= (Table_End & 0x0FF) ) MESSG "Warning - User Defined: Table crosses page boundry in computed jump" endif ; ;************************************************************************************************** ; MAIN org 0x100 ; start main programma clrf ctrl clrf ports ; TSA5055 "ports" variabele instellen clrf TX_teller ; de zender uit bcf STATUS,RP1 ; clear toetsaktiviteits vlag call reken ; bereken de synthesiser-deelfactor call set_syn ; stuur naar TSA5055 movlw DISP_ON ; zet LCD aan call SEND_CMD btfss PORTB,5 ; toets 2 ingedrukt? goto set_up_var MAIN1 call read_setup ; haal setup uit eeprom call reken ; bereken de synthesiser-deelfactor call set_syn ; stuur naar TSA5055 ; call dis_freq ; toon frequentie op het lcd display bsf INTCON,RBIE ; vanaf nu int on RB4-7 toegestaan bsf INTCON,RTIE ; vanaf nu tmr0 int toegestaan bsf INTCON,GIE ; global int's aan ; ; movlw 0x20 ; load time met 32 * 65mS = 2 seconden movwf TIME ; m_loop movf TIME,F ; set de zero vlag btfsc STATUS,Z ; test vlag goto check_pll ; test de pll lock vlag movf TX_teller,F btfsc STATUS,Z ; test of TX-timer 0 is goto m_loop movlw (TX_3+1) subwf TX_teller,W btfsc STATUS,Z ; test of TX-timer op maximum is goto m_loop movlw TX_1 subwf TX_teller,W btfsc STATUS,Z goto set_COAX ; schakel coaxrelais movlw TX_2 subwf TX_teller,W btfsc STATUS,Z goto set_TX ; schakel de stuurzender movlw TX_3 subwf TX_teller,W btfsc STATUS,Z goto set_PA ; schakel de eindtrap ; goto m_loop ; verder niks meer te doen ; check_pll bcf INTCON,GIE ; disable alle interrupts movf TIME,F btfss STATUS,Z goto _pll call read_syn ; test de pll movlw 0x05 ; load time met 5 voor korte delay movwf TIME _pll bsf INTCON,GIE ; enable de int's weer goto m_loop ; set_COAX btfsc STATUS,IRP ; test de TX toggle vlag goto COAX_aan bcf ports,COAX ; zet coaxrelais uit bcf INTCON,GIE ; geen int's tijdens i2c akties call set_syn bsf INTCON,GIE goto m_loop COAX_aan bsf ports,COAX ; zet coaxrelais aan bcf INTCON,GIE call set_syn bsf INTCON,GIE goto m_loop ; set_PA btfsc STATUS,IRP ; test de TX toggle vlag goto PA_aan bcf ports,PA ; zet eindtrap uit bcf INTCON,GIE ; geen int's tijdens i2c akties call set_syn bsf INTCON,GIE goto m_loop PA_aan bsf ports,PA ; zet eindtrap aan bcf INTCON,GIE call set_syn bsf INTCON,GIE goto m_loop ; set_TX btfsc STATUS,IRP ; test de TX toggle vlag goto tx_aan bcf ports,TX ; zet tx uit bcf INTCON,GIE ; geen int's tijdens i2c akties call set_syn bsf INTCON,GIE goto m_loop tx_aan bsf ports,TX ; zet TX aan bcf INTCON,GIE call set_syn bsf INTCON,GIE goto m_loop ; int_handler btfsc INTCON,RBIF ; Interrupt routine on RB4-7 change goto toets ; het was een RB4-7 int btfsc INTCON,RTIF ; Interrupt on tmr0 overflow goto tmr_0_int ; het was een tmr0 overflow int retfie ; het was weer helemaal niks ; toets bcf INTCON,RBIE movf PORTB,w ; lees poort b bcf INTCON,RBIF movf PORTB,w ; lees poort b nog eens ivm juiste latch-waarde btfss PORTB,6 ; rotary encoder CW call up btfss PORTB,7 ; rotary encoder CCW call dwn btfss PORTB,4 ; toets 1 call key_1 ; btfss PORTB,5 ; toets 2 ; call key_2 bcf INTCON,RBIF bsf INTCON,RBIE ; enable nieuwe int's movlw 0x20 movwf TIME clrf RTCC ; reset tmr0 bsf STATUS,RP1 ; set toetsaktiviteits vlag retfie ; tmr_0_int bcf INTCON,RTIE ; clear tmr0 int enable bcf INTCON,RTIF ; clear tmr0 int vlag clrf RTCC ; clear tmr0 register decf TIME btfss STATUS,IRP ; test de TX-ON vlag goto tel_af movlw (TX_3+1) ; max waarde TX-teller subwf TX_teller,W btfss STATUS,Z ; is max al bereikt, dan niet verder verhogen incf TX_teller,F goto int_1 ; klaar, eruit ; tel_af movf TX_teller ; set zero vlag btfss STATUS,Z decf TX_teller,F ; int_1 bsf INTCON,RTIE ; set tmr0 int enable retfie ; ; *************************************************************************************** ; up call delay_300 ; Is de puls een blijvertje? btfsc PORTB,6 return up_90 btfsc PORTB,7 ; wacht op puls van kanaal2 goto up_90 call freq_up ; voer taak uit up_270 btfsc PORTB,7 ; puls van kanaal2 weg? return goto up_270 ; dwn call delay_300 ; Is de puls een blijvertje? btfsc PORTB,7 return dwn_90 btfsc PORTB,6 ; wacht op puls van kanaal1 goto dwn_90 call freq_dwn ; voer taak uit dwn_270 btfsc PORTB,6 ; puls van kanaal1 weg? return goto dwn_270 ; ;*********************** algemene up-dwn routine, gebruikt reg. freq_lo en hi ******************** ; freq_up movfw Step_lo ; stapgroote low btfss PORTB,5 ; test toets '2' movfw Step_hi ; neem stapgroote high als toets is gedrukt addwf freq_lo,F ; en tel op bij freq_lo btfsc STATUS,C ; carry ? incf freq_hi,F ; dan freq_hi ook ophogen call chk_max ; test of max. freq is bereikt ; btfss ctrl,0 ; hoe nu verder goto up_dwn_1 ; normale aktie, reken, set-syn, en display freq x4 met kommadeel btfss ctrl,1 goto up_dwn_2 call dis_hex1 ; display freq zonder x4 en zonder kommadeel tbv set stepsize return ; ; freq_dwn movfw Step_lo ; stapgroote low btfss PORTB,5 ; test toets '2' movfw Step_hi ; neem stapgroote high als toets is gedrukt subwf freq_lo,F ; en trek af van freq_lo btfss STATUS,C ; carry ? decf freq_hi,F ; dan freq_lo ook verlagen call chk_min ; test of min. freq is bereikt ; btfss ctrl,0 ; check wat te doen goto up_dwn_1 ; normale aktie, reken, set-syn, en display freq x4 met kommadeel btfss ctrl,1 goto up_dwn_2 call dis_hex1 ; display freq zonder x4 en zonder kommadeel tbv set stepsize return ; ; up_dwn_1 call reken ; bepaal synthesiser settings call set_syn call dis_freq ; bcd > LCD display return ; up_dwn_2 call dis_1 ; display freq x4 zonder kommadeel tbv set min en max return ; ;********************************************************************* ; chk_max movfw Max_hi ; haal max_hi movwf TEMP ; max_hi in temp movfw freq_hi ; haal freq_hi subwf TEMP,F ; (max_hi)-freq_hi btfss STATUS,C ; < 0: maak freq = f_min goto f_min btfss STATUS,Z ; = 0: check ook freq_lo return movfw Max_lo ; haal max_lo movwf TEMP ; max_lo in temp movfw freq_lo ; haal freq_lo subwf TEMP,F ; max_lo-freq_lo btfsc STATUS,C return f_min movfw Min_hi ; freq = minimum movwf freq_hi movfw Min_lo movwf freq_lo return ; chk_min movfw freq_hi ; haal freq_hi movwf TEMP ; freq_hi in temp movfw Min_hi ; haal min_hi subwf TEMP,F ; (freq_hi)-min_hi btfss STATUS,C ; < 0: maak freq = f_max goto f_max btfss STATUS,Z ; = 0: check ook freq_lo return movfw freq_lo movwf TEMP movfw Min_lo ; haal min_lo subwf TEMP,F ; freq_lo-min_lo btfsc STATUS,C return f_max movfw Max_hi ; freq = maximum movwf freq_hi movfw Max_lo movwf freq_lo return ; ;************************************************************************** ; start_tx bcf _rp0 ; init i2c bus movf PORTA,W ; lees aktuele toestand poort a andlw i2c_lines ; maak scl en sda '0', dit heeft pas effect als RA3 en 4 output gemaakt worden movwf PORTA ; set de RA latch ; bsf _rp0 ; nu kunnen we de tris regs bespringen bsf sda ; RA4 als input > sda lijn hoog bsf scl ; RA3 als input > scl lijn hoog call delay ; effe wachte bcf sda ; RA4 als output, in de latch staat nog een '0' dus sda wordt laag call delay ; sda laag terwijl scl hoog blijft > Startconditie. return ; stop_tx bsf _rp0 ; naar tris regs bcf sda ; maak sda laag bsf scl ; maak scl hoog call delay ; bit tijd bsf sda ; maak sda hoog call delay bcf _rp0 ; bij verlaten i2c routine naar page 0! return ; tx_data bsf _rp0 bcf scl call delay movlw 8 ; acht databits te verzenden movwf iic_teller loop_tx rlf tdata,F ; haal data en schuif een bit in de carry call tx_bit ; verstuur het bit decfsz iic_teller,F ; alle acht gedaan ? goto loop_tx ; volgende bit bsf _rp0 ; scl > laag bcf scl bsf sda ; sda > hoog tbv inlezen ack-bit van slave call delay bsf scl ; scl > hoog > nu komt de ack call delay bcf STATUS,C ; bcf _rp0 ; sda op lezen omschakelen btfsc sda ; lees ack bit bsf STATUS,C ; zet carry bit dienovereenkomstig bsf _rp0 ; weer op schrijven omschakelen bcf scl ; scl laag > einde ack leestijd return ; tx_bit btfss STATUS,C ; carry=0 > clear sda bcf sda btfsc STATUS,C ; carry=1 > set sda bsf sda bsf scl ; scl hoog > inklokken databit call delay ; bit-tijd bcf scl ; scl laag > einde bit transfer return ; rx_data bsf _rp0 ; page 1 bcf scl ; klok laag bsf sda ; data hoog om te kunnen lezen call delay movlw 8 ; acht bits te gaan movwf iic_teller loop_rx call rx_bit rlf tdata,F decfsz iic_teller,F ; alle bits gehad? goto loop_rx bsf _rp0 ; voor de zekerheid bcf scl ; klok laag bcf sda ; data laag > dit is de ack van de master call delay bsf scl ; klok hoog > inlezen van de ack door de slave call delay return ; rx_nack bsf _rp0 ; page 1 bcf scl ; klok laag bsf sda ; data hoog om te kunnen lezen call delay movlw 8 ; acht bits te gaan movwf iic_teller loop_na call rx_bit rlf tdata,F decfsz iic_teller,F ; alle bits gehad? goto loop_na bsf _rp0 ; voor de zekerheid bcf scl ; klok laag bsf sda ; data hoog > dit is geen ack van de master call delay bsf scl ; klok hoog > inlezen van de ack door de slave call delay return ; rx_bit bsf scl ; klok hoog > de data komt nu binnen call delay bcf STATUS,C ; carry=0 bcf _rp0 ; maak lezen mogelijk btfsc sda ; lees sda lijn bsf STATUS,C ; zet carry overeenkomstig sda lijn databit bsf _rp0 ; page 1 bcf scl ; klok laag, einde leesbit call delay return ; i2c_err movlw 0x80 ; cursor op eerste regel call SEND_CMD movlw (txti_err-TBL) ; txt I2C err call dispmsg movlw 0xC0 call SEND_CMD movlw (txtno_ack-TBL) ; txt on adr C0 call dispmsg call time_1 return ; ;****************************************************************************** ; reken movlw 0xF0 movwf if_lo movlw 0x23 movwf if_hi ; movfw freq_lo ; freq naar syn movwf syn_lo movfw freq_hi movwf syn_hi ; sub call make_neg add movf if_lo,W ; get if low byte *** Mix subtract GEDEELTE *** addwf syn_lo,F ; tel op bij syn low byte btfsc STATUS,C ; carry =1 > doorschuiven naar incf syn_hi,F ; syn_hi byte movf if_hi,W ; get if hi byte addwf syn_hi,F ; tel op bij syn high byte ; ; vermenigvuldiging met 8 ; bcf STATUS,C rlf syn_lo,F ; het is simpel omdat er rlf syn_hi,F ; geen overflow kan optreden. rlf syn_lo,F ; syn mag nooit meer dan 16 bits zijn rlf syn_hi,F rlf syn_lo,F rlf syn_hi,F movlw 0xF8 andwf syn_lo,F ; voor de zekerheid (niet echt nodig) return ; make_neg comf if_lo incf if_lo btfsc STATUS,Z decf if_hi comf if_hi retlw 0 ; ; **************************************************************************** ; set_syn movlw syn_addr ; haal synthesiser-adres movwf tdata call start_tx ; genereer i2c start-sequence call tx_data ; verzend de data in tdata btfsc STATUS,C ; test de ack van de TSA5055 call i2c_err ; geen ack > display error message movfw syn_hi ; verzend de 4 data-bytes movwf tdata call tx_data movfw syn_lo movwf tdata call tx_data movlw 0x0CE ; vaste parameter CE voorlopig movwf tdata call tx_data movfw ports movwf tdata call tx_data call stop_tx ; genereer i2c-stop sequence return ; ;******************************************************************************** ; freqtxt movlw 0x80 ; cursor op eerste regel call SEND_CMD movlw (txt1-TBL) ; eerste txt startadres call dispmsg movlw 0xC0 ; cursor op tweede regel call SEND_CMD movlw (txt2-TBL) ; tweede txt startadres call dispmsg return ; ; ******************************************************************************* ; hex_2_bcd bcf STATUS,RP0 movlw .16 movwf TEMP1 clrf D_0 clrf D_1 clrf D_2 loop16 rlf LSD,F rlf MSD,F rlf D_2,F rlf D_1,F rlf D_0,F decfsz TEMP1,F goto adjDEC retlw 0 ; adjDEC movlw D_2 movwf FSR call adjBCD ; movlw D_1 movwf FSR call adjBCD ; movlw D_0 movwf FSR call adjBCD ; goto loop16 ; adjBCD movlw 3 addwf 0,W movwf TEMP btfsc TEMP,3 movwf 0 movlw 30 addwf 0,W movwf TEMP btfsc TEMP,7 movwf 0 retlw 0 ; ;*********************************************************************************************** ; ; display tx frequentie, de waarde in het register 'freq', dit is de viervoudige frequentie; dis_freq call freqtxt ; lcd "Tx Freq: " ; movfw freq_lo ; restfractie afsplitsen ; andlw 0x03 ; movwf freq_fractional ; opbergen in freq_fractional :00=000kHz 01=250kHz 10=500kHz 11=750kHz ; movlw 0xC5 ; cursor verplaatsen naar kommapositie ; call SEND_CMD ; bcf STATUS,C ; rlf freq_fractional ; ivm txt_frac tabel met 4 vermenigvuldigen ; rlf freq_fractional ; movfw freq_fractional ; addlw (txt_frac-TBL) ; offset txt_frac-tabel erbij tellen ; call dispmsg ; fractional naar lcd display sturen ; ; entry point voor freq zonder gedeelte achter de komma ; dis_1 movfw freq_hi ; freq bewaren movwf MSD movfw freq_lo ; andlw 0xfc ; onderste 2 bits schoonmaken ivm roteren door carry movwf LSD ; bcf STATUS,C ; waarde door 4 delen tbv displayen ; rrf MSD ; rrf LSD ; rrf MSD ; rrf LSD ; ; entry point voor andere te displayen hex-16 getallen, invoer dmv registers MSD en LSD ; dis_hex call hex_2_bcd ; geheel getal naar display clrf TEMP1 movlw 0xC0 ; cursor pos voor de frequentie call SEND_CMD movfw D_0 ; alle vijf digits afdrukken call digit swapf D_1,W call digit movfw D_1 call digit swapf D_2,W call digit movfw D_2 call digit return ; digit andlw 0x0F ; mask hi nibb. en set zero-flag btfsc TEMP1,0 ; temp,0=clear> test op leading zero goto dig_2 ; temp,0=set > karakter afdrukken btfss STATUS,Z ; zero-flag=set>onderdruk leading-zero goto dig_1 ; zero-flag=clr>zero wel afdrukken movlw 0xF0 ; onderdruk 0> -10h + 30h = 20h goto dig_2 ; druk karakter af dig_1 bsf TEMP1,0 ; er is een niet-0 karakter geweest dig_2 addlw 0x30 ; bcd to ascii call SEND_CHAR ; naar LCD return ; dis_hex1 movfw freq_lo movwf LSD movfw freq_hi movwf MSD goto dis_hex ; ; ************************************************************************************** ; key_1 call delay_5ms ; dender onderdrukking btfsc PORTB,4 return ; puls was geen blijvertje btfss STATUS,IRP ; test het TX-ON bit goto TX_ON ; was uit, nu aan bcf STATUS,IRP ; was aan, nu uit _los1 btfsc PORTB,4 ; wacht op loslaten van de toets return goto _los1 ; TX_ON bsf STATUS,IRP ; set TX-ON bit goto _los1 ; ;*************************************************************************************** ; key_2 call delay_5ms ; dender onderdrukking btfsc PORTB,5 return ; puls was geen blijvertje nop _los2 btfsc PORTB,5 ; wacht op loslaten van de toets return goto _los2 ; ;*************************************************************************************** save_eefreq movlw eefreq ; haal adres freq in eeprom save_1 movwf eeadr ; set eeprom adres movf freq_lo,w ; haal lo byte freq movwf eedata ; naar eeprom call ee_wr ; schrijfroutine incf eeadr,f ; eeprom volgende adres movf freq_hi,w ; haal hi byte freq save_2 movwf eedata call ee_wr ; freq-hi ook wegschrijven bcf STATUS,RP1 ; clear freq_save vlag als het saven gedaan is return ; save_lo movwf eeadr movf freq_lo,w goto save_2 ; ;************************************************************************ ; lees_eefreq movlw eefreq ; adres van freq_lo lees_1 movwf eeadr ; set eeprom adres call ee_rd ; data nu in eedata movf eedata,w ; data in w movwf freq_lo ; naar freq_lo incf eeadr,f call ee_rd ; nu freq_hi halen movf eedata,w ; data in w movwf freq_hi return ; ; ************************ read eedata ************************************** ee_rd bsf STATUS,RP0 ; page 1 bsf eecon1,rd ; initiate read action bcf STATUS,RP0 return ; return with data in eedata ; ; ************************ write eedata ************************************* ee_wr bsf STATUS,RP0 ; page 1 bsf eecon1,wren ; enable write to eeprom bcf eecon1,eeif ; clear write ready flag movlw 0x55 movwf eecon2 movlw 0xaa movwf eecon2 bsf eecon1,wr ee_wait btfss eecon1,eeif ; wait until write complete goto ee_wait bcf eecon1,wren ; disable writing to eeprom bcf STATUS,RP0 ; back to page 0 again return ; return-data is written in eeprom loc eeadr ; ;*********************** 1 seconde delay met tmr0 *************************** ; time_1 movlw 0x10 ; delay 16 * .065 = 1000 movwf TEMP ti_1 call delay_65 decf TEMP,f btfss STATUS,Z goto ti_1 return ; delay_65 clrf RTCC ; clear tmr0 register bcf INTCON,RTIF ; clear tmr0 int vlag ; bsf INTCON,RTIE ; set tmr0 int enable d65_1 btfss INTCON,RTIF ; en tellen maar tot rollover (RTIF=set) goto d65_1 ; bcf INTCON,RTIE bcf INTCON,RTIF return ; ;******************************* kleine delays ************************************ ; delay movlw .10 ; ca 32 us delay movwf dly_teller dly1 decfsz dly_teller,F goto dly1 return ; delay_300 movlw .10 ; ca 300 us delay dly2 movwf TEMP dly3 call delay decfsz TEMP,F goto dly3 return ; delay_5ms movlw .150 ; ca 5000 us delay goto dly2 ; ; *************************************************************************************** ; i2c_init bcf _rp0 ; init i2c bus movf PORTA,W ; lees aktuele toestand poort a andlw i2c_lines ; maak scl en sda '0', dit heeft pas effect als RA3 en 4 output gemaakt worden movwf PORTA ; set de RA latch ; bsf _rp0 ; nu kunnen we de tris regs bespringen bsf sda ; RA4 als input > sda lijn hoog bsf scl ; RA3 als input > scl lijn hoog call delay ; effe wachte bcf _rp0 ; page 0 btfss scl ; test scl lijn, moet hoog zijn goto bus_err ; foute boel btfss sda ; test sda lijn, moet hoog zijn goto bus_err return ; alles kits ; bus_err movlw 0x80 ; cursor op eerste regel call SEND_CMD movlw (txti_err-TBL) ; txt I2C err call dispmsg movlw 0xC0 ; cursor op tweede regel call SEND_CMD movlw (txtbus_err-TBL) ; txt bus low call dispmsg sleep ; er is niets meer aan te doen ; ; *************************************************************************************** ; read_syn btfsc STATUS,RP1 call save_eefreq ; freq in eeprom saven als toetsint is geweest ivm nieuwe frequentie call set_syn ; ivm langdurig onbewaakt gebruik movlw syn_addr ; haal synthesiser-adres addlw 0x01 ; verander in lees adres movwf tdata call start_tx ; genereer i2c start-sequence call tx_data ; verzend de data in tdata call rx_nack ; lees 1 byte en geen ack van de master call stop_tx btfsc tdata,6 ; test de lock flag return ; o.k. dan eruit return ; voorlopig pll test niet gebruiken i.v.m. problemen. ; bcf STATUS,IRP ; zender uit ; clrf ports,F ; direct de boel uitzetten ; call set_syn ; movlw 0x80 ; cursor op eerste regel ; call SEND_CMD ; movlw (txtpll_e1-TBL) ; txt Pll out ; call dispmsg ; movlw 0xC0 ; call SEND_CMD ; movlw (txtpll_e2-TBL) ; txt of lock ; call dispmsg ; call time_1 ; call dis_freq ; bcd > LCD display ; return ; ; ****************************** variabelen set-up deel ********************************** ; set_up_var call wis_lcd movlw 0x80 ; command begin v/d eerste regel call SEND_CMD movlw (txt_menu1-TBL) ; startadres v/d tekst call dispmsg movlw 0xC0 ; command begin v/d tweede regel call SEND_CMD movlw (txt_menu2-TBL) ; startadres v/d tekst call dispmsg menu1 btfss PORTB,5 ; wacht op loslaten van de toets goto menu1 call delay_5ms menu2 btfsc PORTB,5 ; wacht hier op de volgende menu optie goto menu2 ; ; ** Minimum freq instellen ** ; ; eerst max en min waarde vastleggen ivm chk_max en chk_min routine ; movlw 0x29 movwf Max_hi movlw 0x04 movwf Max_lo movlw 0x27 movwf Min_hi movlw 0x10 movwf Min_lo movlw 0x0a movwf Step_lo ; hier stapgroote 10MHz maken movlw 0x01 ; set ctrl variabele ivm de juiste display routine bij up en dwn movwf ctrl ; call wis_lcd movlw 0x80 ; command begin v/d eerste regel call SEND_CMD movlw (txt_menu3-TBL) ; startadres v/d tekst call dispmsg clrf freq_fractional movlw eemin ; eeprom adres van minimum frequentie call lees_1 ; lees waarde in call dis_1 ; display de waarde min_1 btfss PORTB,5 ; wacht op loslaten van de toets goto min_1 call delay_5ms ; min_2 btfss PORTB,6 ; rotary encoder up kanaal call up btfss PORTB,7 ; rotary encoder dwn kanaal call dwn btfsc PORTB,5 ; wacht hier op de volgende menu optie goto min_2 call delay_5ms movlw eemin ; adres van minimum waarde in eeprom call save_1 ; save de min freq ; ; ** Maximum freq instellen ** ; call wis_lcd movlw 0x80 ; command begin v/d eerste regel call SEND_CMD movlw (txt_menu4-TBL) ; startadres v/d tekst call dispmsg clrf freq_fractional movlw eemax ; eeprom adres van maximum frequentie call lees_1 ; lees waarde in call dis_1 ; display de waarde max_1 btfss PORTB,5 ; wacht op loslaten van de toets goto max_1 call delay_5ms ; max_2 btfss PORTB,6 ; rotary encoder up kanaal call up btfss PORTB,7 ; rotary encoder dwn kanaal call dwn btfsc PORTB,5 ; wacht hier op de volgende menu optie goto max_2 call delay_5ms movlw eemax ; adres van maximum waarde in eeprom call save_1 ; save de max freq ; ; ** Stepsize lo instellen ** ; ; eerst max en min waarde vastleggen ivm chk_max en chk_min routine ; clrf Max_hi movlw 0x28 movwf Max_lo clrf Min_hi movlw 0x01 movwf Min_lo movwf Step_lo ; stapgroote hier 1 maken movlw 0x03 ; set ctrl variabele ivm de juiste display routine bij up en dwn movwf ctrl ; call wis_lcd movlw 0x80 ; command begin v/d eerste regel call SEND_CMD movlw (txt_menu5-TBL) ; startadres v/d tekst call dispmsg clrf freq_fractional movlw eestep_lo ; eeprom adres van stepsize-lo movwf eeadr call ee_rd movf eedata,w movwf freq_lo ; gebruik register freq om waarde tijdelijk in te bewaren movwf LSD clrf freq_hi clrf MSD call dis_hex1 ; display de waarde stp_1 btfss PORTB,5 ; wacht op loslaten van de toets goto stp_1 call delay_5ms ; stp_2 btfss PORTB,6 ; rotary encoder up kanaal call up btfss PORTB,7 ; rotary encoder dwn kanaal call dwn btfsc PORTB,5 ; wacht hier op de volgende menu optie goto stp_2 call delay_5ms movlw eestep_lo ; adres van stepsize in eeprom call save_lo ; save de stepsize ; ; ** stepsize hi instellen ** ; call wis_lcd movlw 0x80 ; command begin v/d eerste regel call SEND_CMD movlw (txt_menu6-TBL) ; startadres v/d tekst call dispmsg clrf freq_fractional movlw eestep_hi ; eeprom adres van stepsize-lo movwf eeadr call ee_rd movf eedata,w movwf freq_lo ; gebruik register freq om waarde tijdelijk in te bewaren movwf LSD clrf freq_hi clrf MSD call dis_hex1 ; display de waarde stp_3 btfss PORTB,5 ; wacht op loslaten van de toets goto stp_3 call delay_5ms ; stp_4 btfss PORTB,6 ; rotary encoder up kanaal call up btfss PORTB,7 ; rotary encoder dwn kanaal call dwn btfsc PORTB,5 ; wacht hier op de volgende menu optie goto stp_4 call delay_5ms movlw eestep_hi ; adres van stepsize in eeprom call save_lo ; save de stepsize ; ; ** Mode instellen ** ; ; clrf Max_hi ; movlw 0x02 ; movwf Max_lo ; clrf Min_hi ; movlw 0x01 ; movwf Min_lo ; movwf Step_lo ; stapgroote hier 1 maken ; ; call wis_lcd ; movlw 0x80 ; command begin v/d eerste regel ; call SEND_CMD ; movlw (txt_menu7-TBL) ; startadres v/d tekst ; call dispmsg ; clrf freq_fractional ; movlw eemode ; eeprom adres van mode byte ; movwf eeadr ; call ee_rd ; movf eedata,w ; movwf freq_lo ; gebruik register freq om waarde tijdelijk in te bewaren ; movwf LSD ; clrf freq_hi ; clrf MSD ; call dis_hex1 ; display de waarde ;mo_1 btfss PORTB,5 ; wacht op loslaten van de toets ; goto mo_1 ; call delay_5ms ; ;mo_2 btfss PORTB,6 ; rotary encoder up kanaal ; call up ; btfss PORTB,7 ; rotary encoder dwn kanaal ; call dwn ; btfsc PORTB,5 ; wacht hier op de volgende menu optie ; goto mo_2 ; call delay_5ms ; movlw eemode ; adres van mode byte in eeprom ; call save_lo ; save de mode ; ; ********* EINDE SETUP, nu nog even freq gelijk aan fr-min maken ****** ; movlw eemin call lees_1 ; haal fr-min op in freq movlw eefreq call save_1 ; schrijf fr-min weg in eefreq clrf ctrl ; gebruik voortaan de normale display routine bij up en dwn goto MAIN1 ; terug naar het hoofdprogramma ; ; ********************************* SETUP INLEZEN **************************************** ; read_setup movlw 0x0B ; 11 bytes in te lezen movwf TEMP movlw freq_lo ; startadres ram movwf FSR ; indirecte adressering movlw eefreq ; startadres eeprom movwf eeadr read1 call ee_rd ; lees de eeprom movf eedata,W movwf INDF ; naar ram lokatie waar FSR naar wijst incf eeadr,F incf FSR,F decfsz TEMP,F goto read1 return ; ; **************************************************************************************** ; wis_lcd movlw 0x01 call SEND_CMD call delay_5ms return org 2007 db 0x00,0x01 ; set fuses, cp=on,pwrt=on,wdt=off,osc=xt org 2100 ; vul eeprom db 0x00,0xa0 ; freq 10400 MHz als default db 0x00,0x28 db 0x00,0x10 ; freq 10000 MHz als minimum default db 0x00,0x27 db 0x00,0x04 ; freq 10500 MHz als maximum default db 0x00,0x29 db 0x00,0x00 ; default display offset = 0000, geen offset db 0x00,0x00 db 0x00,0x01 ; step lo def:1 (250kHz) db 0x00,0x0a ; step hi def:10(10 MHz) db 0x00,0x01 ; default mode = normaal tx 23/13 ; END