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

 
 
> Задержки в мкс на WinAVR. Нужно для 1-wire. Как?
asf
сообщение Dec 1 2006, 22:32
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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 понятную задержку в мкс?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
asf
сообщение Dec 3 2006, 19:35
Сообщение #2


Участник
*

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



так в том-то и дело, что на winavr не все так просто как на iar...
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 3 2006, 19:42
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(asf @ Dec 3 2006, 20:35) *
так в том-то и дело, что на winavr не все так просто как на iar...


Как вы ипользуете макрос "_delay_us"? Покажите код.

Анатолий.
Go to the top of the page
 
+Quote Post
asf
сообщение Dec 4 2006, 09:41
Сообщение #4


Участник
*

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



Цитата(aesok @ Dec 3 2006, 19:42) *
Цитата(asf @ Dec 3 2006, 20:35) *

так в том-то и дело, что на winavr не все так просто как на iar...


Как вы ипользуете макрос "_delay_us"? Покажите код.

Анатолий.


а что там может быть сверх естественного? _delay_us(6) и в путь
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 4 2006, 10:24
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(asf @ Dec 4 2006, 10:41) *
Цитата(aesok @ Dec 3 2006, 19:42) *

Цитата(asf @ Dec 3 2006, 20:35) *

так в том-то и дело, что на winavr не все так просто как на iar...


Как вы ипользуете макрос "_delay_us"? Покажите код.

Анатолий.


а что там может быть сверх естественного? _delay_us(6) и в путь


А "F_CPU" у вас определен? Как?

Анатолий.
Go to the top of the page
 
+Quote Post
asf
сообщение Dec 4 2006, 10:38
Сообщение #6


Участник
*

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



Цитата(aesok @ Dec 4 2006, 10:24) *
Цитата(asf @ Dec 4 2006, 10:41) *

Цитата(aesok @ Dec 3 2006, 19:42) *

Цитата(asf @ Dec 3 2006, 20:35) *

так в том-то и дело, что на winavr не все так просто как на iar...


Как вы ипользуете макрос "_delay_us"? Покажите код.

Анатолий.


а что там может быть сверх естественного? _delay_us(6) и в путь


А "F_CPU" у вас определен? Как?

Анатолий.



#define F_CPU 8000000UL // 8 MHz
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 4 2006, 11:05
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(asf @ Dec 4 2006, 11:38) *
Цитата(aesok @ Dec 4 2006, 10:24) *

Цитата(asf @ Dec 4 2006, 10:41) *

Цитата(aesok @ Dec 3 2006, 19:42) *

Цитата(asf @ Dec 3 2006, 20:35) *

так в том-то и дело, что на winavr не все так просто как на iar...


Как вы ипользуете макрос "_delay_us"? Покажите код.

Анатолий.


а что там может быть сверх естественного? _delay_us(6) и в путь


А "F_CPU" у вас определен? Как?

Анатолий.



#define F_CPU 8000000UL // 8 MHz


F_CPU Должна быть определенна в каждом файле где используеться delay.h и до включения этого файла. Надеюсь у вас так.

Проще F_CPU определьть только один раз в Makefile, например так:
DEFS = ... -D F_CPU=8000000UL ...

У вас она кстате она не переопределена в Makefile?

Какие конкретно задежки вы пытаетесь получить с помощю _delay_us? У _delay_us есть ограничение по максимальной длительности, которую можно с помощью нее получить.


И не забывайте что пограмные задержки гарантируют только то что задержка будет не менее указанной, но она может быть больше.
Например если во время выполнения задержки в 20 мкс (_delay_us(20)) выпониться прерывание длительностью 100 мкс, то общая задежка будет 120 мкс.

Как много прерываний в вашей программе?


Анатолий.

Сообщение отредактировал aesok - Dec 4 2006, 11:05
Go to the top of the page
 
+Quote Post
asf
сообщение Dec 4 2006, 11:23
Сообщение #8


Участник
*

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



Цитата(aesok @ Dec 4 2006, 11:05) *
Цитата(asf @ Dec 4 2006, 11:38) *

Цитата(aesok @ Dec 4 2006, 10:24) *

Цитата(asf @ Dec 4 2006, 10:41) *

Цитата(aesok @ Dec 3 2006, 19:42) *

Цитата(asf @ Dec 3 2006, 20:35) *

так в том-то и дело, что на winavr не все так просто как на iar...


Как вы ипользуете макрос "_delay_us"? Покажите код.

Анатолий.


а что там может быть сверх естественного? _delay_us(6) и в путь


А "F_CPU" у вас определен? Как?

Анатолий.



#define F_CPU 8000000UL // 8 MHz


F_CPU Должна быть определенна в каждом файле где используеться delay.h и до включения этого файла. Надеюсь у вас так.

Проще F_CPU определьть только один раз в Makefile, например так:
DEFS = ... -D F_CPU=8000000UL ...

