После изготовления частотомера на PIC 16F628A появилась потребность в генераторе частот. Первый на микросхеме К176ИЕ12, в этой схеме можно получить шесть разных частот, в том числе стабильную часовую 32768Гц
Архив печатной платы 176ie12.rar
Второй на МК ATTiny2313 выдаёт 30 фиксированных частот от 0.1Гц до 4мГц
Исходный код программы;
|
Code $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
|
|
FUSE: Программа написана для работы МК от внешнего кварца. После сборки и прошивки контролера генератор начинает работать сразу. Смотрим осциллографом, сигнал 10.000гц и на 4мгц Фото платы
Архив печатной платы generator2313_lay Генератор так же, можно применить для тестирования кварцев, Проверяются все, пробовал от 4 до 24 мгц
Вот например кварц 24 мгц Свойства схемы генератора, делить минимально показания на 2 (на фото 12 мгц, ничего, здесь каждому будет нетрудно вычислить реальный номинал кварца) Да, этот генератор в общем неплохой помощник радиолюбителя! Архив прошивок Генератор частоты на ATTiny2313 Источник;
сайт Микроконтроллеры и Технологии
http://radioparty.ru
|