|
|
 |
Ответов
|
Dec 3 2006, 19:35
|
Участник

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

|
так в том-то и дело, что на winavr не все так просто как на iar...
|
|
|
|
|
Dec 3 2006, 19:42
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

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

Группа: Новичок
Сообщений: 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) и в путь
|
|
|
|
|
Dec 4 2006, 10:24
|
Знающий
   
Группа: Участник
Сообщений: 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" у вас определен? Как? Анатолий.
|
|
|
|
|
Dec 4 2006, 10:38
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Dec 4 2006, 11:05
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 4 2006, 11:23
|
Участник

Группа: Новичок
Сообщений: 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 прерывания есть, но я их отключаю на время записи и чтения бит
|
|
|
|
|
Dec 4 2006, 19:05
|
Участник

Группа: Новичок
Сообщений: 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". Все, сделал Для 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 тактов? что-то не сходится с моими показателями
|
|
|
|
|
Dec 4 2006, 19:50
|
Знающий
   
Группа: Участник
Сообщений: 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 должен одязательно быть константой, по тойже самой причине. Анатолий.
|
|
|
|
|
Dec 4 2006, 21:37
|
Участник

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

|
Цитата(aesok @ Dec 4 2006, 19:50)  Цитата(asf @ Dec 4 2006, 20:05) 
проект именно с -O0 почему -O0 добавляет 3000 тактов? что-то не сходится с моими показателями
Чем больше информации вы будете скрывить когда задаете вопрос, тем позже получете ответ! вот код функции _delay_ms: Анатолий. Анатолий, спасибо за помощь, но разве delay.h стоило приводить в качестве примера? Это же стандартные функции....
|
|
|
|
|
Dec 4 2006, 22:35
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(asf @ Dec 4 2006, 22:37)  Цитата(aesok @ Dec 4 2006, 19:50)  Цитата(asf @ Dec 4 2006, 20:05) 
проект именно с -O0 почему -O0 добавляет 3000 тактов? что-то не сходится с моими показателями
Чем больше информации вы будете скрывить когда задаете вопрос, тем позже получете ответ! вот код функции _delay_ms: Анатолий. Анатолий, спасибо за помощь, но разве delay.h стоило приводить в качестве примера? Это же стандартные функции.... Функции из 'delay.h' не совсем библиотечные функции, эти функции не только задекларированы, но и определены в заголовочном файле. (Если вы откроете любую книгу по С то в ней вам скажут что так делать нельзя!). Это инлайн функции. Эти функции корректно использовать только с включенной оптимизацией, чтобы оптимизатор компилятора заоптимизировал их почти насмерть, от них в коде должен оставаться только оператор '__asm__' из _delay_loop_1/_delay_loop_2, все вычисления должны быть выполнены во время компиляции. Если вам так проще представьте себе что это макросы. Эти функции при уровне оптимизации -O0, в общем случае, нельзя использовать вообще. Если скажем _delay_loop_1 будет использована в двух .c файлах в одном проекте вы получите ошибку при компоновке. Проверти. И еще раз повторю для _delay_us/_delay_ms, ошибка по времени будет время на одно деление чисел с плавающей точкой плюс одно умножение плюс 2 сравнения. Опять-же проверти время выполнения в симуляторе. Плюс вы подлинкуете математическую библиотеку. Смотрите размер кода. Вывод: функции из 'delay.h' можно использовать только с включенной оптимизацией и параметры этих функций должны быть обязательно константы (или выражения которые могут бить вычислены во время компиляции). Извиняюсь если не очень понятно объяснил, это не мое призвание. Изучайте, экспериментируйте или просто делайте как я написал в выводе. И еще считайте что оптимизация -O0 в avr-gcc используется только для тестирования компилятора, код генерируется очень не эффективный. В 99.9% случаев вы должны использовать -Os. Анатолий.
Сообщение отредактировал aesok - Dec 4 2006, 22:36
|
|
|
|
Сообщений в этой теме
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 singlskv Цитата(asf @ Dec 3 2006, 19:35) так в том... Dec 3 2006, 20:24 prottoss Цитата(asf @ Dec 3 2006, 23:35) так в том... Dec 4 2006, 10:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|