tmf napisał: Oczywiście możesz czasy po prostu podzielić przez 16
A nie pomnożyć? Tzn. wiadomo, że czasy trzeba zapewnić takie same, a więc pomnożyć ewentualne stałe na bazie których odmierza się opóźnienie. Albo na przykład pomnożyć wartości dla sprzętowych liczników, jeśli na bazie ich odmierzasz sobie czas.
Jeśli korzystasz z delay.h z avr-libc, to tak jak pisze tmf, wystarczy poprawnie zdefiniować F_CPU (albo we własnym makefile'u lub w ustawieniach projektu dodać -DF_CPU=16000000UL albo gdzieś w jakimś pliku nagłówkowym zdefiniować #define'm).
Zwróc tylko uwagę na to, że makra _delay_us i _delay_ms z avr-libc mają swoje ograniczenia - nie możesz jako parametr wywołania podać dowolnych wartości, bo te makra mają swój zakres poprawnego działania, opisany w dokumentacji.
I właśnie przy zwiększeniu częstotliwości F_CPU może to sprawić problem, bo po wywołaniu _delay_ms z pożądanym czasem opóźnienia preprocesor przelicza to po prostu na liczbę pętli NOP'ów. Liczba tych pętli jest ograniczona i po zwiekszeniu F_CPU 16 razy wywołanie _delay z tą samą wartością może odmierzać inny czas.
A jeśli korzystasz ze sprzętowych timer'ów to pomnożenie starej wartości np. rejestru COMPA czy COMPB przez 16 może Ci spowodować przepełnienie zakresu tego rejestru. Może być wówczas konieczna zmiana preskalera danego timera. Albo możesz nie ruszać rejestru a zmniejszyć preskaler timera o 16 (jeśli dla wybranego przez Ciebie uprzednio
preskalera tak się da). Generalnie, jeśli nie miałeś tego wcześniej dobrze sparametryzowanego względem F_CPU, to pewnie będziesz musiał parę rzeczy zdefiniować ręcznie. A potem po prostu przesymuluj program i ustaw breakpoint w przerwaniu, żeby sprawdzić, czy "tyka" w takim tempie, w jakim chciałeś.
Ja u siebie robię tak, że mam makra (albo funkcje inline) i #ifdef'y (dlatego tak, żeby pewne duże wartości były obliczane przez preprocesor na etapie kompilacji a nie wyznaczane potem na żywo w trakcie działania programu) do konfiguracji liczników w dane tryby. Najczęstszym używanym przeze mnie trybem jest CTC (czasem jeszcze jakiś tryb PWM, ale zdecydowanie rzadziej). W każdym razie do mojego makra przekazuję tylko pożądaną częstotliwość generowania przerwań w Hz a w kodzie mam parę #ifdef'ów, w których na bazie F_CPU i mojej stałej, np. TO_CTC_FREQ, wyznaczany jest odpowiedni preskaler i odpowiednia wartość COMP dla danego timer'ka. Wyznaczana jest maksymalna rozdzielczość timera (maksymalna wartość preskalera), dla której da się wyznaczyć wartość COMPa - dzięki temu odmierzanie czasu jest b. dokładne. Zreszą, i tak wywołuję swoje makra z takimi wartościami, żeby dokładnie takie dało się osiągnąć.
Proste, zgrabne, i nie muszę się o nic martwić przy zmianie F_CPU.
A jeśli wywołam dla danego timerka makro z częstotliwością, której dla danego F_CPU nie da się w tym timerku zrealizować, to program się nie skompiluje, bo za wszystkimi #ifdef'ami (tymi w których wybierane są preskaler i wartość do porównania) mam #elif #error "Takiej częsotliwości nie da się ustalić".
Jeśli chcesz, mogę tu wrzucić przykładowy kod takiego makra dla jednego licznika.
Najlepiej napisz jaki masz czujnik temperatury, jakim protokołem się z nim komunikujesz i jak to robisz