Very interesting Henrik.
I have only skimped through the wiki just now and will read properly offline.
I'm currently using one of the cheap ebay modules on a board i designed and a 16f628 to produce a tunable signal generator dds, this is other peoples code in asm though. One other code is a sweep generator/signal generator with decade digit selection by rotary encoder.
I had been trying to do the maths (Nowhere near my capability) to use a rotary encoder in pbp. I did achieve an incrementing counter in pbp with it but got no further to convert to the tuning word.
I was also able to get it to any frequency by inserting the byte sequence for the tuning word into the code. I had all the amateur bands set up as subs and using a pushbutton could step through them.
I wanted to do the dds in pbp so I could add further features such as keypad freq entry, vfo a and vfo b, along with band switching outputs for a ham radio transceiver I'm building.
Below is some sample code. I did move on much further but then got into a jam with ideas.
Regards,
Rob
Code:
'****************************************************************
'* Name : DDS Frequency Generator *
'* Author : * *
'* Date : 10/29/2012 *
'* Version : 1.0 *
'* Notes : Uses ebay DDS board and rotary encoder *
'* : *
'****************************************************************
'
; 16f628a
; __config _CP_OFF&_LVP_OFF&_BODEN_OFF&_PWRTE_OFF&_WDT_OFF&_INTRC_OSC_NOCLKOUT
;
'
'
'
' 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 1200 ' Command Delay (uS)
DEFINE LCD_DATAUS 50 ' Data Delay (uS)
'
' 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
fcount var byte
Counter var word
CMCON=7 'sets 16f628 comparator pins to digital
TRISA=%00011111 'Button & encoder inputs
Counter = 0
fcount = 0
fstep = 1 ;start at 1 digit count
LOW DDSLOAD
'CONFIGURE DISPLAY
pause 1000
LCDOUT $FE,1 ' Clear screen
pause 10
lcdout $fe,$c0,dec5 counter ; reset to zero on start
ddstart:
shiftout ddsdata,ddsclock,0,[ $07,$2B,$02,$0C ] ;start value
toggle ddsload
pause 100
;Rotary Encoder Code################################################
mainloop1:
if EncoderRight=0 then 'here is switch 2 of the rotary encoder
counter=counter+1
gosub up
gosub dds
gosub lcd
endif
'IF PB_1=0 THEN inc_step
if EncoderLeft=0 then 'here is switch 1 of the rotary encoder
counter = counter-1
gosub down
gosub dds
gosub lcd
endif
goto mainloop1
lcd:
lcdout $fe,$c0,dec5 counter
while (EncoderLeft=0 or EncoderRight=0):pause 10:wend
return
inc_step:
fcount=fcount+1
if fcount=2 then fstep=100
if fcount=1 then fstep=10
fcount=1
return
dds:
shiftout ddsdata,ddsclock,0,[counter]
toggle ddsload
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
end
Bookmarks