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

 
 
> Вопрос о таймере, остановка процесса по окончанию счета
-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, 16:19
Сообщение #2





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



SergeiCh
да TIFR|=0b10 помогло
Благодарю всех за участие, рад что все так просто решилось wink.gif
Еще с флагами не работал, видимо поэтому и забыл, что у AVR сбрасываются единицей smile.gif
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jan 30 2008, 21:58
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(-Alexey- @ Jan 30 2008, 19:19) *
SergeiCh
да TIFR|=0b10 помогло

Будьте внимательней!!! То что предложил SergeiCh совсем не похоже на то, что у Вас получилось. В Вашем случае сбросятся ВСЕ флаги в TIFR.

Сообщение отредактировал Qwertty - Jan 30 2008, 21:59
Go to the top of the page
 
+Quote Post
-Alexey-
сообщение Jan 31 2008, 10:18
Сообщение #4





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



defunct
Да, спасибо, мне тоже нравиться на нескольких строках, но не хотел тут растягивать код

Цитата(Qwertty @ Jan 30 2008, 23:58) *
Будьте внимательней!!! То что предложил SergeiCh совсем не похоже на то, что у Вас получилось. В Вашем случае сбросятся ВСЕ флаги в TIFR.

почему все? поясните, пжлста
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2008, 11:34
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(-Alexey- @ Jan 31 2008, 13:18) *
мне тоже нравиться на нескольких строках, но не хотел тут растягивать код

Чтобы не растягивать код тут можете применять таги [ codebox ] / [ /codebox], вот как это будет выглядеть:

CODE

#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



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

 


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


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