Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с _delay_ms(int) функция
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9844
Страница 1 от 2

Автор:  klez [ Чет Фев 02, 2012 12:01 am ]
Заглавие:  Проблем с _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);
   }
}

Автор:  Dimitar [ Чет Фев 02, 2012 12:07 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Ами дай да видим самата delay функция де - сега боб ли да хвърляме :D .
Преди това обаче един приятелски съвет от мен - ако искаш да свикваш с добри практики на програмиране, особено за контролери ще е добре да се научиш по друг начин да си генерираш закъснения и времеви интервали, а не с такива функции, дето процесора стои в тях и нищо не прави :) .

Автор:  klez [ Чет Фев 02, 2012 12:12 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

мм мислех че е няква стандартна от delay.h ;) за това не съм я дал.

Автор:  Dimitar [ Чет Фев 02, 2012 12:13 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Дай да видим какво има в ей тоя файл "util/delay.h".

Автор:  klez [ Чет Фев 02, 2012 12:22 am ]
Заглавие:  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
}

Автор:  Dimitar [ Чет Фев 02, 2012 12:30 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Я пробвай с 10 милисекунди да видиш дали пак ще е 4 пъти по-малко. С 4000 милисекунди може да има някакво препълване и затова да се получава така

Автор:  klez [ Чет Фев 02, 2012 12:33 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Същата работа ;)

Автор:  Бай Ставри [ Чет Фев 02, 2012 12:39 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

klez написа:
Същата работа ;)


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

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


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

Автор:  klez [ Чет Фев 02, 2012 12:47 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Aha.. Както и да е не е толкова фатален тоя проблем

Автор:  Бай Ставри [ Чет Фев 02, 2012 12:51 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

klez написа:
Aha.. Както и да е не е толкова фатален тоя проблем


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

Автор:  Nikola Kirov [ Чет Фев 02, 2012 1:06 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Хм изглежда че грешката е в

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

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

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

Автор:  klez [ Чет Фев 02, 2012 1:18 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Благодаря ники, ще бутна библиотеката :) Не вярвах и аз че може в библиотеката която си идва с AVR studio-то да има проблем.
Като цяло грешките не са ми особен проблем рядко я ползвам тая функция обикновенно за тестови цели.

Автор:  Dimitar [ Чет Фев 02, 2012 2:50 am ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Цитат:
Не вярвах и аз че може в библиотеката която си идва с AVR studio-то да има проблем

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

Автор:  klez [ Чет Фев 02, 2012 12:24 pm ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Явно ;) последно така с презумпцията, че в дейташийтите няма грешки си блъсках 1 месец главата докато усетя че на ония баро сензор в дейташийта едната променлива е с объркан тип;)

Автор:  Реконструктор [ Чет Фев 02, 2012 1:37 pm ]
Заглавие:  Re: Проблем с _delay_ms(int) функция

Компилатора пуска warning, че ако са ти изключени оптимизациите, тая функция няма да работи както трябва. Виж си внимателно аутпута.
Можеш да пуснеш -O1, би трябвало да тръгне нормално.

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/