Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 21.05.2010, 02:54  
al-s
Гражданин KAZUS.RU
 
Аватар для al-s
 
Регистрация: 02.09.2008
Адрес: Между Европой и Азией (58,37 С - 59,46 В)
Сообщений: 709
Сказал спасибо: 125
Сказали Спасибо 299 раз(а) в 212 сообщении(ях)
al-s на пути к лучшему
По умолчанию Организация задержек на МК AVR

Требуется организовать 3 вида задержек:
1.Задержка от 1-5 сек с шагом 1 сек - выдача упр. сигнала на вывод порта, например PD0.
2.Задержка от 0,01-1,0 сек с шагом 0,01 сек - выдача упр. сигнала на вывод порта, например PD1.
3.Задержка от 2-10 сек с шагом 1 сек - выдача упр. сигнала на вывод порта, например PD3.
Вопрос: мне нужно нужно для каждого вида задержек написать отдельную процедуру для таймера МК? Прошу сильно не пинать, только изучаю программирование МК.
Реклама:
al-s вне форума  
Непрочитано 21.05.2010, 04:09  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Организация задержек на МК AVR.

Я бы сделал всё в одной процедуре обработки прерывания таймера:
1. Период таймера 1 мс
2. Три переменные DT0, DT1, DT2 для каждой задержки, в которые записываются нужные величины, выраженные в мс, записываются хором или порознь - не важно.
3. В процедуре обработки прерывания таймера:
начало
.
.
.
если DT0›0 , то ( DT0 = DT0-1, если DT0==0, то PD0=1)
если DT1›0 , то ( DT1 = DT1-1, если DT1==0, то PD1=1)
если DT2›0 , то ( DT2 = DT2-1, если DT2==0, то PD3=1)
.
.
конец
4. У Вас максимальные значения задержек 10000мс, в один байт не влезет. Если программируете на ассемблере, и МК 8-битный, то придётся делать старший и младший байты для каждой переменной, DT0H и DT0L и т.д., при этом уменьшать на 1 и сравнивать с 0 надо по правилам для двухбайтных переменных.
Yurkin2007 вне форума  
Непрочитано 21.05.2010, 09:50  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Организация задержек на МК AVR

Примерно так.

void DelayInit(void) // Инициализация таймера
{
TIMER_HW_TCCRB = 2; // FCLK/8=1
}

void DelayMks(uint16_t mks) // Ждать mks микросекунд
{
#if TIMER_HW_BIT == 16 // Если таймер 16-ти битный, то
TIMER_HW_TCNT=-mks; // Задать задержку
TIMER_HW_TIFR=TIMER_HW_MASKA; // Сбросить
while((TIMER_HW_TIFR & TIMER_HW_MASKA) == 0);
#else
TIMER_HW_TCNT=-(mks & 0xff);
TIMER_HW_TIFR=TIMER_HW_MASKA; // Сбросить
for( uint8_t i=0; i ‹ ( mks››8 ) + 1; i++ )
{
while((TIMER_HW_TIFR & TIMER_HW_MASKA) == 0);
TIMER_HW_TIFR=TIMER_HW_MASKA; // Сбросить
}
#endif
}



void DelayMs(uint8_t ms) // Ждать ms милисекунд
{
while(ms›0)
{
DelayMks(FCLK/8000); // Задержка 1мс
ms--;
__reset_watchdog();
}
}


void Delay01(uint16_t s01) // Ждать s01*0.1 секунд
{
while(s01›0)
{
DelayMs(100);
s01--;
}
}

void ClrCntWait(void) //Очистить счётчик измерителя задержки
{
TIMER_HW_TCNT=0; // Очистить задержку
TIMER_HW_TIFR=TIMER_HW_MASKA; // Сбросить флаг
}

uint16_t GetCntWait(void) // Считать счётчик измерителя задержки (Измерить временной интервал)
{
uint8_t flag;

flag = TIMER_HW_TIFR & TIMER_HW_MASKA; // Прочитать флаг
if(flag!=0) return (0xffff); // Если переполнение, то выдать максимальное значение
else return(TIMER_HW_TCNT); // Иначе измеренный результат
}

Последний раз редактировалось SasaVitebsk; 21.05.2010 в 09:53.
SasaVitebsk вне форума  
Непрочитано 21.05.2010, 11:54  
al-s
Гражданин KAZUS.RU
 
Аватар для al-s
 
Регистрация: 02.09.2008
Адрес: Между Европой и Азией (58,37 С - 59,46 В)
Сообщений: 709
Сказал спасибо: 125
Сказали Спасибо 299 раз(а) в 212 сообщении(ях)
al-s на пути к лучшему
По умолчанию Re: Организация задержек на МК AVR

Пока разбираюсь с asm. На Си пока нет времени. Насколько я понял процедуру задержки я делаю одну (0,01-10 сек с шагом 0,01 сек), а условия прерывания для каждого вида задержки разные. Получается мне нужен 16 битный таймер МК, т.к шагов 1000. (==) - это обозначает не равно или равно?

Последний раз редактировалось al-s; 21.05.2010 в 12:08.
al-s вне форума  
Непрочитано 21.05.2010, 12:46  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Организация задержек на МК AVR

Сообщение от al-s Посмотреть сообщение
(==) - это обозначает не равно
Означает "равно" в языке С, "не равно" будет "!="

Сообщение от al-s Посмотреть сообщение
условия прерывания для каждого вида задержки разные
Не, не так. Прерывание одно и то же: это прерывание основной программы при переполнении таймера.
Ну, можно по-другому сделать ...
Таймер - это счётчик внутри МК, пусть 16-битный, считает от 0000h до FFFFh. Считает - значит увеличивает своё зачение на 1 с каждый тиком, его можно в программе останавливать и снова запускать, а также изменять его значение. При достижении максимального значения FFFFh со следующим тиком счётчик сам сбрасывается в 0000h, "переполняется", при этом вырабатывается прерывание основной программы, если разрешено.
В Вашем случае, делаете тики таймера с периодом 10мс. Сначала таймер остановлен. Записываете в таймер значение задержки в мс, делённое на 10, со знаком минус. Например, для 1сек = FF9Ch, что есть "-100" в шестнадцатеричном виде. Таймер всё ещё стоит. В процедуре обработки прерывания таймера пишите команду остановки таймера и установку порта в 1.
Теперь всё готово для задержки. В нужный момент просто запускаете таймер. Таймер тикает сам по себе "FF9Dh","FF9Eh","FF9Fh","FFA0h" и т.д. c шагом 10мс. При переполнении, то есть ровно через 1сек, основная программа прерывается, выполняется обработчик прерывания, таймер останавливается, чтобы дальше не считал, и порт устанавливается в 1.
Для определения, какой именно порт надо устанавливать, перед задержкой занесите номер порта в какую-либо переменную, и в прерывании проанализируйте её, чтобы установить нужный порт.

procedure Timer_interrupt()
{
clear int_flag;
Stop_Timer;
if (portNumber ==0) Port0=1;
if (portNumber ==1) Port1=1;
if (portNumber ==3) Port3=1;
}

Main_Program
{

// do something

portNumber=1;
call Delay_ms(1000);

// do something

}

procedure Delay_ms(dt)
{
Timer= -1*dt/10;
Start_Timer;
}

Недостатки этого способа выработки задержки. Ошибка реальной величины задержки будет плавать от 0 до минус 9.9мс. При малых значениях задержки, типа десятки мс, весьма существенная ошибка, например, при ожидаемой задержке в 10мс может дать реальную задержку в 0.1 мс. А всё потому, что тики 10мс для таймера не синхронизированы с моментом запуска задержки.
Второй недостаток - невозможность одновременно запустить несколько задержек с разными величинами.
Если эти недостатки существенны - делайте, как описано в моём предыдущем посте.

Последний раз редактировалось Yurkin2007; 21.05.2010 в 13:00.
Yurkin2007 вне форума  
Сказали "Спасибо" Yurkin2007
al-s (21.05.2010)
Непрочитано 21.05.2010, 14:40  
al-s
Гражданин KAZUS.RU
 
Аватар для al-s
 
Регистрация: 02.09.2008
Адрес: Между Европой и Азией (58,37 С - 59,46 В)
Сообщений: 709
Сказал спасибо: 125
Сказали Спасибо 299 раз(а) в 212 сообщении(ях)
al-s на пути к лучшему
По умолчанию Re: Организация задержек на МК AVR

2 задержка критична (не более +-20%). Нужно время чтобы осмыслить, позже напишу что у меня получится.
al-s вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Делимся опытом 11242 29.12.2015 23:45
AVR JTAGICE MKII - проблемы firmware... Luxurious AVR 25 20.10.2014 10:50
AVR и интерфейс. Просто (но не для меня) Харрисон Микроконтроллеры, АЦП, память и т.д 3 03.03.2010 02:22


Часовой пояс GMT +4, время: 18:56.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot