📄 gfun2.bas
字号:
' Audio Generatore Direct Digital Synthesis. (DDS)
'
'rev.0 22/04/07 preliminare
'rev.1 13/06/07 buzzer + check vbatt
'rev.2 23/08/07 flash led + rifiniture
'
'$map
'$sim
'
$regfile = "m48def.DAT"
$crystal = 10000000
$hwstack = 32
$swstack = 16
$framesize = 32
'
'
' Frequency = r24/r25/r26* (xtal freq/cycles in loop)/16777216 (2^24)
' Fincr = frequenza voluta / multiplier
'
Const Cycles = 9 'DDS cycles loop
Const Multiplier = (_xtal/cycles)/2^24
'
Const ledOn = 1
Const ledOff = 0
'
'
Const Vref = 1.1 'A/d internal reference
Const BitAD = Vref/1024
Const Vlowbatt = 7.7 'NiMH min. 1,1v * elemento * 7 elementi
Const Kdivider = 2/(22+2) 'R2/(R1+R2) partitore tensione
Const Lo_batt = int((Vlowbatt*Kdivider)/BitAD)
'
'
Config Lcd = 16 * 2
'
Config Lcdpin=Pin,E=PortC.1,Rs=PortC.2,Db4=PortB.5,Db5=PortB.4,Db6=PortB.3,Db7=PortB.2
'
Config Adc = Single , Prescaler = Auto , Reference = Internal
'
'
declare sub Scan_Button
declare sub Taston
declare sub Tastoff
declare sub Detasti
declare sub Mostra
declare sub Ril_Run
declare sub Ad_Conv
'
Dim Wave(256) As Byte at &H100
Dim dummy1 As Word 'lasciare
Dim TmpW As Word
Dim ADv As Word
'
Dim Fincr As Long 'incremento frequenza
Dim TmpL As Long
'
Dim Singl As Single 'calcolo frequenza voluta
'
Dim Fdig(5) As Byte 'array aggiorna freq.
Dim Digit As Byte
Dim Shape As Byte 'forma d'onda
Dim Txx1 As Byte 'uso sbr
Dim Txx2 As Byte
Dim Tasti As Byte 'deposito scansione tasti
Dim Index As Byte
Dim T_Flash As Byte 'timer lampeggio led
'
'
'
' PortD.7 (13) ' out R2R DAC msb
' PortD.6 (12) ' out
' PortD.5 (11) ' out
' PortD.4 (6) ' out
' PortD.3 (5) ' out
' PortD.2 (4) ' out
' PortD.1 (3) ' out
' PortD.0 (2) ' out R2R DAC lsb
'
' PortC.7 ( ) 'N.A.
' PortC.6 (1) 'reset pin
' PortC.5 (28) ' out buzzer
' PortC.4 (27) ' out status led
' PortC.3 (26) ' inp Run/Stop button
' PortC.2 (25) ' out R/S display
' PortC.1 (24) ' out En display
' PortC.0 (23) ' Adc0 check Vbatt
'
' PortB.7 (10) 'xtal
' PortB.6 (9) 'xtal
' PortB.5 (19) ' out Db4 display & scan button
' PortB.4 (18) ' out Db5 display & scan button
' PortB.3 (17) ' out Db6 display & scan button
' PortB.2 (16) ' out Db7 display & scan button
' PortB.1 (15) ' inp scan button retutn line
' PortB.0 (14) ' out free
'
'
'
Led_F Alias PortC.4 'status indicator
Buzz Alias PortC.5
In_Butt Alias PinB.1 'lettura ritorno scansione tasti
Run_St Alias PinC.3 'lettura tasto run/stop
'
'
'
'Set data direction of PortB
DDRB = &B00111101 ' 1=out 0=inp
'set data direction of PortC
DDRC = &B00110110 ' 1=out 0=inp
'Set data direction PortD
DDRD = &B11111111 ' R2R ladder on PORTD
'
cls
sound buzz,50,500
lcd " Gen. Fun. v.2"
sound buzz,20,5000
waitms 1000
Shape = 0 'sine function
' set frequenza iniziale 1000Hz sine
Fdig(1) = 0 ' decine migliaia
Fdig(2) = 1 ' migliaia
Fdig(3) = 0 ' centinaia
Fdig(4) = 0 ' decine
Fdig(5) = 0 ' unita
'
Rientro:
sound buzz,100,400
cursor on blink 'abilita cursore lcd segnaposto
call Tastoff 'tutti tasti rilasciati
call Ril_Run 'anche run stop
'
Index = 1 'posiz. cursore su decine migliaia
do
call Mostra 'display stato attuale
call TastOn 'attende un tasto premuto
if Run_St = 0 then exit do
'esamina tasti
if Tasti = 8 then 'roll funzione forma onda
incr shape
if shape > 3 then shape = 0
elseif Tasti = 1 then 'incremento digit
Digit = Fdig(Index) 'recupera cifra posizione cursore
incr Digit
if Digit > 9 then
sound buzz,80,1000
Digit = 9 'tiene fisso
endif
Fdig(Index) = Digit
'
elseif Tasti = 2 then 'decremento digit
Digit = Fdig(Index)
decr Digit
if Digit > 128 then
sound buzz,80,1000
Digit = 0 ' negativo ? tiene fisso
endif
Fdig(Index) = Digit 'aggiorna cifra
'
elseif Tasti = 4 then 'scorre cursore su digit
incr Index
if Index > 5 then Index = 1
endif
call Tastoff 'attende rilascio tasto
loop
'
'converte l'array in numero intero
Fincr = 0
TmpW = 1
Txx1 = 5 'index inizia da unita
do
TmpL = Fdig(Txx1) * TmpW 'da * 1 a * 10000
Fincr = Fincr + TmpL
TmpW = TmpW * 10 'cambia moltiplicatore
decr Txx1
loop until Txx1 = 0
'
Singl = Fincr / Multiplier 'calcola Fincr
Fincr = Singl + 0.5 'cint
call Ril_Run 'attende rilascio Run_stop
Led_F = ledOn 'acceso fisso
cursor off blink 'toglie cursore display
'
' locate 1,6
' lcd hex(fincr) 'x test
'
Shape = Shape and 3
on Shape goto Go_si,Go_sq,Go_tr,Go_sw
'
Go_si:
restore Sine_table
rjmp Run_gen
'
Go_sq:
restore Square_table
rjmp Run_gen
'
Go_tr:
restore Triangle_table
rjmp Run_gen
'
Go_sw:
restore Sawtooth_table
'
'
Run_gen:
TmpW = 1
do
read Wave(TmpW) 'trasferisce in ram function table
incr TmpW
loop until TmpW > 256
loadadr Wave(1),Z 'ldi r31,$01 ldi r30,$00
'
ldi r29,$00 'clear accumulator
ldi r28,$00
lds r24,{Fincr+0} 'LSB passa incremento frequenza
lds r25,{Fincr+1} 'usa 24 dei 32 bit
lds r26,{Fincr+2} 'MSB
Gen:
add r28, r24 ' 1 cycle
adc r29, r25 ' 1 cycle
adc r30, r26 ' 1 cycle
ld r0, Z ' 2 cycle
! Out PortD,R0 ' 1 cycle
sbic PinC,3 ' 1 check tasto Run/stop
rjmp Gen ' 2 cycles totale 9 cicli
PortD = 127 ' lascia uscita ad 1/2 scala
call Ril_Run 'rilascio run/st
goto Rientro
'
'End
'
'
'visualizza parametri attuali
Sub Mostra
cls
delay
lcd "Func. "
if Shape = 0 then
lcd "Sine"
elseif Shape = 1 then
lcd "Square"
elseif Shape = 2 then
lcd "Triangle"
elseif Shape = 3 then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -