Показано с 1 по 10 из 51

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Модератор
    Регистрация
    06.07.2008
    Возраст
    47
    Сообщений
    414
    Вес репутации
    453

    По умолчанию Re: Помогите. Не могу понять тянет ли ардуино проект.

    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;
    TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
    sei();

    Это можно просто переписать - инициализирует таймер.

    volatile uint16_t WaveLength;
    volatile uint16_t CalcedWaveLength;
    объявляет две переменных, которые не должны быть оптимизированы процессором.
    Беззнаковые, 16-битные.

    for (;
    {
    for (;CalcedWaveLength==0;
    uint16_t cwl=CalcedWaveLength;
    CalcedWaveLength=0;
    UART_SendByte(cwl&255);
    UART_SendByte(cwl>>8);


    }

    Это основной цикл, который можно запихнуть в void Loop(void);

    Ждет пока в CalcedWaveLength будет что-то отличное от нуля, копирует его в переменную, отправляет в uart (в бинарном виде), и обнуляет.

    SIGNAL(TIMER2_OVF_vect)
    {
    TCNT2=TCNT2_Const; // задает параметр таймера. Переписать как есть.
    uint16_t WL=WaveLength; // копирует счетчик в локальную переменную
    if (Pd2::IsSet()); // если нога Digital2 в верхнем положении
    WL++; // то увеличиваем счетчик
    else // иначе
    {
    if (WL!=0) // если там что-то было в счетчике (не 0)
    {
    CalcedWaveLength=WL; // то то, что было складываем в CalcedWaveLength
    WL=0; // и очищаем
    }
    }
    WaveLength=WL; Задаем новое значение в основной счетчик (или 0)
    }



    Итого - логика такая - таймер считает время, пока нога в верхнем положении. Для этого использует переменную - счетчик WaveLength.
    Когда таймер обнаруживает, что нога в нижнем положении, она копирует WaveLength в CalcedWaveLength, а WaveLength очищает.

  2. #2
    Пользователь
    Регистрация
    25.01.2011
    Сообщений
    24
    Вес репутации
    184

    По умолчанию Re: Помогите. Не могу понять тянет ли ардуино проект.

    Цитата Сообщение от SBorovkov Посмотреть сообщение
    Итого - логика такая - таймер считает время, пока нога в верхнем положении. Для этого использует переменную - счетчик WaveLength.
    Когда таймер обнаруживает, что нога в нижнем положении, она копирует WaveLength в CalcedWaveLength, а WaveLength очищает.

    А почему считаем, пока нога в верхнем положении? Мне кажется более правильным считать пока не будет перепада с единицы на ноль. Ведь бит кодируется так: сначала низкий уровень, потом высокий. Обе половинки одинаковые по продолжительности (в теории). Но это половинки одного бита.

    Короткий по продолжительности - значит единица. Длинный - ноль.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •