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

 
 
> _delay_us(), прошу помоч
Nerd
сообщение Mar 14 2010, 19:55
Сообщение #1





Группа: Участник
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
Qwertty
сообщение Mar 14 2010, 20:10
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Nerd @ Mar 14 2010, 22:55) *
Как я понял проверяется частота F_CPU и если она меньше чем нужно то микросекундных задержек нима.
На плате я непредусмотрел место для кварца о чём щас жалею.
Насколько максимально можно раскачегарить внутренний RC, или как сделать задержку на 50мкс.
?

Неправильно понимаете. Там проверяется задержка и если она больше, чем может обеспечить _delay_us, то автоматически будет вызвана __delay_ms.
В Вашем случае с 50 микросекундной задержкой проблем быть не должно. Оптимизация включена?
Go to the top of the page
 
+Quote Post
Nerd
сообщение Mar 14 2010, 20:17
Сообщение #3





Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957



MCU_TARGET = atmega32
OPTIMIZE = -o1
Оптимизация включена, хотя я смутно представляю разницу между "о0, о1, о2".
Пишу в WINavr.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Mar 14 2010, 20:20
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Nerd @ Mar 14 2010, 23:17) *
Оптимизация включена, хотя я смутно представляю разницу между "о0, о1, о2".
Пишу в WINavr.

Для авр лучший вариант -Os
Выкладывайте минимальный проект. Только main и пара задержек.
Go to the top of the page
 
+Quote Post
Nerd
сообщение Mar 14 2010, 20:36
Сообщение #5





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Mar 14 2010, 20:40
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(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 обсчитать уже не сможет.
Go to the top of the page
 
+Quote Post
Nerd
сообщение Mar 14 2010, 20:57
Сообщение #7





Группа: Участник
Сообщений: 5
Регистрация: 14-03-10
Пользователь №: 55 957



Да минимум, как тока вместо delay_ms(1) пишу delay_us(50) вываливается выше обьявленный ахтунг.
Про выбор AVR непонял, управляется AVR с ПК, по COM, G Коды использовать не буду.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Mar 14 2010, 21:23
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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");
    }
}
Go to the top of the page
 
+Quote Post
Nerd
сообщение Mar 15 2010, 07:04
Сообщение #9





Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post

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

 


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


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