|
Задержки в мкс на WinAVR. Нужно для 1-wire. Как? |
|
|
|
Dec 1 2006, 22:32
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 19-12-05
Пользователь №: 12 407

|
Пробовал _delay_us , однако на малых значениях просто никак Что я только не мудрил, считал фронты, пытался понять закономерность, получилось только detect presents, делал циклы, пытался понять как компилятор переводит в асм цикл задержки... в общем результат 0. Помогайте. Все путем дергания ногой МК т.к. порт уже используется. Есть мысль сделать селектор и т.о. повесить на один порт USART два устройства, в т.ч. и 1-wire..... Но у кого-то ведь получалось.... Вроде скажем на 8 Мгц проц Atmega16 делает 8 тактов, далее хз как winAvr компилирует цикл типа while(time--); вроде по фронтам получается порядка 3х циклов подобной задержки на 1-ну мкс.... но пишу далее 0х33 и читаю одни 0хFF .... виимо не попал в таймслоты.... может у кого есть четкое понятие как сделать на winavr понятную задержку в мкс?
|
|
|
|
|
Dec 2 2006, 03:12
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-01-06
Пользователь №: 13 567

|
Лови, мож поможет. Сразу хочу сказать, что задержки определялись эксперементально.
Сообщение отредактировал dvm11111111 - Dec 2 2006, 03:12
Прикрепленные файлы
home2.rar ( 4.79 килобайт )
Кол-во скачиваний: 124
|
|
|
|
|
Dec 3 2006, 10:25
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 19-12-05
Пользователь №: 12 407

|
спасибо, буду пробовать, вот только как именно (по какой методике) подбирали задержки?
|
|
|
|
|
Dec 3 2006, 15:43
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
to prottossПосмотрел Ваш код на предмет задержек и был слегка удивлен: Код #define CPU_CYCLE 408// длительность командного цикла МК в нс для частоты 2.4576MHz
#define COMM_PER_MCS (1000 / CPU_CYCLE) // количество команд CPU за микросекунду #define OW_DEL_A 6 * COMM_PER_MCS #define OW_DEL_B 64 * COMM_PER_MCS #define OW_DEL_C 60 * COMM_PER_MCS #define OW_DEL_D 10 * COMM_PER_MCS #define OW_DEL_E 9 * COMM_PER_MCS #define OW_DEL_F 55 * COMM_PER_MCS #define OW_DEL_G 0 * COMM_PER_MCS #define OW_DEL_H 480 * COMM_PER_MCS #define OW_DEL_I 70 * COMM_PER_MCS #define OW_DEL_J 410 * COMM_PER_MCS ИТОГО: COMM_PER_MCS=2 OW_DEL_H=960 // тактов, или 960/2.4576=390,625 мкс Ну и остальные задержки соответственно. Э...Э...Э Ну, то есть такой код работать не должен А если и работает, то это нам говорит, лишь о том, что продукция Dallas умеет хорошо подстраиваться под длительности импульсов которые ей посылаешь.
|
|
|
|
|
Dec 3 2006, 16:58
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(singlskv @ Dec 3 2006, 19:43)  to prottossПосмотрел Ваш код на предмет задержек и был слегка удивлен: .... ИТОГО: COMM_PER_MCS=2 OW_DEL_H=960 // тактов, или 960/2.4576=390,625 мкс Ну и остальные задержки соответственно. Э...Э...Э Ну, то есть такой код работать не должен А если и работает, то это нам говорит, лишь о том, что продукция Dallas умеет хорошо подстраиваться под длительности импульсов которые ей посылаешь. Да, на самом деле, OW_DEL_H (ResetPulse по DALLAS) меньше чем рекомендованно, но тем не менее работает. Касаемо остальных задержек - для них требования не такие строгие, минимум и максимум отличается почти в два раза... В любом случае спасибо за подсказку  . Я не учел, что препроцессор округляет в меньшую сторону. Думаю, что с Код #define COMM_PER_MCS ((1000 / CPU_CYCLE) + 1) Будет лучше
--------------------
|
|
|
|
|
Dec 3 2006, 19:35
|
Участник

Группа: Новичок
Сообщений: 29
Регистрация: 19-12-05
Пользователь №: 12 407

|
так в том-то и дело, что на winavr не все так просто как на iar...
|
|
|
|
|
Dec 3 2006, 19:40
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата Думаю, что с Код #define COMM_PER_MCS ((1000 / CPU_CYCLE) + 1) Будет лучше Мне кажется что лучше вот так: Код #define CPU_CYCLE 408// длительность командного цикла МК в нс для частоты 2.4576MHz
#define COMM_PER_MCS (1000000 / CPU_CYCLE) // количество команд CPU за милисекунду #define OW_DEL_A (6 * COMM_PER_MCS)/1000 #define OW_DEL_B (64 * COMM_PER_MCS)/1000 #define OW_DEL_C (60 * COMM_PER_MCS)/1000 #define OW_DEL_D (10 * COMM_PER_MCS)/1000 #define OW_DEL_E (9 * COMM_PER_MCS)/1000 #define OW_DEL_F (55 * COMM_PER_MCS)/1000 #define OW_DEL_G (0 * COMM_PER_MCS)/1000 #define OW_DEL_H (480 * COMM_PER_MCS)/1000 #define OW_DEL_I (70 * COMM_PER_MCS)/1000 #define OW_DEL_J (410 * COMM_PER_MCS)/1000 А для коротких интервалов можно еще уточнить: #define OW_DEL_A (6 * COMM_PER_MCS)/1000 -1 // или -2 надо проверить в симуляторе #define OW_DEL_E (9 * COMM_PER_MCS)/1000 -1 чтобы учесть время выдачи бита на пин.
|
|
|
|
|
Dec 3 2006, 19:42
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(asf @ Dec 3 2006, 20:35)  так в том-то и дело, что на winavr не все так просто как на iar... Как вы ипользуете макрос "_delay_us"? Покажите код. Анатолий.
|
|
|
|
|
Dec 3 2006, 19:49
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(singlskv @ Dec 3 2006, 23:40)  Мне кажется что лучше вот так: Код ... Да, так точнее получится... Цитата(singlskv @ Dec 3 2006, 23:40)  А для коротких интервалов можно еще уточнить: #define OW_DEL_A (6 * COMM_PER_MCS)/1000 -1 // или -2 надо проверить в симуляторе #define OW_DEL_E (9 * COMM_PER_MCS)/1000 -1 чтобы учесть время выдачи бита на пин. Зачем еще извращаться то? Таймслоты довольно широкие, минимум от максимума от двух до четырех раз отличается
--------------------
|
|
|
|
|
Dec 3 2006, 20:02
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(prottoss @ Dec 3 2006, 19:49)  Зачем еще извращаться то? Таймслоты довольно широкие, минимум от максимума от двух до четырех раз отличается Не, ну это я уже говорил про "в общем случае", просто об этом иногда тоже не стоит забывать Ну типа общая культура программирования, если есть возможность, то делаем интервал строго по середине диапазона ...
|
|
|
|
|
Dec 3 2006, 20:24
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(asf @ Dec 3 2006, 19:35)  так в том-то и дело, что на winavr не все так просто как на iar... А кто Вам мешает воспользоваться "void _delay_loop_1 (uint8_t __count)" ? Ну, и конечно, при необходимости подкорректировать задержку с помощью asm("nop"); ???
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|