eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaATmega, jak zaprogramować narastanie wartości sygnału, bez użycia operacji zmiennoprzecinkowych? › ATmega, jak zaprogramować narastanie wartości sygnału, bez użycia operacji zmiennoprzecinkowych?
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
    .pl!news.nask.org.pl!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo
    -a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
    From: "Robbo" <n...@g...com>
    Newsgroups: pl.misc.elektronika
    Subject: ATmega, jak zaprogramować narastanie wartości sygnału, bez użycia
    operacji zmiennoprzecinkowych?
    Date: Tue, 9 Oct 2012 01:43:37 +0200
    MIME-Version: 1.0
    Content-Type: text/plain; format=flowed; charset="iso-8859-2"; reply-type=original
    Content-Transfer-Encoding: 8bit
    X-Priority: 3
    X-MSMail-Priority: Normal
    X-Newsreader: Microsoft Outlook Express 6.00.2900.5931
    X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157
    X-Antivirus: avast! (VPS 121008-0, 2012-10-08), Outbound message
    X-Antivirus-Status: Clean
    Lines: 64
    Message-ID: <5073652e$0$26682$65785112@news.neostrada.pl>
    Organization: Telekomunikacja Polska
    NNTP-Posting-Host: 95.49.52.145
    X-Trace: 1349739822 unt-rea-a-01.news.neostrada.pl 26682 95.49.52.145:1916
    X-Complaints-To: a...@n...neostrada.pl
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:636325
    [ ukryj nagłówki ]

    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:
    http://imageshack.us/a/img341/925/74439722.png

    K = czas * czestotliwosc;

    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

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: