Вот код, в реале не проверял, но в отладчике вроде работает
Код:
#include <avr/io.h>
#include "SmallUart.h"
#include <avr/interrupt.h>
#include <iopins.h>
using namespace IO;
volatile uint16_t WaveLength;
volatile uint16_t CalcedWaveLength;
#define TCNT2_Const (256-2)
int main(void)
{
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
TCCR2B |= (1<<CS20)|(1<<CS21); //(1<<CS21)|(1<<CS20)|(1<<CS22); //установка предделителя 32
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
TCNT2 = TCNT2_Const; // 16000000/256/100/64=8 tcnt2=256-8=248.
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
sei();
WaveLength=0;
CalcedWaveLength=0;
for (;;)
{
for (;CalcedWaveLength==0;);
uint16_t cwl=CalcedWaveLength;
CalcedWaveLength=0;
UART_SendByte(cwl&255);
UART_SendByte(cwl>>8);
}
}
SIGNAL(TIMER2_OVF_vect)
{
TCNT2=TCNT2_Const;
uint16_t WL=WaveLength;
if (Pd2::IsSet())
WL++;
else
{
if (WL!=0)
{
CalcedWaveLength=WL;
WL=0;
}
}
WaveLength=WL;
}
Таймер выполняется примерно 50 тактов. Вызыается - каждые 64 такта процессора, т.е. считает каждые 4 микросекунды.
В приложении - полный проект AVR Studio. Единственное, там стоит скорость 9600. ее надо увеличить до 115200 и в SmallUart.h включить
@define UART_DOUBLESPEED