В сети есть пример такого генератора.
И исходник там имеется ,
Спойлер
Код: Выделить всё
$crystal = 20000000
$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 8
$framesize = 32
Dim F As Byte , F_input As Byte , Clkpr_prescale As Byte
Dim Ocr1a_value As Word , Ocr0a_value As Byte
Dim Clock_prescale As Word , Timer0_prescale As Byte
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Portd = Input
Portd = &HFF
F = 255
Do
F_input = Pind And &H1F 'check switch combination
If F <> F_input Then 'if changed,
F = F_input
Gosub Set_f 'set new frequency
End If
Loop
Set_f:
Stop Timer0
Stop Timer1
Timer0 = 0
Timer1 = 0
Ocr0a_value = Lookup(f , Ocr0a_table)
Ocr1a_value = Lookup(f , Ocr1a_table)
Clock_prescale = Lookup(f , Clock_prescale_table)
Timer0_prescale = Lookup(f , Timer0_prescale_table)
Clkpr_prescale = 0
While Clock_prescale > 1
Shift Clock_prescale , Right
Incr Clkpr_prescale
Wend
Clkpr = &B10000000
Clkpr = Clkpr_prescale
If F < 31 Then 'f <= table_entries #
If Ocr0a_value = 0 Then
Gosub Set_high_f
Else
Gosub Set_low_f
End If
Else
Set Portb.3
End If
Return
Set_high_f: '10MHz-5Hz
Decr Ocr1a_value
Compare1a = Ocr1a_value
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 'start Timer1
Return
Set_low_f: '2Hz-0.001Hz
Decr Ocr0a_value
Ocr0a = Ocr0a_value
If Timer0_prescale = 1 Then
Config Timer0 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 'start Timer0
Else
Config Timer0 = Timer , Prescale = 8 , Compare A = Toggle , Clear Timer = 1 'start Timer0
End If
Decr Ocr1a_value
Compare1a = Ocr1a_value
Config Timer1 = Counter , Edge = Falling , Compare A = Toggle , Clear Timer = 1 'start Timer1
Return
'for $crystal = 20MHz & table_entry 0-19:
'f = 20000000 / (2*clock_prescale*(1+ocr1a_value))
'for $crystal = 20MHz & table_entry 20-30:
'f = 20000000 / (2*clock_prescale*(1+ocr1a_value)) / (2*Timer0_clock_prescale*(1+ocr0a_value))
Clock_prescale_table: '[1-256]
Data 1% '0: 10 MHz
Data 2% '1: 5 MHz
Data 1% '2: 2 MHz
Data 2% '3: 1 MHz
Data 4% '4: 500 kHz
Data 2% '5: 200 kHz
Data 4% '6: 100 kHz
Data 8% '7: 50 kHz
Data 4% '8: 20 kHz
Data 8% '9: 10 kHz
Data 16% '10: 5 kHz
Data 8% '11: 2 kHz
Data 16% '12: 1 kHz
Data 32% '13: 500 Hz
Data 16% '14: 200 Hz
Data 32% '15: 100 Hz
Data 64% '16: 50 Hz
Data 32% '17: 20 Hz
Data 64% '18: 10 Hz
Data 64% '19: 5 Hz
Data 32% '20: 2 Hz
Data 64% '21: 1 Hz
Data 128% '22: 0.5 Hz
Data 64% '23: 0.2 Hz
Data 128% '24: 0.1 Hz
Data 256% '25: 0.05 Hz
Data 128% '26: 0.02 Hz
Data 256% '27: 0.01 Hz
Data 64% '28: 0.005 Hz
Data 256% '29: 0.002 Hz*
Data 256% '30: 0.001 Hz*
Data 256% '31: stop
Ocr1a_table: '[1-65535], Ocr1a = Ocr1a_table_entry - 1
Data 1% '0: 10 MHz
Data 1% '1: 5 MHz
Data 5% '2: 2 MHz
Data 5% '3: 1 MHz
Data 5% '4: 500 kHz
Data 25% '5: 200 kHz
Data 25% '6: 100 kHz
Data 25% '7: 50 kHz
Data 125% '8: 20 kHz
Data 125% '9: 10 kHz
Data 125% '10: 5 kHz
Data 625% '11: 2 kHz
Data 625% '12: 1 kHz
Data 625% '13: 500 Hz
Data 3125% '14: 200 Hz
Data 3125% '15: 100 Hz
Data 3125% '16: 50 Hz
Data 15625% '17: 20 Hz
Data 15625% '18: 10 Hz
Data 31250% '19: 5 Hz
Data 625% '20: 2 Hz
Data 625% '21: 1 Hz
Data 625% '22: 0.5 Hz
Data 3125% '23: 0.2 Hz
Data 3125% '24: 0.1 Hz
Data 3125% '25: 0.05 Hz
Data 15625% '26: 0.02 Hz
Data 15625% '27: 0.01 Hz
Data 15625% '28: 0.005 Hz
Data 5731% '29: 0.002 Hz*
Data 11462% '30: 0.001 Hz*
Data 0% '31: stop
Ocr0a_table: '[1-255, 0=not used], Ocr0a = Ocr0a_table_entry - 1
Data 0 '0: 10 MHz
Data 0 '1: 5 MHz
Data 0 '2: 2 MHz
Data 0 '3: 1 MHz
Data 0 '4: 500 kHz
Data 0 '5: 200 kHz
Data 0 '6: 100 kHz
Data 0 '7: 50 kHz
Data 0 '8: 20 kHz
Data 0 '9: 10 kHz
Data 0 '10: 5 kHz
Data 0 '11: 2 kHz
Data 0 '12: 1 kHz
Data 0 '13: 500 Hz
Data 0 '14: 200 Hz
Data 0 '15: 100 Hz
Data 0 '16: 50 Hz
Data 0 '17: 20 Hz
Data 0 '18: 10 Hz
Data 0 '19: 5 Hz
Data 125 '20: 2 Hz
Data 125 '21: 1 Hz
Data 125 '22: 0.5 Hz
Data 125 '23: 0.2 Hz
Data 125 '24: 0.1 Hz
Data 125 '25: 0.05 Hz
Data 125 '26: 0.02 Hz
Data 125 '27: 0.01 Hz
Data 125 '28: 0.005 Hz
Data 213 '29: 0.002 Hz*
Data 213 '30: 0.001 Hz*
Data 0 '31: stop
Timer0_prescale_table: '[1-8-64-256-1024, 0=not used]
Data 0 '0: 10 MHz
Data 0 '1: 5 MHz
Data 0 '2: 2 MHz
Data 0 '3: 1 MHz
Data 0 '4: 500 kHz
Data 0 '5: 200 kHz
Data 0 '6: 100 kHz
Data 0 '7: 50 kHz
Data 0 '8: 20 kHz
Data 0 '9: 10 kHz
Data 0 '10: 5 kHz
Data 0 '11: 2 kHz
Data 0 '12: 1 kHz
Data 0 '13: 500 Hz
Data 0 '14: 200 Hz
Data 0 '15: 100 Hz
Data 0 '16: 50 Hz
Data 0 '17: 20 Hz
Data 0 '18: 10 Hz
Data 0 '19: 5 Hz
Data 1 '20: 2 Hz
Data 1 '21: 1 Hz
Data 1 '22: 0.5 Hz
Data 1 '23: 0.2 Hz
Data 1 '24: 0.1 Hz
Data 1 '25: 0.05 Hz
Data 1 '26: 0.02 Hz
Data 1 '27: 0.01 Hz
Data 8 '28: 0.005 Hz
Data 8 '29: 0.002 Hz*
Data 8 '30: 0.001 Hz*
Data 0 '31: stop
Пожалуйста помогите реализовать подобное на CodeVisionAVR .


