Nie mam czasu, żeby dokładnie analizować Twój kod, ale proponuję, żebyś przede wszystkim opanował typy zmiennych całkowitych (jaka jest różnica pomiędzy zmiennymi ze znakiem i bez, jaki jest zakres poszczególnych typów 8-, 16-, 32-bitowych), bo moim zdaniem to z ich nieznajomości wynikają Twoje problemy. Ja wiem, każdy chciałby jak najszybciej opanować sztukę programowania, ale tu nie ma drogi na skróty. Trzeba trochę czasu na poznanie teorii poświęcić.
Jak już wspomniałem nie analizowałem całego kodu, więc podam tylko przykład:
henryxxl napisał(a):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak już używasz stałych wykraczających poza zakres int (w avr-libc ten typ ma 16 bit), to powinieneś używać przyrostków L lub UL (czyli np. 10000000UL). Tutaj jednak to nie rozwiąże problemu.
Większym problemem jest tutaj zakres zmiennych. Jak myślisz, jaki będzie wynik działania
'10000000*czas_cyklu'
gdzie 'czas cyklu' jest krotnością liczby 65536? Nawet przy zmiennej 'przepelnienia' równej 1 wynik będzie wynosił 655360000000, czyli ponad 655*10^9, gdzie zakres zmiennej 32-bitowej ze znakiem jest tylko trochę większy od 2*10^9. Nawet jeśli końcowy wynik (po podzieleniu przez 8000000) będzie się mieścił w zmiennej 32-bitowej, to i tak najpierw musi być wykonana operacja mnożenia.
A wystarczyłoby zrobić np tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po co komplikować proste rzeczy?
Tak jak napisałem, nie analizowałem całości, więc tego typu błędów może być więcej (np. zmienne 'czas_cyklu' czy też 'czas_jednego_obrotu', być może i inne, powinny być typu unsigned, bo to zwiększy ich zakres, a przecież czas raczej wartości ujemnych nie przyjmuje). Poświęć trochę czasu na opanowanie typów zmiennych (głownie typów całkowitych), przemyśl swoje obliczenia i popraw błędy. Jak sam włożysz w to więcej wysiłku, to pewnie inni też chętniej pomogą.