Witam,
Używam mikrokontrolera ATmega128. W moim programie użytkownik ustawia wartość prądu (liczba całkowita od 0 do 1000) oraz czas (od 1 do 40 sekund). Prąd ma narosnąć od 0 do wartości ustawionej w ustawionym czasie. Funkcja służąca do obliczania aktualnej wartości prądu podczas jego narastania jest wywoływana z pewną częstotliwością (od 10 do 60Hz, zależnie od ustawienia w parametrach programu). Zatem narastanie prądu odbywa się w liczbie kroków wyrażonej wzorem: K = czas[s] * częstotliwość[Hz]. Żeby uniknąć obliczeń zmiennoprzecinkowych, zastosowałem algorytm Bresenhama do kreślenia odcinków. Zapowiada się, że będzie to działać bardzo szybko, gdy K >= wartość prądu. Gdy K < wartość prądu, to algorytm Bresenhama normalnie kreśli odcinek w pętli "idąc po zmiennej Y". Tymczasem ja działam w osi odciętych, czyli X (u mnie jest to liczba kroków, w których prąd ma narosnąć). Bez większych problemów przerobiłem ten algorytm tak, aby dla K < wartość prądu, "szedł on po zmiennej X". Przy czym po tej przeróbce uzyskałem podpętlę (while), która niekiedy będzie wykonywać się wiele razy (dla pojedynczego kroku w osi X), co spowolni algorytm. Inną metodą, zamiast tej podpętli, byłoby zastosowanie dzielenia, co też nie jest rozwiązaniem, gdyż dzielenie realizowane jest przez kompilator także w pętli. Poniżej przedstawiłem algorytm, który stosuję -- na razie to jest wersja kreśląca grafikę (tak łatwiej mi obserwować działanie tego algorytmu), a nie funkcja wywoływana z pewną częstotliwością i sterująca prądem. Algorytm działa prawidłowo. Przy czym może działać niekiedy wolno (pętla while może wykonywać się wiele razy) dla K < wartość prądu -- no i to jest mój problem. Mam pytanie do Was, jak przyspieszyć ten algorytm? A jeśli się nie da, to byłbym wdzięczny za naprowadzenie na jakiś inny sposób zaprogramowania opisanego problemu (narastania wartości w pewnej liczbie kroków).
Ilustracja graficzna działania poniżej zaprezentowanego algorytmu:
if (K >= wartoscPradu) { for (t = 0; t <= K; t++) { drawPixel(px, py); y += wartoscPradu + 1; if (y >= K + 1) y -= K + 1, py++; px++; } } else { for (t = 0; t <= K; t++) { while (1) { x += K + 1; if (x >= wartoscPradu + 1) { drawPixel(px, py); x -= wartoscPradu + 1, px++; py++; break; } py++; } } }
Pozdrawiam i z góry dziękuję za pomoc, Robbo