реклама на сайте
подробности

 
 
> Вопрос о таймере, остановка процесса по окончанию счета
-Alexey-
сообщение Jan 30 2008, 13:21
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 11-11-07
Пользователь №: 32 231



Нужно сделать так, чтобы во время отсчета таймером 0 интервала времени и до его окончания выполнялись некоторые действия, после таймер заново перезагружался.
Например, для тестового варианта посылка в UART. UART отдельно работает, проверен.
В данном варианте я жду появления флага совпадения OCF0.
В результате выполнения получаю только единицы между START и END.
А должны быть 16-ть раз поочередно N-единиц и N-нулей.
Т.е. while выполняется только первый. Да и выполняется сам код слишком быстро, а должен 8сек работать.
Заранее спасибо.

Используются: CVavr, mega16.

Код
#include <mega16.h>
#include <stdio.h>

#define F_XTAL 1000000L
#define SPEED 2L

void Start_Timer0(void)
{
TCCR0 = 0b00111101;        // CTC
OCR0=F_XTAL/2L/1024L/SPEED-1;
TIMSK = 0b11;
}

void Stop_Timer0(void)
{
TCCR0=0;
}

void send1(void)
{
  while ((TIFR & 0b10)==0)
  {
  putsf("1");
  };
}

void send0(void)
{
  while ((TIFR & 0b10)==0)
  {
  putsf("0");
  };
}


void main ()
{
[...]        //UART init
putsf("\nSTART\n");

Start_Timer0();
for (i=0;i<16;i++)
  {
  if ((0x5555&(1<<i))) send1(); else send0();
  };
Stop_Timer0();

putsf("\nEND");
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
-Alexey-
сообщение Jan 30 2008, 14:34
Сообщение #2





Группа: Новичок
Сообщений: 7
Регистрация: 11-11-07
Пользователь №: 32 231



SasaVitebsk
=GM=
1) у меня OCR0=243, еще раз пересчитал [1000000/2/1024/2]
2) пробовал писать так TIFR&=(~0b10) после выхода из while, тот же результат
3) конец программы smile.gif While(1) мне не нужен (если речь об этом), это только тестовый кусок из моей основной программы, в котором и возникли неполадки. Смысл - только протестировать нужную мне часть кода.
Go to the top of the page
 
+Quote Post
SergeiCh
сообщение Jan 30 2008, 15:23
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415



Все правильно. Первый send1 будет слать единицы, пока не дождется совпадения. Поскольку OCF0 не сбрасывается, дальше при вызове send0/1 в while мы попадать не будем.

Цитата(-Alexey- @ Jan 30 2008, 21:34) *
2) пробовал писать так TIFR&=(~0b10) после выхода из while, тот же результат

OCF0 сбрасывается единичкой: TIFR = (1<<OCF0);
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 19:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016