У вас она кстате она не переопределена в Makefile?

Какие конкретно задежки вы пытаетесь получить с помощю _delay_us? У _delay_us есть ограничение по максимальной длительности, которую можно с помощью нее получить.


И не забывайте что пограмные задержки гарантируют только то что задержка будет не менее указанной, но она может быть больше.
Например если во время выполнения задержки в 20 мкс (_delay_us(20)) выпониться прерывание длительностью 100 мкс, то общая задежка будет 120 мкс.

Как много прерываний в вашей программе?


Анатолий.



Я делаю так:

#define F_CPU 8000000UL // 8 MHz
#include <util/delay.h>
#define OW_DEL_A 6
#define OW_DEL_B 64
#define OW_DEL_C 60
#define OW_DEL_D 10
#define OW_DEL_E 9
#define OW_DEL_F 55
#define OW_DEL_G 0
#define OW_DEL_H 480
#define OW_DEL_I 70
#define OW_DEL_J 410

Функция:
char OW_DetectPresence(void)
{ char status;

// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;

// задержка H нахождения шины в 0
__delay_cycles(OW_DEL_H);

// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;

// задержка I до окончания таймслота
__delay_cycles(OW_DEL_I);

// читаем состояние шины
status = OW_PIN & OW_BUS_MASK;

// задержка J до окончания таймслота
__delay_cycles(OW_DEL_J);

return status;
}

не дает необходимого результата, однако вот такая конструкция работает:


char reset(void) //ñáðîñ òàáëåòêè
{ //
int temp; //
asm("cli"); //Çàïðåòèòü âñå ïðåðûâàíèÿ
OW_DDR |= OW_BUS_MASK; //0 íà òàáëåòêó

delay(1440);
temp=160; //ðåàëüíûé ïåðâûé îòâåò - 79 !!!
OW_DDR &= ~OW_BUS_MASK; //1 íà òàáëåòêó
do
{
if(bit_is_set(OW_PIN,OW_BUS)) goto respons1;
}while(--temp);// æäåì îñâîáîæäåíèÿ ëèíèè
goto bad;
respons1:
temp=172; //ðåàëüíûé ïåðâûé îòâåò - 86 !!!
do
{
if(!bit_is_set(OW_PIN,OW_BUS)) goto respons2;
}while(--temp);// æäåì îòâåòà òàáëåòêè
goto bad;//íåò îòâåòà òàáëåòêè
respons2:
temp=2382;
////ðåàëüíûé ïåðâûé îòâåò - 1191 !!!
do
{
if(bit_is_set(OW_PIN,OW_BUS)) goto respons3;
}while(--temp);//æäåì îñâîáîæäåíèÿ ëèíèè
goto bad;
respons3:
asm("sei"); //ðàçðåøàåì ïðåðûâàíèÿ
return 1;//òàáëåòêà èíèöèàëèçèðîâàíà
bad: //îøèáêà íà øèíå
asm("sei"); //ðàçðåøàåì ïðåðûâàíèÿ
return 0;
}//;êîíåö ñáðîñà DALLASa //

где delay(l_) - это:

do
{
}while(--l_);


----------------------
а вот на _delay_us никак не получается добиться даже detect presents

прерывания есть, но я их отключаю на время записи и чтения бит
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 4 2006, 18:14
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



1. Согласно документации:
_delay_us
...
The maximal possible delay is 768 us / F_CPU in MHz.

Тоесть для 8MHz максимальную задержку которую ва можете получить с помощю _delay_us, это около 100мкс. Если вам нужна задержка в 410 мкс, то нужно писать _delay_ms(0.41).

2. С какой оптимизацией вы компилируете проект? Если с -O0 то функции _delay_us/_delay_ms будут давать дополнительную задержку примерно в 3000 тактов.

Анатолий.

PS: Пожалуйста покажите наконец код функции OW_DetectPresence с "_delay_us".

Сообщение отредактировал aesok - Dec 4 2006, 18:58
Go to the top of the page
 
+Quote Post
asf
сообщение Dec 4 2006, 19:05
Сообщение #10


Участник
*

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



Цитата(aesok @ Dec 4 2006, 18:14) *
1. Согласно документации:
_delay_us
...
The maximal possible delay is 768 us / F_CPU in MHz.

Тоесть для 8MHz максимальную задержку которую ва можете получить с помощю _delay_us, это около 100мкс. Если вам нужна задержка в 410 мкс, то нужно писать _delay_ms(0.41).

2. С какой оптимизацией вы компилируете проект? Если с -O0 то функции _delay_us/_delay_ms будут давать дополнительную задержку примерно в 3000 тактов.

Анатолий.

PS: Пожалуйста покажите наконец код функции OW_DetectPresence с "_delay_us".


Все, сделал disco.gif

