Code:
'****************************************************************
'* Name : DDS Frequency Generator *
'* Author : R J Lane G4NQX *
'* Notice : *
'* : *
'* Date : 10/29/2012 *
'* Version : 1.0 *
'* Notes : Uses ebay DDS board and rotary encoder *
'* : *
'****************************************************************
;Tuning word = (2^32 / DDS clock frequency in Hz) x Wanted Frequency in Hz
;Note: 2^32 = 4294967296
;Gives 34.35947448 x freq wanted in Hz
;@__config _CP_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_INTRC_OSC_NOCLKOUT
' Hardware Defines
' ================
'
;############################ LCD Display ############################
Define LCD_DREG PORTB ' Port for LCD Data
Define LCD_DBIT 0 ' Use lower 4 bits of Port
Define LCD_RSREG PORTB ' Port for RegisterSelect (RS) bit
Define LCD_RSBIT 6 ' Port Pin for RS bit
Define LCD_RWBIT 5 ' Port Pin for RS bit
Define LCD_EREG PORTB ' Port for Enable (E) bit
Define LCD_EBIT 4 ' Port Pin for E bit
Define LCB_BITS 4 ' Using 4-bit bus
Define LCD_LINES 2 ' Using 2 line Display
Define LCD_COMMANDUS 2000
' Command Delay (uS)
DEFINE LCD_DATAUS 50 ' Data Delay (uS)
define OSC 04
;######################################################################
;##################### Control Buttons/Lines #########################
PB_1 var PortA.4 ' Take this pin low momentarily to change step
PB_2 var PortA.3 ' Take this pin low momentarily to change band
PB_3 var PortA.2 ' Take this pin low momentarily to RESET
EncoderRight var PortA.1 ' rotary encoder pin
EncoderLeft var PortA.0 ' rotary encoder pin
ddsload var PortB.7 ' dds control word pin
ddsdata var PortB.3 ' dds data input
ddsclock var PortB.2 ' dds clock input
;#######################################################################
fStep var byte ; for step routine (later)
fcount var byte
Counter var word
num var byte
digitpos var byte
top var word
x var byte
CMCON=7 'sets 16f628 comparator pins to digital
TRISA=%00011111 'Button & encoder inputs
Counter = 0
fcount = 0
high ddsload ;set ddsload
freq_0 var byte
freq_1 var byte
freq_2 var byte
freq_3 var byte
freq_4 var byte
byte2send var byte
bit_count var byte
'CONFIGURE DISPLAY
pause 1000
LCDOUT $FE,1 ' Clear screen
;lcdout $fe,$c0,dec5 counter ; reset to zero on start
pause 1000
gosub band80m ;required to kickstart dds ( Odd ?? )
PAUSE 1000
gosub band80m
ddsfreq:
;
; TEST RUN ############################################
;
;
lcdout $fe,$80,"160m"
lcdout $fe,$C0," 1.800.000 Hz "
GOSUB band160m
PAUSE 15000
lcdout $fe,$80," 80m"
lcdout $fe,$C0," 3.500.000 Hz "
GOSUB band80m
PAUSE 15000
lcdout $fe,$80," 60m"
lcdout $fe,$C0," 5.330.500 Hz "
GOSUB band60m
PAUSE 15000
lcdout $fe,$80," 40m"
lcdout $fe,$C0," 7.000.000 Hz "
GOSUB band40m
PAUSE 15000
lcdout $fe,$80," 30m"
lcdout $fe,$C0," 10.100.000 Hz "
GOSUB band30m
PAUSE 15000
lcdout $fe,$80," 20m"
lcdout $fe,$C0," 14.000.000 Hz "
GOSUB band20m
PAUSE 15000
lcdout $fe,$80," 17m"
lcdout $fe,$C0," 18.068.000 Hz "
GOSUB band17m
PAUSE 15000
lcdout $fe,$80," 15m"
lcdout $fe,$C0," 21.000.000 Hz "
GOSUB band15m
PAUSE 15000
lcdout $fe,$80," 12m"
lcdout $fe,$C0," 24.890.000 Hz "
GOSUB band12m
PAUSE 15000
lcdout $fe,$80," 10m"
lcdout $fe,$C0," 28.000.000 Hz "
GOSUB band10m
PAUSE 15000
LCDOUT $FE,1 ' Clear screen
pause 10
lcdout $fe,$c0,dec5 counter ; reset to zero on start
goto loop1
;
; TEST RUN ############################################
;
;
;Rotary Encoder Code################################################
loop1:
if EncoderLeft=0 then 'here is switch 1 of the rotary encoder
;counter = counter-1
gosub down
; dds here
gosub lcd
endif
if EncoderRight=0 then 'here is switch 2 of the rotary encoder
;counter=counter+1
gosub up
;dds here
gosub lcd
endif
goto loop1
lcd:
lcdout $fe,$c0,dec5 counter
while (EncoderLeft=0 or EncoderRight=0):pause 10:wend
return
;######################################################################
up:
counter[0]=counter[0]+1
if counter[0]>99 then
counter[0]=0
counter[1]=counter[1]+1
if counter[1]>99 then
counter[1]=0
counter[2]=counter[2]+1
if counter[2]>99 then
counter[2]=0
counter[3]=counter[3]+1
if counter[3]>99 then
counter[3]=0 ;reset to zero
endif
endif
endif
endif
return
down:
counter[0]=counter[0]-1
if counter[0]<1 then
counter[0]=0
counter[1]=counter[1]-1
if counter[1]<1 then
counter[1]=99
counter[2]=counter[2]-1
if counter[2]<1 then
counter[2]=99
counter[3]=counter[3]-1
if counter[3]<1 then
counter[3]=99
endif
endif
endif
endif
return
;band160m: ;1.8 mhz
;freq_0 = $0E
;freq_1 = $B6
;freq_2 = $AF
;freq_3 = $03
;freq_4 = $00
;call send_dds_word
;RETURN
band160m: ;1.8 mhz TEST
freq_0 = $E9
freq_1 = $B7
freq_2 = $AF
freq_3 = $03
freq_4 = $00
call send_dds_word
RETURN
band80m: ;3.5 mhz
freq_0 = $70
freq_1 = $FE
freq_2 = $2A
freq_3 = $07
freq_4 = $00
call send_dds_word
RETURN
band60m: ;5.3305 mhz
freq_0 = $A1
freq_1 = $B2
freq_2 = $EA
freq_3 = $0A
freq_4 = $00
call send_dds_word
RETURN
band40m: ;7 mhz
freq_0 = $E1
freq_1 = $FC
freq_2 = $55
freq_3 = $0E
freq_4 = $00
call send_dds_word
RETURN
band30m: ;10.1 mhz
freq_0 = $A4
freq_1 = $44
freq_2 = $AF
freq_3 = $14
freq_4 = $00
call send_dds_word
RETURN
band20m: ;14 mhz
freq_0 = $C2
freq_1 = $F9
freq_2 = $AB
freq_3 = $1C
freq_4 = $00
call send_dds_word
RETURN
band17m: ;18.068 mhz
freq_0 = $48
freq_1 = $C3
freq_2 = $00
freq_3 = $25
freq_4 = $00
call send_dds_word
RETURN
band15m: ;21 mhz
freq_0 = $A4
freq_1 = $F6
freq_2 = $01
freq_3 = $2B
freq_4 = $00
call send_dds_word
RETURN
band12m: ;24.890 mhz
freq_0 = $97
freq_1 = $6D
freq_2 = $F9
freq_3 = $32
freq_4 = $00
call send_dds_word
RETURN
band10m: ;28 mhz
freq_0 = $85
freq_1 = $F3
freq_2 = $57
freq_3 = $39
freq_4 = $00
call send_dds_word
RETURN
; test freqs:
; Zero = $00,$00,$00,$00,$00
; 1Hz = $22,$00,$00,$00,$00 - tested
;
; ############ 3 line dds freq routine in pic basic ###########################
;shiftout ddsdata,ddsclock,4,[$0E,$B6,$AF,$03,$00] ; 1.8MHZ
;high ddsload ;tuning word hex order reversed
;low ddsload
;##############################################################################
asm
_send_dds_word
movlw _freq_0
movwf FSR
_next_byte
movf INDF,w
movwf _byte2send
movlw 0x08
movwf _bit_count
_next_bit
rrf _byte2send,f
btfss STATUS,C
goto _send0
bsf PORTB,3
bsf PORTB,2
bcf PORTB,2
goto _break
_send0
bcf PORTB,3
bsf PORTB,2
bcf PORTB,2
_break
decfsz _bit_count,f
goto _next_bit
incf FSR,f
movlw _freq_4+1
subwf FSR,w
btfss STATUS,C
goto _next_byte
bsf PORTB,7
bcf PORTB,7
endasm
return
end ; program end point
Bookmarks