Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

странное поведение функции вычисления частоты

Отправлено fewl 15 октября 2008 г. 03:34


Есть 128 атмега (частота кварца 7,3728). Меряем 10 герц на PC0. Компилятор avr-gcc.
uint8_t get_frequency()
{
uint32_t antiloop=0;
uint8_t t;
uint8_t level;
uint8_t half_frequency=0;

t=bit_is_set(PINC, PC0);
level=t;
stop_flag = 0;

while (t==bit_is_set(PINC, PC0) && (antiloop++ < 368640));

TCNT1H=0xC7;
TCNT1L=0xC0;
TIMSK=0x04;

while (stop_flag==0)//прервётся в обработчике прерывания
{
if (level != bit_is_set(PINC, PC0))
{
level= bit_is_set(PINC, PC0);
if (t==bit_is_set(PINC, PC0)) half_frequency++;
}
}
TIMSK=0x00;
return half_frequency;
}

Инициализация таймера1:
TCCR1A=0x00;
TCCR1B=0x04;
//TCNT1H=0xC7;
//TCNT1L=0xC0;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

Если теперь в основной программе сделать вот так:
while(1)
{
PORTA=get_frequency();
_delay_ms(5000);
}

то после первого отсчёта функция будет возвращать ноль и на порт ничего не придёт, а вот если задержку снизить до 2240 мс (установлено опытным путём =), то всё будет работать. При отладке видно, что он просто не заходит в цикл подсчёта импульсов при большой задержке. Кто-нибудь может подсказать почему?


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
вычтите два из трёх, получится:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru