<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[forum.rcl-radio.ru &mdash; ATTINY2313 частотомер + ARDUINO IDE]]></title>
	<link rel="self" href="http://forum.rcl-radio.ru/extern.php?action=feed&amp;tid=279&amp;type=atom" />
	<updated>2021-03-05T05:35:40Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.rcl-radio.ru/viewtopic.php?id=279</id>
		<entry>
			<title type="html"><![CDATA[ATTINY2313 частотомер + ARDUINO IDE]]></title>
			<link rel="alternate" href="http://forum.rcl-radio.ru/viewtopic.php?pid=3202#p3202" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>// tm1637 PB0 === CLK
// tm1637 PB1 === DIO
 
volatile byte x;
unsigned long f;
int f_ind;
 
void setup() {
  delay(100);
  DDRB  &amp;= ~(1 &lt;&lt; 0)|(1 &lt;&lt; 1);
  DDRD  &amp;= ~(1 &lt;&lt; 5); // весь порт D как вход
  PORTD  |= (1 &lt;&lt; 5); // подтягивающий резистор на PD5 (вход T1)
  
   cli();  
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1B = (1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
  TIMSK |= (1 &lt;&lt; TOIE1); // бит TOIE1 в регистре TIMSK взывает прерывание когда таймер переполняется 
   sei(); 
}
 
void loop() {
  x = 0; // обнулить переменную х
  TCNT1 = 0; // обнулить счетный регистр
  TCCR1B = (1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);
  delay(996);delayMicroseconds(150); // ждем 1 секунду пока таймер считает импульсы
  TCCR1B &amp;= ~(1 &lt;&lt; CS12)|(1 &lt;&lt; CS11)|(1 &lt;&lt; CS10);
  f = ((x*65535) + TCNT1); // подсчет частоты
  if(f&gt;=10000&amp;&amp;f&lt;100000){f_ind = f/10;print_time(f_ind, 2, 7);}
  if(f&gt;=100000&amp;&amp;f&lt;1000000){f_ind = f/100;print_time(f_ind, 1, 7);}
  if(f&gt;=1000000){f_ind = f/1000;print_time(f_ind, 0, 7);}
  if(f&lt;10000){f_ind=f;print_time(f_ind, 3, 7);}
//  print_time(x, 3, 7);
 
}
 
void tm_dec(byte dig){
       for(int i = 0; i &lt; 8; i++) {
         DDRB |= (1 &lt;&lt; 0);del();
       if (dig &amp; 0x01)
         DDRB &amp;= ~(1 &lt;&lt; 1);
       else
         DDRB |= (1 &lt;&lt; 1);del();
         DDRB &amp;= ~(1 &lt;&lt; 0);del();
         dig = dig &gt;&gt; 1;
  }
         DDRB |= (1 &lt;&lt; 0);
         DDRB &amp;= ~(1 &lt;&lt; 1);del();
         DDRB &amp;= ~(1 &lt;&lt; 0);del();
 
       if (((PINB &gt;&gt; 1) &amp; 1) == 0)
         DDRB |= (1 &lt;&lt; 1);del();
         DDRB |= (1 &lt;&lt; 0);del();
  }  
 
void tm_stop(){
         DDRB |= (1 &lt;&lt; 1);del();
         DDRB &amp;= ~(1 &lt;&lt; 0);del();
         DDRB &amp;= ~(1 &lt;&lt; 1);del();
  }  
 
void tm_start(){
         DDRB |= (1 &lt;&lt; 1);del();
  }
 
void print_time(int t, byte pd_t, int br){
        tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
        tm_dec(0x40);tm_stop();tm_start();
 
        int data0 = t / 1000;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
 
      for(byte n = 0; n &lt; 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }
 
      switch(data){  // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        }
 
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
     // if(pd_t == 1){data1+= 0b10000000;}
      switch(pd_t){
        case 1 : data2 = data2+0b10000000;break;
        case 2 : data1 = data1+0b10000000;break;
        case 3 : data0 = data0+0b10000000;break;
        }
      tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  
 
void del(){delayMicroseconds(200);}
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1</code></pre></div>]]></content>
			<author>
				<name><![CDATA[liman324]]></name>
				<uri>http://forum.rcl-radio.ru/profile.php?id=2</uri>
			</author>
			<updated>2021-03-05T05:35:40Z</updated>
			<id>http://forum.rcl-radio.ru/viewtopic.php?pid=3202#p3202</id>
		</entry>
</feed>
