Głównym podejściem prowadzącym do eliminacji _delay_ms jest zastosowanie Timerów programowych napędzanych timerem sprzętowym (najlepiej działającym w trybie CTC).
Zasada jest taka, że odpalasz sobie jeden z timerów sprzętowych w procu, żeby sobie tykał i liczył. Jego licznik będzie zwiększał się za każdym cyknięciem z predkością wynikającą z ustawionego preskalera.
Dla przykładu
F_CPU 16 MHz i preskaler 1024 spowoduje podzielenie 16MHz przez 1024 czyli licznik będzie zliczał impulsy o częstotliwości 15625 Hz. Włączasz sobie obsługę przerwania na zdarzenie CompareMatch czyli sytuacje gdy wartość licznika osiągnie zadaną wartość którą zapisujesz do rejestru OCRx. W przerwaniu inkremetujesz jakąś zmienną (musi być rodzaju volatile). Następnie w pętli głównej sprawdzasz czy wartość tej zmiennej osiągnęła jakąś wartość.
Przykładowo, ustawienie timera:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Procedura przerwania:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zmienne Timer1 i Timer2 zwiększają wartość co 10ms. (wartość OCR0 = 155); pierwsza funkcja będzie wykonywać się co 100ms druga co 1000ms.