Отговори на тема  [ 19 мнения ]  Отиди на страница 1, 2  Следваща
Проблем с _delay_ms(int) функция 
Автор Съобщение
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Проблем с _delay_ms(int) функция
Едно много бързо питане.

_delay_ms(x) функцията ми не работи правилно, ако задам 4000 милисекунди тя забавя само с 1000 (4 пъти по-мако)

Задал съм F_CPU 8000000UL (това в настройките на проекта в AVR Studio) той подава към
компилатора -DF_CPU 8000000UL
Но въпреки това работи с 4-пъти по-кратки интервали. преди да задам честотата с F_CPU работеше с 4пъти по-кратки интервали спрямо 1MHz процесор, демек 32 пъти по-кратки интервали спрямо зададените когато съм на 8MHz

Контролер: Atmega8
Честота: 8MHz
Компилатор: AVR GCC (AVR Studio 4)
Source:
Код:
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
   DDRB = 0xff; //portD output
   while (1) {
      PORTB=0b01000000;
      _delay_ms(4000);
      PORTB=0b00000000;
      _delay_ms(4000);
   }
}


Чет Фев 02, 2012 12:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: Проблем с _delay_ms(int) функция
Ами дай да видим самата delay функция де - сега боб ли да хвърляме :D .
Преди това обаче един приятелски съвет от мен - ако искаш да свикваш с добри практики на програмиране, особено за контролери ще е добре да се научиш по друг начин да си генерираш закъснения и времеви интервали, а не с такива функции, дето процесора стои в тях и нищо не прави :) .


Чет Фев 02, 2012 12:07 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
мм мислех че е няква стандартна от delay.h ;) за това не съм я дал.


Последна промяна klez на Чет Фев 02, 2012 12:20 am, променена общо 1 път



Чет Фев 02, 2012 12:12 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: Проблем с _delay_ms(int) функция
Дай да видим какво има в ей тоя файл "util/delay.h".


Чет Фев 02, 2012 12:13 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Код:
void
_delay_ms(double __ms)
{
   uint16_t __ticks;
   double __tmp = ((F_CPU) / 4e3) * __ms;
#if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__)
   extern void __builtin_avr_delay_cycles(unsigned long);
   __builtin_avr_delay_cycles(__tmp);
#else
   if (__tmp < 1.0)
      __ticks = 1;
   else if (__tmp > 65535)
   {
      //   __ticks = requested delay in 1/10 ms
      __ticks = (uint16_t) (__ms * 10.0);
      while(__ticks)
      {
         // wait 1/10 ms
         _delay_loop_2(((F_CPU) / 4e3) / 10);
         __ticks --;
      }
      return;
   }
   else
      __ticks = (uint16_t)__tmp;
   _delay_loop_2(__ticks);
#endif
}


Чет Фев 02, 2012 12:22 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: Проблем с _delay_ms(int) функция
Я пробвай с 10 милисекунди да видиш дали пак ще е 4 пъти по-малко. С 4000 милисекунди може да има някакво препълване и затова да се получава така


Чет Фев 02, 2012 12:30 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Същата работа ;)


Чет Фев 02, 2012 12:33 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Май 27, 2011 8:25 am
Мнения: 134
Местоположение: Силистра
Мнение Re: Проблем с _delay_ms(int) функция
klez написа:
Същата работа ;)


Самата функция приема число!!!!!!!!!

има подобна дето може да зададеш неква променлива но с тая не става


В микро си-то е Vdelay_ms(pause);

_________________
Изображение


Чет Фев 02, 2012 12:39 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Aha.. Както и да е не е толкова фатален тоя проблем


Чет Фев 02, 2012 12:47 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Май 27, 2011 8:25 am
Мнения: 134
Местоположение: Силистра
Мнение Re: Проблем с _delay_ms(int) функция
klez написа:
Aha.. Както и да е не е толкова фатален тоя проблем


не е ли.....аз доста време си дописваях закъсненията докато науча за тая особеност:)

_________________
Изображение


Чет Фев 02, 2012 12:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с _delay_ms(int) функция
Хм изглежда че грешката е в

double __tmp = ((F_CPU) / 4e3) * __ms;

Няма логика да се дели на 4000 като после в единия случай __tmp се дава като параметър на функцията __builtin_avr_delay_cycles() тоест трябва __tmp да бъде точния брой цикли. Ама е и тъпо направено щото не отчита времето за делене и стартиране на функцията. Ще се отрази доста сериозно грешката при малки интервали и ниска честота на процесора.

Трябва да се раздели на 1000,оправете си функцията и ще работи. Нещо са пообъркали хората вероятно. Чудно как не са си хванали грешката.


Чет Фев 02, 2012 1:06 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Благодаря ники, ще бутна библиотеката :) Не вярвах и аз че може в библиотеката която си идва с AVR studio-то да има проблем.
Като цяло грешките не са ми особен проблем рядко я ползвам тая функция обикновенно за тестови цели.


Чет Фев 02, 2012 1:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 12, 2004 3:38 pm
Мнения: 9103
Местоположение: Chicago, IL
Мнение Re: Проблем с _delay_ms(int) функция
Цитат:
Не вярвах и аз че може в библиотеката която си идва с AVR studio-то да има проблем

Време е да свикваш :D .


Чет Фев 02, 2012 2:50 am
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Нед Ное 08, 2009 12:17 am
Мнения: 512
Мнение Re: Проблем с _delay_ms(int) функция
Явно ;) последно така с презумпцията, че в дейташийтите няма грешки си блъсках 1 месец главата докато усетя че на ония баро сензор в дейташийта едната променлива е с объркан тип;)


Чет Фев 02, 2012 12:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение Re: Проблем с _delay_ms(int) функция
Компилатора пуска warning, че ако са ти изключени оптимизациите, тая функция няма да работи както трябва. Виж си внимателно аутпута.
Можеш да пуснеш -O1, би трябвало да тръгне нормално.


Чет Фев 02, 2012 1:37 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 19 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни