<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[forum.rcl-radio.ru &mdash; Генератор AD9833+частотомер 6.5 МГц.]]></title>
		<link>http://forum.rcl-radio.ru/viewtopic.php?id=490</link>
		<atom:link href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=490&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Генератор AD9833+частотомер 6.5 МГц.».]]></description>
		<lastBuildDate>Fri, 07 Jun 2024 13:58:57 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=10485#p10485</link>
			<description><![CDATA[<p>Коллеги привет!<br />Поделитесь схемкой усилителя для этого генератора.<br />Питание будет +/- 5В.</p>]]></description>
			<author><![CDATA[null@example.com (Karl2233)]]></author>
			<pubDate>Fri, 07 Jun 2024 13:58:57 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=10485#p10485</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=10374#p10374</link>
			<description><![CDATA[<p>Последний вариант заработал, тоже не переключался в синус и треугольник. <br />Спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (prokop72)]]></author>
			<pubDate>Fri, 10 May 2024 15:48:08 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=10374#p10374</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9823#p9823</link>
			<description><![CDATA[<p>Этот вариант заработал, но при режиме синус на выходе всего лишь 200 мВ. Соответственно этого напряжения не хватает для чувствительности частотомера. При режиме меандр на выходе 2,5 В и частотомер показывает правильные значения. Генератор вырабатывает частоту вплоть до 8 мГц , но уже напряжение на выходе всего 20 мВ в режиме синус. Настройку частоты кварца я использовал 24900000 Гц. Показывает все чётко.<br />Спасибо за Ваш труд !!!</p>]]></description>
			<author><![CDATA[null@example.com (vadim_ilin)]]></author>
			<pubDate>Wed, 20 Mar 2024 20:03:22 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9823#p9823</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9793#p9793</link>
			<description><![CDATA[<div class="codebox"><pre><code>//  ATMEGA328 16 MHz
//  PD5 frequency input
 
//AD9833
#define CS    PC0
#define MCLK  PC1
#define DATA  PC2
// ENCODER
#define DT    PB0
#define CLK   PB1
#define SW    PB2
// BUTTON
#define G_ON_OFF PB3
#define FORM     PB4
 
 
#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
#include &lt;Wire_low.h&gt;         // http://forum.rcl-radio.ru/viewtopic.php?pid=5521#p5521
#include &lt;Lcd1602_i2c_low.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2022/03/Lcd1602_i2c_low.zip
  Lcd1602_i2c_low lcd(0x27);// адрес I2C
 
volatile uint8_t _prevValueAB = 0;    
volatile uint8_t _currValueAB = 0;
volatile int16_t newPosition = 0;
int position = -999;
int form;
int timer2,times;
volatile byte x;
unsigned long f;
bool w=1,on;
long fg;
long b,h_bit,l_bit;
float k = 0.995265; // устраним погрешность кварца
const long f25 = 25000000;// частота кварца, если нет эталонного частотомера установите частоту 25000000 Гц
int a[7],i;
 
 
int main(){ 
  PCICR |= (1 &lt;&lt; PCIE0);
  PCMSK0 |= (1 &lt;&lt; PCINT0)|(1 &lt;&lt; PCINT1); 
  PORTB |= (1 &lt;&lt; PB3)|(1 &lt;&lt; PB4);
  PORTD |= (1&lt;&lt;PD5); // подтягивающий резистор на PD5 (вход T1)
  DDRC |=(1&lt;&lt;CS)|(1&lt;&lt;MCLK)|(1&lt;&lt;DATA);
  PORTC |=(1&lt;MCLK)|(1&lt;&lt;CS)|(1&lt;&lt;DATA);
  _delay_ms(500);
  ad_AD9833();
    cli();
  // TIMER 1  
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
  TIMSK1 |= (1 &lt;&lt; TOIE1); // бит TOIE1 в регистре TIMSK1 взывает прерывание когда таймер переполняется
  // TIMER 2
  TCCR2A = 0;   
  TCCR2B = 0;   
  OCR2A = 155; // 100 Hz 
  TCCR2A |= (1 &lt;&lt; WGM21); 
  TCCR2B |= (1 &lt;&lt; CS22) | (1 &lt;&lt; CS21) | (1 &lt;&lt; CS20); 
  TIMSK2 |= (1 &lt;&lt; OCIE2A); 
    sei(); 
  wire_set(16000000,100000); // тактовая частота контроллера, частота шины I2C
  lcd.setInit();
  lcd.Clear(); // очистка экрана
  lcd.led(1);  // включение и отключение подсветки экрана
  a[0] = EEPROM_read(0);a[1] = EEPROM_read(1);a[2] = EEPROM_read(2);a[3] = EEPROM_read(3);a[4] = EEPROM_read(4);a[5] = EEPROM_read(5);a[6] = EEPROM_read(6);
  form = EEPROM_read(7);
 
while(1){ 
  if(((PINB &gt;&gt; SW) &amp; 1)==0){i++;if(on==1){w=1;}on=0;if(i&gt;6){i=0;};_delay_ms(300);}
  if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==0){on=1;w=1;i=100;_delay_ms(300);}
  if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==1){on=0;w=1;fg=0;i=0;_delay_ms(300);}
  if(((PINB &gt;&gt; FORM) &amp; 1)==0){form++;if(form&gt;2){form=0;}w=1;fg=0;i=0;_delay_ms(300);}
///////////////////////////////////////////////////
  if(newPosition != position){position = newPosition;
    a[i] = a[i]+newPosition;newPosition=0;
    }  
///////////////////////////////////////////////////  
  if(on==0){fg=0;lcd.Curs(1,11);lcd.PrintString(&quot; &quot;);}
  if(on==1){lcd.Curs(1,11);lcd.PrintString(&quot;*&quot;);}
  if(w==1){w=0;
  EEPROM_write(0,a[0]);EEPROM_write(1,a[1]);EEPROM_write(2,a[2]);EEPROM_write(3,a[3]);EEPROM_write(4,a[4]);EEPROM_write(5,a[5]);EEPROM_write(6,a[6]);
  EEPROM_write(7,form);
  ad_AD9833();
  lcd.Curs(1,13);
    switch(form){
  case 0: lcd.PrintString(&quot;DAC&quot;);WriteAD9833(0x2028);break;
  case 1: lcd.PrintString(&quot;SIN&quot;);WriteAD9833(0x2000);break;
  case 2: lcd.PrintString(&quot;TRI&quot;);WriteAD9833(0x2002);break;
  }
  }
/////////////////////////////////////////////////// 
  lcd.Curs(0,0);lcd.PrintString(&quot;F &quot;);
  lcd.PrintInt(f/1000000);lcd.PrintString(&quot;.&quot;);
  lcd.PrintInt(f/100000%10);
  lcd.PrintInt(f/10000%10);
  lcd.PrintInt(f/1000%10);lcd.PrintString(&quot;.&quot;);
  lcd.PrintInt(f/100%10);
  lcd.PrintInt(f/10%10);
  lcd.PrintInt(f%10);  
  lcd.PrintString(&quot;  Hz &quot;);
///////////////////////////////////////////////////  
  if(a[i]&lt;0){a[i]=0;}if(a[i]&gt;9){a[i]=9;}
  lcd.Curs(1,0);lcd.PrintString(&quot;G &quot;);
  lcd.Curs(1,2);if(i==0){if(timer2-times&lt;50){lcd.PrintInt(a[0]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[0]);}
  lcd.Curs(1,3);lcd.PrintString(&quot;.&quot;);
  lcd.Curs(1,4);if(i==1){if(timer2-times&lt;50){lcd.PrintInt(a[1]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[1]);}
  lcd.Curs(1,5);if(i==2){if(timer2-times&lt;50){lcd.PrintInt(a[2]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[2]);}
  lcd.Curs(1,6);if(i==3){if(timer2-times&lt;50){lcd.PrintInt(a[3]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[3]);}
  lcd.Curs(1,7);lcd.PrintString(&quot;.&quot;);
  lcd.Curs(1,8);if(i==4){if(timer2-times&lt;50){lcd.PrintInt(a[4]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[4]);}
  lcd.Curs(1,9);if(i==5){if(timer2-times&lt;50){lcd.PrintInt(a[5]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[5]);}
  lcd.Curs(1,10);if(i==6){if(timer2-times&lt;50){lcd.PrintInt(a[6]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[6]);}
  fg=a[0]*pow(10,6)+a[1]*pow(10,5)+a[2]*pow(10,4)+a[3]*pow(10,3)+a[4]*pow(10,2)+a[5]*pow(10,1)+a[6];
 
 
}}// end main/while
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1
ISR (TIMER2_COMPA_vect){
     timer2++;
     if(timer2==1){
     x = 0;TCNT1 = 0; 
     TCCR1B |= (1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);}
     if(timer2==101){
     TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);
     f = ((x*65535) + TCNT1);timer2=0;}
}  
 
void WriteAD9833(int data){        // SPI
  PORTC |=(1&lt;&lt;MCLK);PORTC &amp;=~(1&lt;&lt;CS);
     for(int i = 15; i &gt;= 0; i--){
        PORTC |=(1&lt;&lt;MCLK);
       if(((data&gt;&gt;i)&amp;0x01)==1){PORTC |=(1&lt;&lt;DATA);}else{PORTC &amp;=~(1&lt;&lt;DATA);}
        PORTC &amp;=~(1&lt;&lt;MCLK);_delay_ms(1);}
        PORTC |=(1&lt;&lt;CS);
  }
 
void ad_AD9833(){
  b = (fg*pow(2,28)/f25)*k;
  if(b&lt;16383){l_bit = b + 0x4000 ;h_bit = 0x4000;}
  else{h_bit = (b&gt;&gt;14) + 0x4000;l_bit = b - (h_bit&lt;&lt;14) + 0x4000;}
  WriteAD9833(0x2100);// 0010 0001 0000 0000 - Reset + DB28
  WriteAD9833(l_bit); // 0100 0000 0000 0000 - Freq0 LSB 
  WriteAD9833(h_bit); // 0100 0000 0000 0000 - Freq0 MSB 
  WriteAD9833(0xC000);// 1100 0000 0000 0000 - Phase0 
  WriteAD9833(0x2028);// 0010 0000 0000 0000 - Exit Reset
  } 
 
ISR(PCINT0_vect){ 
  bool pinA = ((PINB &gt;&gt; DT) &amp; 1);
  bool pinB = ((PINB &gt;&gt; CLK) &amp; 1);
   _currValueAB  = (pinA &lt;&lt; 1) | pinB;
   switch(_prevValueAB | _currValueAB){
    case 0b0001: newPosition++;break;
    case 0b0100: newPosition--;break;
  }
  _prevValueAB = _currValueAB &lt;&lt; 2;     
  }   
 
unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR &amp; (1&lt;&lt;EEPE));  // проверка готовности EEPROM 
    EEARH = ((uiAddress &amp; 0xF0) &lt;&lt; 2); // регистр адреса H
    EEARL = uiAddress &amp; 0x0F; // регистр адреса L
    EECR |= (1&lt;&lt;EERE);// чтение EEPROM
    return EEDR; // вывод значения
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR &amp; (1&lt;&lt;EEPE)); // проверка готовности EEPROM 
    EEARH = ((uiAddress &amp; 0xF0) &lt;&lt; 2); // регистр адреса H
    EEARL = uiAddress &amp; 0x0F; // регистр адреса L
    EEDR = ucData; // регистр данных 
    EECR |= (1&lt;&lt;EEMPE);// Разрешение записи в EEPROM
    EECR |= (1&lt;&lt;EEPE); // Запись в EEPROM
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Wed, 20 Mar 2024 03:25:58 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9793#p9793</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9788#p9788</link>
			<description><![CDATA[<p>К сожалению ничего не поменялось, все 3 формы показывают прямоугольный сигнал.</p>]]></description>
			<author><![CDATA[null@example.com (vadim_ilin)]]></author>
			<pubDate>Tue, 19 Mar 2024 17:48:44 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9788#p9788</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9745#p9745</link>
			<description><![CDATA[<p>Хорошо, завтра попробую!</p>]]></description>
			<author><![CDATA[null@example.com (vadim_ilin)]]></author>
			<pubDate>Mon, 18 Mar 2024 19:04:22 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9745#p9745</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9676#p9676</link>
			<description><![CDATA[<p>Попробуйте этот скетч, если не заработает буду собирать схему для тестирования</p><div class="codebox"><pre><code>//  ATMEGA328 16 MHz
//  PD5 frequency input
 
//AD9833
#define CS    PC0
#define MCLK  PC1
#define DATA  PC2
// ENCODER
#define DT    PB0
#define CLK   PB1
#define SW    PB2
// BUTTON
#define G_ON_OFF PB3
#define FORM     PB4
 
 
#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
#include &lt;Wire_low.h&gt;         // http://forum.rcl-radio.ru/viewtopic.php?pid=5521#p5521
#include &lt;Lcd1602_i2c_low.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2022/03/Lcd1602_i2c_low.zip
  Lcd1602_i2c_low lcd(0x27);// адрес I2C
 
volatile uint8_t _prevValueAB = 0;    
volatile uint8_t _currValueAB = 0;
volatile int16_t newPosition = 0;
int position = -999;
int form;
int timer2,times;
volatile byte x;
unsigned long f;
bool w=1,on;
long fg;
long b,h_bit,l_bit;
float k = 0.995265; // устраним погрешность кварца
const long f25 = 25000000;// частота кварца, если нет эталонного частотомера установите частоту 25000000 Гц
int a[7],i;
 
 
int main(){ 
  PCICR |= (1 &lt;&lt; PCIE0);
  PCMSK0 |= (1 &lt;&lt; PCINT0)|(1 &lt;&lt; PCINT1); 
  PORTB |= (1 &lt;&lt; PB3)|(1 &lt;&lt; PB4);
  PORTD |= (1&lt;&lt;PD5); // подтягивающий резистор на PD5 (вход T1)
  DDRC |=(1&lt;&lt;CS)|(1&lt;&lt;MCLK)|(1&lt;&lt;DATA);
  PORTC |=(1&lt;MCLK)|(1&lt;&lt;CS)|(1&lt;&lt;DATA);
  _delay_ms(500);
  ad_AD9833();
    cli();
  // TIMER 1  
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
  TIMSK1 |= (1 &lt;&lt; TOIE1); // бит TOIE1 в регистре TIMSK1 взывает прерывание когда таймер переполняется
  // TIMER 2
  TCCR2A = 0;   
  TCCR2B = 0;   
  OCR2A = 155; // 100 Hz 
  TCCR2A |= (1 &lt;&lt; WGM21); 
  TCCR2B |= (1 &lt;&lt; CS22) | (1 &lt;&lt; CS21) | (1 &lt;&lt; CS20); 
  TIMSK2 |= (1 &lt;&lt; OCIE2A); 
    sei(); 
  wire_set(16000000,100000); // тактовая частота контроллера, частота шины I2C
  lcd.setInit();
  lcd.Clear(); // очистка экрана
  lcd.led(1);  // включение и отключение подсветки экрана
  a[0] = EEPROM_read(0);a[1] = EEPROM_read(1);a[2] = EEPROM_read(2);a[3] = EEPROM_read(3);a[4] = EEPROM_read(4);a[5] = EEPROM_read(5);a[6] = EEPROM_read(6);
  form = EEPROM_read(7);
 
while(1){ 
  if(((PINB &gt;&gt; SW) &amp; 1)==0){i++;if(on==1){w=1;}on=0;if(i&gt;6){i=0;};_delay_ms(300);}
  if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==0){on=1;w=1;i=100;_delay_ms(300);}
  if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==1){on=0;w=1;fg=0;i=0;_delay_ms(300);}
  if(((PINB &gt;&gt; FORM) &amp; 1)==0){form++;if(form&gt;2){form=0;}w=1;fg=0;i=0;_delay_ms(300);}
///////////////////////////////////////////////////
  if(newPosition != position){position = newPosition;
    a[i] = a[i]+newPosition;newPosition=0;
    }  
///////////////////////////////////////////////////  
  if(on==0){fg=0;lcd.Curs(1,11);lcd.PrintString(&quot; &quot;);}
  if(on==1){lcd.Curs(1,11);lcd.PrintString(&quot;*&quot;);}
  if(w==1){w=0;
  lcd.Curs(1,13);
    switch(form){
  case 0: lcd.PrintString(&quot;DAC&quot;);WriteAD9833(0x2028);break;
  case 1: lcd.PrintString(&quot;SIN&quot;);WriteAD9833(0x2000);break;
  case 2: lcd.PrintString(&quot;TRI&quot;);WriteAD9833(0x2002);break;
  }
  _delay_ms(200);
  EEPROM_write(0,a[0]);EEPROM_write(1,a[1]);EEPROM_write(2,a[2]);EEPROM_write(3,a[3]);EEPROM_write(4,a[4]);EEPROM_write(5,a[5]);EEPROM_write(6,a[6]);
  EEPROM_write(7,form);
  ad_AD9833();}
/////////////////////////////////////////////////// 
  lcd.Curs(0,0);lcd.PrintString(&quot;F &quot;);
  lcd.PrintInt(f/1000000);lcd.PrintString(&quot;.&quot;);
  lcd.PrintInt(f/100000%10);
  lcd.PrintInt(f/10000%10);
  lcd.PrintInt(f/1000%10);lcd.PrintString(&quot;.&quot;);
  lcd.PrintInt(f/100%10);
  lcd.PrintInt(f/10%10);
  lcd.PrintInt(f%10);  
  lcd.PrintString(&quot;  Hz &quot;);
///////////////////////////////////////////////////  
  if(a[i]&lt;0){a[i]=0;}if(a[i]&gt;9){a[i]=9;}
  lcd.Curs(1,0);lcd.PrintString(&quot;G &quot;);
  lcd.Curs(1,2);if(i==0){if(timer2-times&lt;50){lcd.PrintInt(a[0]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[0]);}
  lcd.Curs(1,3);lcd.PrintString(&quot;.&quot;);
  lcd.Curs(1,4);if(i==1){if(timer2-times&lt;50){lcd.PrintInt(a[1]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[1]);}
  lcd.Curs(1,5);if(i==2){if(timer2-times&lt;50){lcd.PrintInt(a[2]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[2]);}
  lcd.Curs(1,6);if(i==3){if(timer2-times&lt;50){lcd.PrintInt(a[3]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[3]);}
  lcd.Curs(1,7);lcd.PrintString(&quot;.&quot;);
  lcd.Curs(1,8);if(i==4){if(timer2-times&lt;50){lcd.PrintInt(a[4]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[4]);}
  lcd.Curs(1,9);if(i==5){if(timer2-times&lt;50){lcd.PrintInt(a[5]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[5]);}
  lcd.Curs(1,10);if(i==6){if(timer2-times&lt;50){lcd.PrintInt(a[6]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[6]);}
  fg=a[0]*pow(10,6)+a[1]*pow(10,5)+a[2]*pow(10,4)+a[3]*pow(10,3)+a[4]*pow(10,2)+a[5]*pow(10,1)+a[6];
 
 
}}// end main/while
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1
ISR (TIMER2_COMPA_vect){
     timer2++;
     if(timer2==1){
     x = 0;TCNT1 = 0; 
     TCCR1B |= (1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);}
     if(timer2==101){
     TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);
     f = ((x*65535) + TCNT1);timer2=0;}
}  
 
void WriteAD9833(int data){        // SPI
  PORTC |=(1&lt;&lt;MCLK);PORTC &amp;=~(1&lt;&lt;CS);
     for(int i = 15; i &gt;= 0; i--){
        PORTC |=(1&lt;&lt;MCLK);
       if(((data&gt;&gt;i)&amp;0x01)==1){PORTC |=(1&lt;&lt;DATA);}else{PORTC &amp;=~(1&lt;&lt;DATA);}
        PORTC &amp;=~(1&lt;&lt;MCLK);_delay_ms(1);}
        PORTC |=(1&lt;&lt;CS);
  }
 
void ad_AD9833(){
  b = (fg*pow(2,28)/f25)*k;
  if(b&lt;16383){l_bit = b + 0x4000 ;h_bit = 0x4000;}
  else{h_bit = (b&gt;&gt;14) + 0x4000;l_bit = b - (h_bit&lt;&lt;14) + 0x4000;}
  WriteAD9833(0x2100);// 0010 0001 0000 0000 - Reset + DB28
  WriteAD9833(l_bit); // 0100 0000 0000 0000 - Freq0 LSB 
  WriteAD9833(h_bit); // 0100 0000 0000 0000 - Freq0 MSB 
  WriteAD9833(0xC000);// 1100 0000 0000 0000 - Phase0 
  WriteAD9833(0x2028);// 0010 0000 0000 0000 - Exit Reset
  } 
 
ISR(PCINT0_vect){ 
  bool pinA = ((PINB &gt;&gt; DT) &amp; 1);
  bool pinB = ((PINB &gt;&gt; CLK) &amp; 1);
   _currValueAB  = (pinA &lt;&lt; 1) | pinB;
   switch(_prevValueAB | _currValueAB){
    case 0b0001: newPosition++;break;
    case 0b0100: newPosition--;break;
  }
  _prevValueAB = _currValueAB &lt;&lt; 2;     
  }   
 
unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR &amp; (1&lt;&lt;EEPE));  // проверка готовности EEPROM 
    EEARH = ((uiAddress &amp; 0xF0) &lt;&lt; 2); // регистр адреса H
    EEARL = uiAddress &amp; 0x0F; // регистр адреса L
    EECR |= (1&lt;&lt;EERE);// чтение EEPROM
    return EEDR; // вывод значения
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR &amp; (1&lt;&lt;EEPE)); // проверка готовности EEPROM 
    EEARH = ((uiAddress &amp; 0xF0) &lt;&lt; 2); // регистр адреса H
    EEARL = uiAddress &amp; 0x0F; // регистр адреса L
    EEDR = ucData; // регистр данных 
    EECR |= (1&lt;&lt;EEMPE);// Разрешение записи в EEPROM
    EECR |= (1&lt;&lt;EEPE); // Запись в EEPROM
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Mon, 18 Mar 2024 12:09:22 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9676#p9676</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9671#p9671</link>
			<description><![CDATA[<div class="codebox"><pre><code>//  ATMEGA328 16 MHz
//  PD5 frequency input
 
//AD9833
#define CS    PC0
#define MCLK  PC1
#define DATA  PC2
// ENCODER
#define DT    PB0
#define CLK   PB1
#define SW    PB2
// BUTTON
#define G_ON_OFF PB3
#define FORM     PB4
 
 
#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
#include &lt;Wire_low.h&gt;         // http://forum.rcl-radio.ru/viewtopic.php?pid=5521#p5521
#include &lt;Lcd1602_i2c_low.h&gt;  // http://rcl-radio.ru/wp-content/uploads/2022/03/Lcd1602_i2c_low.zip
  Lcd1602_i2c_low lcd(0x27);// адрес I2C
 
volatile uint8_t _prevValueAB = 0;    
volatile uint8_t _currValueAB = 0;
volatile int16_t newPosition = 0;
int position = -999;
int form;
int timer2,times;
volatile byte x;
unsigned long f;
bool w=1,on;
long fg;
long b,h_bit,l_bit;
float k = 0.995265; // устраним погрешность кварца
const long f25 = 25000000;// частота кварца, если нет эталонного частотомера установите частоту 25000000 Гц
int a[7],i;
 
 
int main(){ 
  PCICR |= (1 &lt;&lt; PCIE0);
  PCMSK0 |= (1 &lt;&lt; PCINT0)|(1 &lt;&lt; PCINT1); 
  PORTB |= (1 &lt;&lt; PB3)|(1 &lt;&lt; PB4);
  PORTD |= (1&lt;&lt;PD5); // подтягивающий резистор на PD5 (вход T1)
  DDRC |=(1&lt;&lt;CS)|(1&lt;&lt;MCLK)|(1&lt;&lt;DATA);
  PORTC |=(1&lt;MCLK)|(1&lt;&lt;CS)|(1&lt;&lt;DATA);
  _delay_ms(500);
  ad_AD9833();
    cli();
  // TIMER 1  
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
  TIMSK1 |= (1 &lt;&lt; TOIE1); // бит TOIE1 в регистре TIMSK1 взывает прерывание когда таймер переполняется
  // TIMER 2
  TCCR2A = 0;   
  TCCR2B = 0;   
  OCR2A = 155; // 100 Hz 
  TCCR2A |= (1 &lt;&lt; WGM21); 
  TCCR2B |= (1 &lt;&lt; CS22) | (1 &lt;&lt; CS21) | (1 &lt;&lt; CS20); 
  TIMSK2 |= (1 &lt;&lt; OCIE2A); 
    sei(); 
  wire_set(16000000,100000); // тактовая частота контроллера, частота шины I2C
  lcd.setInit();
  lcd.Clear(); // очистка экрана
  lcd.led(1);  // включение и отключение подсветки экрана
  a[0] = EEPROM_read(0);a[1] = EEPROM_read(1);a[2] = EEPROM_read(2);a[3] = EEPROM_read(3);a[4] = EEPROM_read(4);a[5] = EEPROM_read(5);a[6] = EEPROM_read(6);
  form = EEPROM_read(7);
 
while(1){ 
  if(((PINB &gt;&gt; SW) &amp; 1)==0){i++;if(on==1){w=1;}on=0;if(i&gt;6){i=0;};_delay_ms(300);}
  if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==0){on=1;w=1;i=100;_delay_ms(300);}
  if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==1){on=0;w=1;fg=0;i=0;_delay_ms(300);}
  if(((PINB &gt;&gt; FORM) &amp; 1)==0){form++;if(form&gt;2){form=0;}w=1;fg=0;i=0;_delay_ms(300);}
///////////////////////////////////////////////////
  if(newPosition != position){position = newPosition;
    a[i] = a[i]+newPosition;newPosition=0;
    }  
///////////////////////////////////////////////////  
  if(on==0){fg=0;lcd.Curs(1,11);lcd.PrintString(&quot; &quot;);}
  if(on==1){lcd.Curs(1,11);lcd.PrintString(&quot;*&quot;);}
  if(w==1){w=0;
  lcd.Curs(1,13);
    switch(form){
  case 0: lcd.PrintString(&quot;DAC&quot;);WriteAD9833(0x2028);break;
  case 1: lcd.PrintString(&quot;SIN&quot;);WriteAD9833(0x2000);break;
  case 2: lcd.PrintString(&quot;TRI&quot;);WriteAD9833(0x2002);break;
  }
  EEPROM_write(0,a[0]);EEPROM_write(1,a[1]);EEPROM_write(2,a[2]);EEPROM_write(3,a[3]);EEPROM_write(4,a[4]);EEPROM_write(5,a[5]);EEPROM_write(6,a[6]);
  EEPROM_write(7,form);
  ad_AD9833();}
/////////////////////////////////////////////////// 
  lcd.Curs(0,0);lcd.PrintString(&quot;F &quot;);
  lcd.PrintInt(f/1000000);lcd.PrintString(&quot;.&quot;);
  lcd.PrintInt(f/100000%10);
  lcd.PrintInt(f/10000%10);
  lcd.PrintInt(f/1000%10);lcd.PrintString(&quot;.&quot;);
  lcd.PrintInt(f/100%10);
  lcd.PrintInt(f/10%10);
  lcd.PrintInt(f%10);  
  lcd.PrintString(&quot;  Hz &quot;);
///////////////////////////////////////////////////  
  if(a[i]&lt;0){a[i]=0;}if(a[i]&gt;9){a[i]=9;}
  lcd.Curs(1,0);lcd.PrintString(&quot;G &quot;);
  lcd.Curs(1,2);if(i==0){if(timer2-times&lt;50){lcd.PrintInt(a[0]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[0]);}
  lcd.Curs(1,3);lcd.PrintString(&quot;.&quot;);
  lcd.Curs(1,4);if(i==1){if(timer2-times&lt;50){lcd.PrintInt(a[1]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[1]);}
  lcd.Curs(1,5);if(i==2){if(timer2-times&lt;50){lcd.PrintInt(a[2]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[2]);}
  lcd.Curs(1,6);if(i==3){if(timer2-times&lt;50){lcd.PrintInt(a[3]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[3]);}
  lcd.Curs(1,7);lcd.PrintString(&quot;.&quot;);
  lcd.Curs(1,8);if(i==4){if(timer2-times&lt;50){lcd.PrintInt(a[4]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[4]);}
  lcd.Curs(1,9);if(i==5){if(timer2-times&lt;50){lcd.PrintInt(a[5]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[5]);}
  lcd.Curs(1,10);if(i==6){if(timer2-times&lt;50){lcd.PrintInt(a[6]);}if(timer2-times&gt;=50){lcd.PrintString(&quot; &quot;);}if(timer2-times&gt;100){times=timer2;}}else{lcd.PrintInt(a[6]);}
  fg=a[0]*pow(10,6)+a[1]*pow(10,5)+a[2]*pow(10,4)+a[3]*pow(10,3)+a[4]*pow(10,2)+a[5]*pow(10,1)+a[6];
 
 
}}// end main/while
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1
ISR (TIMER2_COMPA_vect){
     timer2++;
     if(timer2==1){
     x = 0;TCNT1 = 0; 
     TCCR1B |= (1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);}
     if(timer2==101){
     TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);
     f = ((x*65535) + TCNT1);timer2=0;}
}  
 
void WriteAD9833(int data){        // SPI
  PORTC |=(1&lt;&lt;MCLK);PORTC &amp;=~(1&lt;&lt;CS);
     for(int i = 15; i &gt;= 0; i--){
        PORTC |=(1&lt;&lt;MCLK);
       if(((data&gt;&gt;i)&amp;0x01)==1){PORTC |=(1&lt;&lt;DATA);}else{PORTC &amp;=~(1&lt;&lt;DATA);}
        PORTC &amp;=~(1&lt;&lt;MCLK);_delay_ms(1);}
        PORTC |=(1&lt;&lt;CS);
  }
 
void ad_AD9833(){
  b = (fg*pow(2,28)/f25)*k;
  if(b&lt;16383){l_bit = b + 0x4000 ;h_bit = 0x4000;}
  else{h_bit = (b&gt;&gt;14) + 0x4000;l_bit = b - (h_bit&lt;&lt;14) + 0x4000;}
  WriteAD9833(0x2100);// 0010 0001 0000 0000 - Reset + DB28
  WriteAD9833(l_bit); // 0100 0000 0000 0000 - Freq0 LSB 
  WriteAD9833(h_bit); // 0100 0000 0000 0000 - Freq0 MSB 
  WriteAD9833(0xC000);// 1100 0000 0000 0000 - Phase0 
  WriteAD9833(0x2028);// 0010 0000 0000 0000 - Exit Reset
  } 
 
ISR(PCINT0_vect){ 
  bool pinA = ((PINB &gt;&gt; DT) &amp; 1);
  bool pinB = ((PINB &gt;&gt; CLK) &amp; 1);
   _currValueAB  = (pinA &lt;&lt; 1) | pinB;
   switch(_prevValueAB | _currValueAB){
    case 0b0001: newPosition++;break;
    case 0b0100: newPosition--;break;
  }
  _prevValueAB = _currValueAB &lt;&lt; 2;     
  }   
 
unsigned char EEPROM_read(unsigned int uiAddress){
  while(EECR &amp; (1&lt;&lt;EEPE));  // проверка готовности EEPROM 
    EEARH = ((uiAddress &amp; 0xF0) &lt;&lt; 2); // регистр адреса H
    EEARL = uiAddress &amp; 0x0F; // регистр адреса L
    EECR |= (1&lt;&lt;EERE);// чтение EEPROM
    return EEDR; // вывод значения
}
 
void EEPROM_write(unsigned int uiAddress, unsigned char ucData){
  while(EECR &amp; (1&lt;&lt;EEPE)); // проверка готовности EEPROM 
    EEARH = ((uiAddress &amp; 0xF0) &lt;&lt; 2); // регистр адреса H
    EEARL = uiAddress &amp; 0x0F; // регистр адреса L
    EEDR = ucData; // регистр данных 
    EECR |= (1&lt;&lt;EEMPE);// Разрешение записи в EEPROM
    EECR |= (1&lt;&lt;EEPE); // Запись в EEPROM
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (vadim_ilin)]]></author>
			<pubDate>Sun, 17 Mar 2024 19:50:36 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9671#p9671</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9667#p9667</link>
			<description><![CDATA[<p>Опубликуйте скетч который используете</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Sun, 17 Mar 2024 02:43:11 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9667#p9667</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9666#p9666</link>
			<description><![CDATA[<p>Это как-то можно решить?</p>]]></description>
			<author><![CDATA[null@example.com (vadim_ilin)]]></author>
			<pubDate>Sat, 16 Mar 2024 18:57:02 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9666#p9666</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=9665#p9665</link>
			<description><![CDATA[<p>Вечер добрый! При переключении типа волны, выдаёт только прямоугольный импульс. Синус и пилу не выдаёт, частота при этом регулируется. Что посоветуете ?</p>]]></description>
			<author><![CDATA[null@example.com (vadim_ilin)]]></author>
			<pubDate>Fri, 15 Mar 2024 17:22:58 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=9665#p9665</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=7819#p7819</link>
			<description><![CDATA[<p>Уважаемый&nbsp; taban. Не могли бы Вы выложить схему соединений блоков. Хочу попробовать ваш скетч и схему. Хотелось бы запустить частотомер</p>]]></description>
			<author><![CDATA[null@example.com (alex1961)]]></author>
			<pubDate>Sun, 14 May 2023 17:25:03 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=7819#p7819</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=7817#p7817</link>
			<description><![CDATA[<p>Схема и скетч от проекта генератор + частотомер. Работает только частотомер. Генератор выдает только меандр вместо пилы и синусоиды. Меандр выдает хорошо и частота меняется. Переключение на синус ничего не дает. Выдает только меандр. Пришлось перепаять схему на проект&nbsp; генератор без частотомера. Слил скетч. Все заработало. Выдает и пилу и синус. Ардуино Nano/ Подскажите в чем проблема? Да, схема работает и без третьей кнопки CLEAR, она по сути и не нужна.</p>]]></description>
			<author><![CDATA[null@example.com (alex1961)]]></author>
			<pubDate>Sun, 14 May 2023 15:21:55 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=7817#p7817</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=7706#p7706</link>
			<description><![CDATA[<p>Доброго времени суток.<br />На энкодере оказалось что один из подтягивающих резисторов, а именно резистор на кнопку сказал мяу..., подправил, подпаял и все завелось как надо. Спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (adsms)]]></author>
			<pubDate>Mon, 03 Apr 2023 14:35:40 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=7706#p7706</guid>
		</item>
		<item>
			<title><![CDATA[Re: Генератор AD9833+частотомер 6.5 МГц.]]></title>
			<link>http://forum.rcl-radio.ru/viewtopic.php?pid=7705#p7705</link>
			<description><![CDATA[<p>72 #&nbsp; &nbsp; if(((PINB &gt;&gt; SW) &amp; 1)==0){i++;if(on==1){w=1;}on=0;if(i&gt;6){i=0;};_delay_ms(100);}</p><p>Если нажата кнопка энкодера, то начат перебор изменения разрядов установленной частоты, при это генерация выключается (n=0;)</p><p> 73 #&nbsp; &nbsp; if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==0){on=1;w=1;i=100;_delay_ms(300);}<br />&nbsp; 74 #&nbsp; &nbsp; if(((PINB &gt;&gt; G_ON_OFF) &amp; 1)==0 &amp;&amp; on==1){on=0;w=1;fg=0;i=0;_delay_ms(300);}&nbsp; // on=0</p><br /><p>Кнопка вкл/отк генерацию</p><p>82 #&nbsp; &nbsp; if(on==1){lcd.Curs(1,11);lcd.PrintString(&quot;*&quot;);} </p><p>строка индикации вкл/отк генерации</p><p>проверьте кнопку энкодера, а так же наличие 3-х подтягивающих резисторов на платке энкодера по 10кОм</p>]]></description>
			<author><![CDATA[null@example.com (liman324)]]></author>
			<pubDate>Mon, 03 Apr 2023 00:25:37 +0000</pubDate>
			<guid>http://forum.rcl-radio.ru/viewtopic.php?pid=7705#p7705</guid>
		</item>
	</channel>
</rss>
