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

 
 
> delay.h, возможны неудобства, но есть альтернатива
demiurg_spb
сообщение Feb 26 2010, 09:14
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



MCU: Mega1281, Mega128, Mega64
F_CPU: 14745600
При попытке организовать паузу длинной в 24 NOP'а получаю косяк.
Это:
Код
NOP();NOP();NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();NOP();

не эквивалентно этому:
Код
_delay_us(1.628); // 24/14745600 = 1.628 us

Предлагаю альтернативу (основано на новых возможностях avrlibc (на модуле builtins.h))
Спасибо Анатолию!
Прикрепленные файлы
Прикрепленный файл  delay_x.rar ( 470 байт ) Кол-во скачиваний: 156
 


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
MrYuran
сообщение Feb 26 2010, 09:23
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А в чём косяк-то?
Скорее всего, оптимизатор пошелудил немного.
Посмотрите листинг.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 26 2010, 16:16
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Некогда пока смотреть (я удалил delay.h, чтоб не повадно было инклюдить).
Оптимизатор не может на это влиять, т.к. эти макросы _изначально_ были заточены на то, чтобы быть скомпилины с оптимизацией больше чем -o0.
А предложенный мной вариант не зависит от уровня оптимизации (ИМХО).

Эта ситуёвина была замечена ещё больше года назад на позапрошлой версии WinAVR и с тех пор не менялась.
Я тогда писал ногодрыгательный интерфейс для связи с драйвером LCD на KS108 (формирование E строба).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 26 2010, 20:32
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Ээ.. а где в WinAVR именно _delay_ns? Вижу us, ms...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 26 2010, 20:41
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Это я ошибся, конечно было _delay_us(1.628); (я поправил в первом сообщении)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 26 2010, 21:15
Сообщение #6


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



В AVRStudio, ATMega128 (симулятор 1 версии) @ 14.7456MHz, что 24 nop'а, что _delay_us(1.628), - выполняются 24 цикла (вот только время симулятор выдает не аккуратно, жетско округляет).
Да и в железе ничего такого неадекватного не замечал, не более чем ±1 цикл ошибка из-за округления чисел где-то. Хм.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 27 2010, 14:52
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Да, я пробовал в пустом проекте - там всё чётко.
Код
_delay_us(1.628);
такты
1          dcf2:    88 e0       ldi    r24, 0x08; 8
1          dcf4:    8a 95       dec    r24
2(1)       dcf6:    f1 f7      brne    .-4; 0xdcf4 <main+0x2>
всего:24
А в большом проекте - что-то не так. Позже попробую выяснить.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 02:37
Рейтинг@Mail.ru


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