⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gfun2.bas

📁 dds signal gerenrator with atmega8
💻 BAS
📖 第 1 页 / 共 2 页
字号:
'              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 + -