Тема: Частотомер ардуино
На вход D5 подается частота 2 МГц с другой платы ардуино
2 Мгц
 
 
volatile byte x;
unsigned long f;
 
void setup(){
    DDRD  = 0b00000000; // весь порт D как вход
    PORTD = 0b00100000; // подтягивающий резистор на PD5 (вход T1)
    Serial.begin(9600);
 
    cli();  
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
    TIMSK1 |= (1 << TOIE1); // бит TOIE1 в регистре TIMSK1 взывает прерывание когда таймер переполняется
    sei(); 
}
 
void loop(){
  x=0; // обнулить переменную х
  TCNT1 = 0; // обнулить счетный регистр
  TCCR1B |= (1 << CS12)|(1 << CS11)|(1 << CS10); // разрешить прерывания
  delay(993);delayMicroseconds(105); // ждем 1 секунду пока таймер считает импульсы  
  TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10); // запретить прерывания
  f = x * 65535 + TCNT1; // подсчет частоты
  Serial.println(f);
  }
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1
