Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8] [C] - RGB po raz kolejny

@Kamil 15 Wrz 2014 19:42 807 7
  • #1 15 Wrz 2014 19:42
    @Kamil
    Poziom 23  

    Witam, mam pewien problem, próbuje przerobić kod do sterowania diody z Attiny 2313, na Atmega8 taktowana wewnętrznym 1MHz z tematu: Link

    Kod Oryginalny:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Natomiast mój wygląda tak:
    Na początku ustawione timery, czy są właściwie ustawione?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a cały kod wygląda tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problemem jest to że wszystkie 3 diody bardzo szybko migają. Myślę że ustawienie timerów jest prawidłowe bo gdy ręcznie wpiszę jakąś wartość do OCR1A to dioda zapala mi się z różną jasnością (w zależności jaką wartość wpiszę). Gdzie jest błąd? Prosił bym o jakieś nakierowanie, jednak dodam, że dopiero się uczę.

    0 7
  • #2 15 Wrz 2014 20:57
    BlueDraco
    Specjalista - Mikrokontrolery

    Napisz jeszcze, na czym polega problem, bo na razie wygląda na to, że napisałeś kod do szybkiego migania diodami i diody szybko migają.

    A tak ogólnie - do odmierzania czasu używa się timera, a nie pętli, zwłaszcza, gdy czas wykonania kodu silnie zależy od wartości zmiennych.

    Przy takiej deklaracji zmiennej delay kompilator może usunąć Twoją pętlę opóźniającą.

    0
  • #3 15 Wrz 2014 21:13
    @Kamil
    Poziom 23  

    Dzięki za odpowiedź. Tak jak pisałem ten kod jest przerobiony z postu który podałem. Tam jest sterownik RGB, kolory płynnie się zmieniają, chciałem uzyskać taki sam efekt tyle tylko że na Atmega8. Jednak diody zamiast płynnie się rozjaśniać i ściemniać - mygają.

    Czyli dobrze rozumiem że problem jest w tej pętli opóźniającej? I aby to działało muszę użyć jeszcze jednego timera?

    0
  • #4 15 Wrz 2014 21:19
    tronics
    Poziom 36  

    Niekoniecznie. Może wystarczy dodać po while(--delay) np. asm volatile ("nop")

    0
  • #5 15 Wrz 2014 21:34
    @Kamil
    Poziom 23  

    Dziękuję sprawdzę to jednak dopiero jutro będę miał możliwość. A mógłbym prosić o wyjaśnienie co ta komenda znaczy?

    0
  • #6 15 Wrz 2014 21:46
    tronics
    Poziom 36  

    Dodaje nieusuwalną przez kompilator instrukcję asemblera "nop" (nic nie rób, bodajże 1 cykl i 1 bajt) nie pozwalając tym samym na usunięcie "nic nie robiącej" pętli. Nie jestem teraz pewien, czy akurat w tym wypadku jest to uzasadnione, ale podejrzewam, że jest to jedno z działających rozwiązań :) Przy okazji - warto korzystać z plików .lss ! Widać jasno czy kompilator coś wyrzucił. A w sumie nie wiem czy nie wystarczyłoby dodanie atrybutu volatile dla samej zmiennej delay - wtedy chyba też kompilator nie wyrzuciłby tego while(--delay).

    0
  • #7 16 Wrz 2014 10:52
    BlueDraco
    Specjalista - Mikrokontrolery

    Czas powinien być odliczany w przerwaniu timera generującego PWM dla diody. Cała funkcjonalność programu powinna być właściwie umieszczona w procedurze obsługi tego przerwania.

    0
  • #8 16 Wrz 2014 20:24
    @Kamil
    Poziom 23  

    Witam, faktycznie komenda asm volatile ("nop") działa. Jednak ten delay trochę mi przeszkadza w funkcjonowaniu programu. Mógłbym prosić o podpowiedź jak zrobić to na tych przerwaniach?

    0