Сообщение от andries5
|
В AVRStudio можно было посчитать время исполнения программы по шагам, а в STVD можно? Что-бы настроить функцию Delay() не используя таймер.
|
Функция задержки иногда полезная вещь. Настраивать ее неблагодарное дело.
В общем вот пример такой задержки, компилятор Космик.
Код:
|
// файл delay.h
#ifndef DELAY_H
#define DELAY_H
#ifndef F_CPU
#error "F_CPU not defined!"
#endif
#define US(x) \
(unsigned int)((((x*(F_CPU/1000000.0))‹=8)*8 \
+((x*(F_CPU/1000000.0))›8)*(x*(F_CPU/1000000.0)) - 4)/4)
#define MS(x) US(x*1000)
@inline void delay(unsigned int del)
{
volatile unsigned int tmp;
tmp = del;
#asm
$N:
decw x
jrne $L
nop
#endasm
}
#endif // #ifndef DELAY_H |
Для работы необходимо определить глобальный дефайн F_CPU. В установках проекта на вкладке опций компилятора. Для обоих режимов - и релиза и дебага отдельно!
Смотрите картинку. Частота в герцах, UL в конце - unsigned long.
Нельзя использовать такую задержку при отключенной оптимизации и нельзя передавать ей в качестве параметра переменную! Параметр - только константа!
Как использовать:
Код:
|
#include ‹delay.h›
int main(void)
{
// трам пам пам
delay(US(100));
delay(MS(10));
delay(MS(1.7));
// трам пам пам
} |
Ограничения - минимальная задержка 8 тактов. Максимальная 65536*4= 262144 такта.
Пользуйтесь на здоровье. А тому кто подскажет как сделать инлайновую функцию на голом асме и не потерять параметр будет респект и уважуха. Чтоб понять что я хочу уберите из delay объявление переменной tmp и присваивание ей параметра функции.
При 16МГц такта минимум 0,5мкс, разрешение 0,25мкс. Округляется вниз, т.е. задержка на 0,5мкс и 0,6мкс будет одинаковой - 0,5. Следующая возможная 0,75 и т.д. до 16мС с копейками. При снижении такта соответственно растет минимальная, максимальная задержка и шаг ее.
ЗЫ. Отзывы о работоспособности/неработоспособности приветствуются. Я физически не могу все свои функции тестировать со всеми опциями оптимизации. Так что надеюсь на багрепорты. И задержки и того что планирую в скором времени выложить.