Для Atmega16 8Mhz
#define OW_DEL_A 13
#define OW_DEL_B 90
#define OW_DEL_C 116
#define OW_DEL_D 16
#define OW_DEL_E 13
#define OW_DEL_F 78
#define OW_DEL_G 0
#define OW_DEL_H 700
#define OW_DEL_I 96
#define OW_DEL_J 560

далее везде _delay_loop_2 с этими задержками.

int OW_DetectPresence()
{ char status;
asm("cli"); //Запретить все прерывания
// устанавливаем шину в ноль
OW_DDR |= OW_BUS_MASK;
// задержка H нахождения шины в 0
_delay_loop_2(OW_DEL_H);
// освобождаем шину
OW_DDR &= ~OW_BUS_MASK;
// задержка I до окончания таймслота
_delay_loop_2(OW_DEL_I);
// читаем состояние шины
if(!bit_is_set(OW_PIN,OW_BUS)) status = 1; else status = 0;
// задержка J до окончания таймслота
_delay_loop_2(OW_DEL_J);
asm("sei");
//разрешаем прерывания
return status;
}

проект именно с -O0
почему -O0 добавляет 3000 тактов? что-то не сходится с моими показателями
Go to the top of the page
 
+Quote Post
aesok
сообщение Dec 4 2006, 19:50
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(asf @ Dec 4 2006, 20:05) *
проект именно с -O0
почему -O0 добавляет 3000 тактов? что-то не сходится с моими показателями


Чем больше информации вы будете скрывить когда задаете вопрос, тем позже получете ответ!

вот код функции _delay_ms:

Код
void
_delay_ms(double __ms)
{
    uint16_t __ticks;
    double __tmp = ((F_CPU) / 4e3) * __ms;
    if (__tmp < 1.0)
        __ticks = 1;
    else if (__tmp > 65535)
        __ticks = 0;    /* i.e. 65536 */
    else
        __ticks = (uint16_t)__tmp;
    _delay_loop_2(__ticks);
}


Для того чтобы более точно расчитать задежку параметр функции _delay_loop_2 расчитываеться с помощю действий с плавающей точкой. Если проект компилируеться без оптимизации то эти расчеты выполняються во время работы программы, а это порядка 3000 циклов по времени, и 2 Кб кода. (Лень уточнять.)

Если включить оптимизацию, даже -O1, то все вычисления будут происходить во время компиляции, и никаких дополнительных расходов.

И еще, параметр _delay_ms/_delay_us должен одязательно быть константой, по тойже самой причине.

Анатолий.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- asf   Задержки в мкс на WinAVR. Нужно для 1-wire. Как?   Dec 1 2006, 22:32
- - dvm11111111   Лови, мож поможет. Сразу хочу сказать, что задержк...   Dec 2 2006, 03:12
- - defunct   Цитата(asf @ Dec 1 2006, 22:32) Вроде ска...   Dec 2 2006, 03:15
- - prottoss   делал как то ради любопытства...Для DS1821 правда,...   Dec 2 2006, 19:52
- - asf   спасибо, буду пробовать, вот только как именно (по...   Dec 3 2006, 10:25
|- - prottoss   Цитата(asf @ Dec 3 2006, 14:25) спасибо, ...   Dec 3 2006, 10:46
|- - singlskv   to prottoss Посмотрел Ваш код на предмет задержек ...   Dec 3 2006, 15:43
|- - prottoss   Цитата(singlskv @ Dec 3 2006, 19:43) to p...   Dec 3 2006, 16:58
|- - singlskv   ЦитатаДумаю, что с Код#define COMM_PER_MCS (...   Dec 3 2006, 19:40
|- - prottoss   Цитата(singlskv @ Dec 3 2006, 23:40) Мне ...   Dec 3 2006, 19:49
|- - singlskv   Цитата(prottoss @ Dec 3 2006, 19:49) Заче...   Dec 3 2006, 20:02
- - SasaVitebsk   Для IAR C (DS1820/18B20) у меня автоматически счит...   Dec 3 2006, 16:23
|- - asf   Работает только детект int OW_DetectPresence() {...   Dec 4 2006, 17:44
||- - prottoss   Цитата(asf @ Dec 4 2006, 21:44) Работает...   Dec 4 2006, 18:10
|- - asf   Цитата(aesok @ Dec 4 2006, 19:50) Цитата(...   Dec 4 2006, 21:37
|- - aesok   Цитата(asf @ Dec 4 2006, 22:37) Цитата(ae...   Dec 4 2006, 22:35
|- - SasaVitebsk   Я могу переписать на таймер. Например таймер 2. То...   Dec 5 2006, 16:57
- - singlskv   Цитата(asf @ Dec 3 2006, 19:35) так в том...   Dec 3 2006, 20:24
- - prottoss   Цитата(asf @ Dec 3 2006, 23:35) так в том...   Dec 4 2006, 10:08


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

 


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


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