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

 
 
> Формирование задержки
aspID
сообщение Sep 11 2007, 10:47
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 343
Регистрация: 24-01-07
Из: Новосибирск
Пользователь №: 24 714



На данном этапе некритично, но интересно, как можно формировать задержки длительностью в единицы мкс.

На данный момент используется:
Код
#define _delay_us(x) __delay_cycles(x*F_CPU/1000000)


на частоте
Код
#define F_CPU 3686400UL
просто исполняю следующий код и смотрю за сигналом
Код
  DDRD |= (1 << PD6);
  while (1)
  {
    PORTD |= ( 1 << PD6 );
    _delay_us(5);
    PORTD &= ~( 1 << PD6 );
    _delay_us(1);
  }

на уровне десятков мкс работает нормально, 5 мкс растягиваются до 5,4 мкс а 1 мкс - до 1,85 мкс

Если работать через прерывания таймера - думается мне, обработка не даст большей выгоды. Или я не прав? Как вариант, конечно, увеличивать частоту кварца...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AndreyKeil
сообщение Sep 11 2007, 17:03
Сообщение #2


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

Группа: Свой
Сообщений: 96
Регистрация: 16-11-05
Из: г.Екатеринбург
Пользователь №: 10 930



На вашем месте я бы сделал так:


#define F_CPU 0.277778 //это равно 1/3.686400
//while (1) {
// PORTD|= (1 << 6);

XX0: SBI 0x12, 0x06
// __delay_cycles(5/F_CPU);
LDI R16, 5
XX1: DEC R16
BRNE XX1
RJMP XX2
// PORTD&= ~(1 << 6);
XX2: CBI 0x12, 0x06
// __delay_cycles(1/F_CPU-3); //...-3 это поправка(количество циклов)
RJMP XX0
}

В симуляторе получилось 5,15 и 1,09 мкс. smile.gif

А если хотите получить точно 5 и 1 мкс то надо взять кварц кратный 1МГц (допустим 10МГц).
Ну и ещё как вариант, использовать ассемблер.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 04:56
Рейтинг@Mail.ru


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