problem z double w GCC

Mar 16, 2006 11 Replies

Probuje uzyc funkcji opoznienia _delay_ms() i mimo, ze mam w pliku linie #include <avr/delay.h>



nie dziala. wywoluje ja w taki sposob: _delay_ms((double)60000); Powinno byc opoznienie rzedu jednej minuty a niestety nie ma zadnego. W pliku makefile jest ustawiony wlasciwy kwarc: F_CPU = 2457600 Mozecie powiedziec mi dlaczego tak jest? Z gory dzieki Pozdrawiam



Jacek M.



Przepraszam za pomylke. Oczywiscie naglowek powinien brzmiec: "problem z delay_ms" Przepraszam i pozdrawiam

Jacek M.

Ale ja nie widze takiej sciezki. Mozesz wyjasnic gdzie to znalazles? Pozdrawiam

Jacek M.

Dnia Thu, 16 Mar 2006 13:49:19 +0100, Jacek M. napisał(a):

W moim podręczniku do avr-libc napisali, że należy włączyć <util/delay.h>

Pozdrawiam Marcin Stanisz

Tak dokladnie mowiac mam zainstalowane WinAVR i nie moge znalezc tam takiej sciezki. Jacek M.

Dnia 16-03-2006 o 14:57:39 Marcin Stanisz snipped-for-privacy@poczta.bzdury.onet.pl> napisał:

Masz nowsze libc, ale avr/delay.h ciągle zapewnia kompatybilność: #warning "This file has been moved to <util/delay.h>." #include <util/delay.h>

Do autora wątku: spróbuj dodać "UL" do stałej: F_CPU = 2457600UL. Przeniósłbym to też "na wszelki wypadek" z pliku makefile do kodu źródłowego jako #define.

BTW, dokumentacja avr-libc sporo zyskała moim zdaniem na przejrzystości wraz ze zmianą z 1.2 na 1.4.

Dnia Thu, 16 Mar 2006 14:57:26 +0100, Jacek M. napisał(a):

avr-libc Reference Manual ver. 1.4.3, 23.01.2006. Pochodzi z najnowszego WinAVR (20060125). U mnie pełna ścieżka jest: C:\WinAVR\avr\include\util\

A tak w ogóle... Czy do obsługi double nie trzeba dodać LDFLAGS += -lm do makefile?

Pozdrawiam Marcin Stanisz

Ta nowa dokumentacja rzeczywiscie wydaje sie bardziej przejrzysta, niestety ja posiadam starsza wersje konpilatora i na razie musze zadowolic sie dotychczasowa "ksiazka". Co ciekawsze jak uzupelnilem linie z deklaracja czestotliwosci kwarcu literami UL kompilator zaczal mi krzyczec, ze on nie zgadza sie na taki sufix: "C:/WinAVR/bin/../lib/gcc/avr/3.4.3/../../../../avr/include/avr/delay.h:139:19: invalid suffix "ULUL" on integer constant". A sugerowana sciezka wystepuje prawdopodobnie (nie sprawdzalem) w nowszych instalacjach WinAVR. Moze jakies inne pomysly? Pozdrawiam

Jacek M.

Dnia 16-03-2006 o 16:04:54 Jacek M. snipped-for-privacy@poczta.onet.pl> napisał:

Racja, dla pliku makefile "UL" jest zbędne:

# Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. F_CPU = 8000000

Thu, 16 Mar 2006 13:49:19 +0100, na pl.misc.elektronika, Jacek M. napisał(a):

Przekraczasz zakres :

<man delay.h>

void _delay_ms ( double __ms ) Perform a delay of __ms milliseconds, using _delay_loop_2(). The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz). Maximal possible delay is 262.14 ms / F_CPU in MHz. <<------------ [...] In general, for long delays, the use of hardware timers is much preferrable, as they free the CPU, and allow for concurrent processing of other events while the timer is running. </man>

Wlasnie! Taka sama odpowiedz przyslal mi emailem Ostry. Postawilem petle i juz mam potrzebne opoznienie. Dzieki wszystkim i pozdrawiam

Jacek M.

In the darkest hour on Thu, 16 Mar 2006 13:49:19 +0100, Jacek M. snipped-for-privacy@poczta.onet.pl> screamed:

Za duża wartość argumentu. Podziel na mniejsze i wywołaj w pętli. Dokładny zakres znajdziesz w samym pliku nagłówkowym delay.h.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required