Hello, Im new to DSP. Does anybody have any example of numeric
oscillator in ASM for motorola 56K or 56Fxxx? Im looking to generate
several fixed frequencies no look-up table, just plain square output on
PIO. Thanks a lot
generating frequencies, no look-up need
Started by ●March 11, 2008
Reply by ●March 12, 20082008-03-12
Hi,
Generating multiple precise frequencies is very easy.
You need a reference sampling frequency Fs much higher than the highest
frequency to generate.
Your algorithm must be called at each period of Fs (mostly into the
Timer Interrupt Service Routine)
Method:
generate sawtooth signals by adding an increment to a fractional
variable at each sampling period and letting it overflow from +1 to -1
The signs of sawtooth variables are then shifted out and applied to
your parallel port.
JM Ory
Fs equ 1E5 ; suppose Fs is 100kHz (generated by timer)
F0 equ 1234.0 ; definition of frequencies (floating point values)
... ; etc ...
Fn equ 9876.0 ;
N equ 16 ; number of frequencies
; Constant data:
org x:
delta_values
delta0 dc 2.*F0/Fs ;
... ;
delta_n dc 2.*Fn/Fs ; (Fractional values)
; Variable data
org x:
integs ds N ; Integrators (could be double for
more precision)
; Code called from the Interrupt Routine
org p:
...
Timer_Isr:
< Reset Timer Flag >
< save A, B, X0, Y0, Y1, R0, R1 if necessary >
clr b ; B = 0, Carry=0
move #0,y0 ; LSB = 0 if single precision
move #delta0,r0 ; R0 points begin of Constants table
move #integs,r1 ; R1 points begin of integrators
do #N,p1 ; Repeat N times ...
move x:(r0)+,y1 ; get one increment value in Y (or move
L:(r0)+,Y if double precision)
move x:(r1),a ; A <-- integrator values
adc y,a ; Long addition
move a1,x:(r1)+ ; A --> integrators (should be a10 in double
precision)
lsl a ; get sign of each integrator into Carry
rol b ; Save the carry bit into B1
p1 ; end repeat
move b,x:port ; write B into parallel port
< Restore all registers >
rti
dspabout a rit :
> Hello, Im new to DSP. Does anybody have any example of numeric
> oscillator in ASM for motorola 56K or 56Fxxx? Im looking to generate
> several fixed frequencies no look-up table, just plain square output on
> PIO. Thanks a lot
>
>
Generating multiple precise frequencies is very easy.
You need a reference sampling frequency Fs much higher than the highest
frequency to generate.
Your algorithm must be called at each period of Fs (mostly into the
Timer Interrupt Service Routine)
Method:
generate sawtooth signals by adding an increment to a fractional
variable at each sampling period and letting it overflow from +1 to -1
The signs of sawtooth variables are then shifted out and applied to
your parallel port.
JM Ory
Fs equ 1E5 ; suppose Fs is 100kHz (generated by timer)
F0 equ 1234.0 ; definition of frequencies (floating point values)
... ; etc ...
Fn equ 9876.0 ;
N equ 16 ; number of frequencies
; Constant data:
org x:
delta_values
delta0 dc 2.*F0/Fs ;
... ;
delta_n dc 2.*Fn/Fs ; (Fractional values)
; Variable data
org x:
integs ds N ; Integrators (could be double for
more precision)
; Code called from the Interrupt Routine
org p:
...
Timer_Isr:
< Reset Timer Flag >
< save A, B, X0, Y0, Y1, R0, R1 if necessary >
clr b ; B = 0, Carry=0
move #0,y0 ; LSB = 0 if single precision
move #delta0,r0 ; R0 points begin of Constants table
move #integs,r1 ; R1 points begin of integrators
do #N,p1 ; Repeat N times ...
move x:(r0)+,y1 ; get one increment value in Y (or move
L:(r0)+,Y if double precision)
move x:(r1),a ; A <-- integrator values
adc y,a ; Long addition
move a1,x:(r1)+ ; A --> integrators (should be a10 in double
precision)
lsl a ; get sign of each integrator into Carry
rol b ; Save the carry bit into B1
p1 ; end repeat
move b,x:port ; write B into parallel port
< Restore all registers >
rti
dspabout a rit :
> Hello, Im new to DSP. Does anybody have any example of numeric
> oscillator in ASM for motorola 56K or 56Fxxx? Im looking to generate
> several fixed frequencies no look-up table, just plain square output on
> PIO. Thanks a lot
>
>