|
_delay_us(), прошу помоч |
|
|
|
Mar 14 2010, 19:55
|
Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957

|
Кристал ATmega32, на внутреннем RC (по умолчанию 1000000UL). _delay_ms работает правильно, а вот _delay_us ругается и отсылает c:/winavr-20071221/bin/../avr/include/util/delay.h:143: sorry, unimplemented: inlining failed in call to '_delay_ms': function not considered for inlining c:/winavr-20071221/bin/../avr/include/util/delay.h:116: sorry, unimplemented: called from here ВОТ СЮДА Код _delay_us(double __us) { uint8_t __ticks; double __tmp = ((F_CPU) / 3e6) * __us; if (__tmp < 1.0) __ticks = 1; else if (__tmp > 255) { _delay_ms(__us / 1000.0); return; } else __ticks = (uint8_t)__tmp; _delay_loop_1(__ticks); } Как я понял проверяется частота F_CPU и если она меньше чем нужно то микросекундных задержек нима. На плате я непредусмотрел место для кварца о чём щас жалею. Насколько максимально можно раскачегарить внутренний RC, или как сделать задержку на 50мкс. ?
Сообщение отредактировал rezident - Mar 16 2010, 16:52
Причина редактирования: Оформление цитаты исходника.
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Mar 14 2010, 20:10
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(Nerd @ Mar 14 2010, 22:55)  Как я понял проверяется частота F_CPU и если она меньше чем нужно то микросекундных задержек нима. На плате я непредусмотрел место для кварца о чём щас жалею. Насколько максимально можно раскачегарить внутренний RC, или как сделать задержку на 50мкс. ? Неправильно понимаете. Там проверяется задержка и если она больше, чем может обеспечить _delay_us, то автоматически будет вызвана __delay_ms. В Вашем случае с 50 микросекундной задержкой проблем быть не должно. Оптимизация включена?
|
|
|
|
|
Mar 14 2010, 20:17
|
Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957

|
MCU_TARGET = atmega32 OPTIMIZE = -o1 Оптимизация включена, хотя я смутно представляю разницу между "о0, о1, о2". Пишу в WINavr.
|
|
|
|
|
Mar 14 2010, 20:20
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(Nerd @ Mar 14 2010, 23:17)  Оптимизация включена, хотя я смутно представляю разницу между "о0, о1, о2". Пишу в WINavr. Для авр лучший вариант -Os Выкладывайте минимальный проект. Только main и пара задержек.
|
|
|
|
|
Mar 14 2010, 20:36
|
Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957

|
Код #include <avr/io.h> #include <avr/interrupt.h> #include "global.h" #include "initport.h" #include "string.h" #include "avrlibtypes.h"
#define F_CPU 1000000UL // 1 MHz #include <util/delay.h>
int main(void) { DDRA = 0xff; PORTA = 0x00;
DDRD = 0x00; PORTD = 0x00;
DDRB = 0xff; PORTB = 0x00;
//char GetByte; unsigned int speed = 25; unsigned char Direct = 1; unsigned int Data = 0; char out = 0;
InitUSART();
_delay_ms(1); val_bit = data & bit[i]; Port0x1bSetBit(3, val_bit); //DS2 _delay_ms(1); Port0x1bSetBit(0, 1); //CLOCK = 0; _delay_ms(1); Port0x1bSetBit(0, 0); //CLOCK = 0;
return 0; } Скоро 12ночи мозг начал плавиться...(( Делаю нынчи модный ЧПУ фрезер, управляю 4 шагавиками, ну естественно раскидал их по регистрам сдвига типа HC595, шоб порты не занимать и буфир сделать, и вот упёрся что с минимальной задержкой 1мс. на один шаг приходится 25мс. а шагов в одном обороте 200, тобишь 5сек. на оборот вот и подкидываюсь..(
Сообщение отредактировал Nerd - Mar 14 2010, 20:51
|
|
|
|
|
Mar 14 2010, 20:40
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(Nerd @ Mar 14 2010, 23:24)  Тут есть кнопочка на форуме - код. Доступна присоздании/редактировании сообщения. Исходники принято вставлять с ее помощью. Исправляйте быстрей, а то модераторы по голове настучат  Получится примерно так: Код _delay_ms(1); val_bit = data & bit[i]; Port0x1bSetBit(3, val_bit); //DS2 _delay_ms(1); Port0x1bSetBit(0, 1); //CLOCK = 0; _delay_ms(1); Port0x1bSetBit(0, 0); //CLOCK = 0; И это - минимум?  Инициализация USART, куча подключенных непонятных хидеров. И ГДЕ в коде неработающие _delay_us???? Офтоп - для фрезера авр плохой выбор. Если с линейной интерполяцией он еще справится, то G2/G3 обсчитать уже не сможет.
|
|
|
|
|
Mar 14 2010, 20:57
|
Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957

|
Да минимум, как тока вместо delay_ms(1) пишу delay_us(50) вываливается выше обьявленный ахтунг. Про выбор AVR непонял, управляется AVR с ПК, по COM, G Коды использовать не буду.
|
|
|
|
|
Mar 14 2010, 21:23
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(Nerd @ Mar 14 2010, 23:57)  Да минимум, как тока вместо delay_ms(1) пишу delay_us(50) вываливается выше обьявленный ахтунг. Про выбор AVR непонял, управляется AVR с ПК, по COM, G Коды использовать не буду. Вы пробовали сами это собрать? Отдельно от хидеров ( у меня ведь их нет). Компилятор ругается практически на каждую строку. Например val_bit = data & bit[i]; Что за val_bit? Объявления его нет. Желание помочь улетучивается прямо на глазах.... Вы под студией работаете? Или make-ом собираете? В первом случае F_CPU лучше указать в свойствах проекта, во втором - в makefile. Вот такое соберется у Вас? Код #include <util/delay.h>
int main(void) { while(1) { _delay_ms(1); asm volatile("nop"); _delay_us(50); asm volatile("nop"); } }
|
|
|
|
|
Mar 15 2010, 07:04
|
Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957

|
Утро оказалось всётаки вечаера мудренее.. Работаю я в WinAVR, как уже писалось, тобишь собираю в мэйк файле, F_CPU обьявлен был в *.С честно говоря не знал что есть разница..( Эррор вываливался при любом упоменании _delay_us() при том что _delay_ms() работает нормально, ваша конструкция соответственно тоже отругалась. Но перечитав утром тему, таки заменил оптимизацию на -Os и всё заработало...) Qwertty огромное спасибо что проявили желание помоч, я честно говоря нерасчитывал что в 12 ночи кто то будет собирать мой проект и разбираться где собака зарыта..) потому и полностью проект не выкладывал... Если кто то может прокоментрировать OPTIMIZE = -o1 vs OPTIMIZE = -Os что оно меняет, ибо разница есть. ( Да кстати раз уж есть разница для места обьявления F_CPU, то где лучше обьявлять OPTIMIZE = -Os.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|