|
|
 |
Ответов
|
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 стоило приводить в качестве примера? Это же стандартные функции....
|
|
|
|
Сообщений в этой теме
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           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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|