Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: _delay_us()
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Nerd
Кристал 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мкс.
?
Qwertty
Цитата(Nerd @ Mar 14 2010, 22:55) *
Как я понял проверяется частота F_CPU и если она меньше чем нужно то микросекундных задержек нима.
На плате я непредусмотрел место для кварца о чём щас жалею.
Насколько максимально можно раскачегарить внутренний RC, или как сделать задержку на 50мкс.
?

Неправильно понимаете. Там проверяется задержка и если она больше, чем может обеспечить _delay_us, то автоматически будет вызвана __delay_ms.
В Вашем случае с 50 микросекундной задержкой проблем быть не должно. Оптимизация включена?
Nerd
MCU_TARGET = atmega32
OPTIMIZE = -o1
Оптимизация включена, хотя я смутно представляю разницу между "о0, о1, о2".
Пишу в WINavr.
Qwertty
Цитата(Nerd @ Mar 14 2010, 23:17) *
Оптимизация включена, хотя я смутно представляю разницу между "о0, о1, о2".
Пишу в WINavr.

Для авр лучший вариант -Os
Выкладывайте минимальный проект. Только main и пара задержек.
Nerd
Код
#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сек. на оборот вот и подкидываюсь..(
Qwertty
Цитата(Nerd @ Mar 14 2010, 23:24) *

Тут есть кнопочка на форуме - код. Доступна присоздании/редактировании сообщения.
Исходники принято вставлять с ее помощью. Исправляйте быстрей, а то модераторы по голове настучат smile.gif
Получится примерно так:
Код
_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;

И это - минимум? smile.gif
Инициализация USART, куча подключенных непонятных хидеров. И ГДЕ в коде неработающие _delay_us????
Офтоп - для фрезера авр плохой выбор. Если с линейной интерполяцией он еще справится, то G2/G3 обсчитать уже не сможет.
Nerd
Да минимум, как тока вместо delay_ms(1) пишу delay_us(50) вываливается выше обьявленный ахтунг.
Про выбор AVR непонял, управляется AVR с ПК, по COM, G Коды использовать не буду.
Qwertty
Цитата(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");
    }
}
Nerd
Утро оказалось всётаки вечаера мудренее..
Работаю я в WinAVR, как уже писалось, тобишь собираю в мэйк файле, F_CPU обьявлен был в *.С честно говоря не знал что есть разница..(
Эррор вываливался при любом упоменании _delay_us() при том что _delay_ms() работает нормально,
ваша конструкция соответственно тоже отругалась. Но перечитав утром тему, таки заменил оптимизацию на -Os и всё заработало...)
Qwertty огромное спасибо что проявили желание помоч, я честно говоря нерасчитывал что в 12 ночи кто то будет собирать мой проект и разбираться где собака зарыта..)
потому и полностью проект не выкладывал...
Если кто то может прокоментрировать OPTIMIZE = -o1 vs OPTIMIZE = -Os что оно меняет, ибо разница есть. (
Да кстати раз уж есть разница для места обьявления F_CPU, то где лучше обьявлять OPTIMIZE = -Os.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.