Code:
'****************************************************************
'* Name : DDS16F.BAS *
'* Author : Ingvar Gillholm *
'* Date : 2004-03-11 *
'* Version : 1.0 *
'* Notes : This program produces a sinewave through PortB, *
'* : which should have a R-2R leadder connected to it. *
'****************************************************************
@ device pic16F876, hs_osc, wdt_off
define OSC 20
'DEFINE LOADER_USED 1
TonePort VAR PortB
CheckNew VAR PortA.3
Phase VAR BYTE[3] BANK0
Freq VAR BYTE[3] BANK0
Zero VAR BYTE BANK0
TempVar VAR BYTE
ADCON1 = 7 'Porta is digital
TrisA = $ff 'All inputs
PortB = 0 'Start with all outputs low
TrisB = 0 'All outputs
Zero = 0
PR2 = $3f
OUTPUT PortC.2
T2CON = %00000100
CCP1CON = %00001100
GOTO New
Main:
asm
;
;======================== MAIN LOOP =========================
;
bcf STATUS,RP0
bcf STATUS,RP1
Loop
BTFSC _CheckNew ; Check for a new frequency
GOTO _New ; and get new frequency
;
MOVF _Freq,W ; Get the current frequency
ADDWF _Phase,F ; and increment the phase
btfss STATUS,C ;
goto NoCarry ;burn time if no carry
incf _Phase+1 ;
btfsc STATUS,Z ;
incf _Phase+2 ;
AfterCarry ;
MOVF _Freq+1,W ;
ADDWF _Phase+1,F ;
btfsc STATUS,C ;
incf _Phase+2 ;
MOVF _Freq+2,W ;
ADDWF _Phase+2,F ;
MOVF _Phase+2,W ;
ANDLW 07Fh ;Reduce to 7 bits for 180 degrees
CALL SineTbl ; and get amplitude
BTFSS _Phase+2,7 ;Is amplitude supposed to be negative?
SUBWF _Zero,w ;Change polarity of sine amplitude
MOVWF _TonePort ;Output to DAC
GOTO Loop ;
NoCarry
goto AfterCarry
;*********** SINE TABLE ****************
SineTbl
ADDWF PCL
retlw 080h
retlw 083h
retlw 086h
retlw 089h
retlw 08Ch
retlw 090h
retlw 093h
retlw 096h
retlw 099h
retlw 09Ch
retlw 09Fh
retlw 0A2h
retlw 0A5h
retlw 0A8h
retlw 0ABh
retlw 0AEh
retlw 0B1h
retlw 0B3h
retlw 0B6h
retlw 0B9h
retlw 0BCh
retlw 0BFh
retlw 0C1h
retlw 0C4h
retlw 0C7h
retlw 0C9h
retlw 0CCh
retlw 0CEh
retlw 0D1h
retlw 0D3h
retlw 0D5h
retlw 0D8h
retlw 0DAh
retlw 0DCh
retlw 0DEh
retlw 0E0h
retlw 0E2h
retlw 0E4h
retlw 0E6h
retlw 0E8h
retlw 0EAh
retlw 0EBh
retlw 0EDh
retlw 0EFh
retlw 0F0h
retlw 0F1h
retlw 0F3h
retlw 0F4h
retlw 0F5h
retlw 0F6h
retlw 0F8h
retlw 0F9h
retlw 0FAh
retlw 0FAh
retlw 0FBh
retlw 0FCh
retlw 0FDh
retlw 0FDh
retlw 0FEh
retlw 0FEh
retlw 0FEh
retlw 0FFh
retlw 0FFh
retlw 0FFh
retlw 0FFh
retlw 0FFh
retlw 0FFh
retlw 0FFh
retlw 0FEh
retlw 0FEh
retlw 0FEh
retlw 0FDh
retlw 0FDh
retlw 0FCh
retlw 0FBh
retlw 0FAh
retlw 0FAh
retlw 0F9h
retlw 0F8h
retlw 0F6h
retlw 0F5h
retlw 0F4h
retlw 0F3h
retlw 0F1h
retlw 0F0h
retlw 0EFh
retlw 0EDh
retlw 0EBh
retlw 0EAh
retlw 0E8h
retlw 0E6h
retlw 0E4h
retlw 0E2h
retlw 0E0h
retlw 0DEh
retlw 0DCh
retlw 0DAh
retlw 0D8h
retlw 0D5h
retlw 0D3h
retlw 0D1h
retlw 0CEh
retlw 0CCh
retlw 0C9h
retlw 0C7h
retlw 0C4h
retlw 0C1h
retlw 0BFh
retlw 0BCh
retlw 0B9h
retlw 0B6h
retlw 0B3h
retlw 0B1h
retlw 0AEh
retlw 0ABh
retlw 0A8h
retlw 0A5h
retlw 0A2h
retlw 09Fh
retlw 09Ch
retlw 099h
retlw 096h
retlw 093h
retlw 090h
retlw 08Ch
retlw 089h
retlw 086h
retlw 083h
ENDASM
New:
' The frequency is calculated as FreqValue = DesiredFreq/((1/2^24)*(5*10^6/28))
' Same as FreqValue = DesiredFreq/((1/16777216)*(5000000/28))
' Same as FreqValue = DesiredFreq*16777216*28/5000000
' Same as FreqValue = DesiredFreq*93,9524096
' The resolution is 1/93,9524096 = 0,01064368656703404........Hz
' The eight frequencies selected for this test is........
' 67,0 = 001896
' 94,8 = 0022CA
' 118,8 = 002B99
' 146,2 = 0035A7
' 173,8 = 003FC8
' 199,5 = 004937
' 225,7 = 0052D5
' 254,1 = 005D41
TempVar = PortA & %00000111 'Only lower 3 bits
' LOOKUP TempVar,[$00,$00,$00,$00,$00,$00,$00,$00],Freq[2] 'Stuff Hibyte
' LOOKUP TempVar,[$1a,$25,$2e,$39,$44,$4e,$58,$63],Freq[1] 'Stuff Midbyte
' LOOKUP TempVar,[$58,$47,$b7,$7d,$57,$72,$c0,$eb],Freq[0] 'Stuff Lowbyte
LOOKUP TempVar,[$00,$00,$00,$00,$00,$00,$00,$00],Freq[2] 'Stuff Hibyte
LOOKUP TempVar,[$18,$22,$2b,$35,$3f,$49,$52,$5d],Freq[1] 'Stuff Midbyte
LOOKUP TempVar,[$96,$ca,$99,$a7,$c8,$37,$d5,$41],Freq[0] 'Stuff Lowbyte
GOTO Main
END
Doing amplitde control is probably too much to ask from a 16F@20MHz but a 18F@40MHz might be able to pull it off.
Bookmarks