Jeszcze zauważyłem że analogiczny babol masz w drugiej pętli który powoduje że do rejestru nie trafia na koniec "0", nie widać tego bo po drugiej pętli masz wstawione OCR0A=0. I tu żeby to poprawić trzeba trochę pokombinować, albo zwiększając do 256 liczbę od której startuje "i" ale wtedy do rejestru trzeba załadować wynik wyrażenia (i-1) lub też ze zmiennej i zrobić int16_t a warunek wykonania pętli "i>=0".
dbaran napisał(a):
1. Jeżeli chciałbym użyć "trybu 5" z tabeli umieszczonej w pierwszym poście, gdzie WGM00 i WGM02 mają stan wysoki ( również jest tryb Phase correct PWM ) domyślam się, że wtedy "liczenie" odbywało by się do poziomu przeze mnie ustalonego ? Jeżeli tak to jak ustawić ten poziom ? Zmiennej OCRA nie ma w mikrokontrolerze, pytanie czy muszę taką stworzyć/zadeklarować ? Ewentualnie coś źle rozumuje.
Widzisz ten timer ma dwa rejestry porównania OCR0A i OCR0B, i na jego bazie możesz zrobić teoretycznie 2 -kanałowy PWM czyli na pinie OC0A (czyli PD6) procka jeden PWM którego wypełnienie regulujesz zapisując do rejestru OCR0A, natomiast drugi kanał na pinie OC0B (czyli pin PD5) procka, i jego wypełnienie ustalasz w rejestrze OCR0B - nie ważne czy to będzie Fast-PWM czy Phase Correct w trybie 1.
Dla czego napisałem wyżej teoretycznie, i tylko dla Phase Correct w trybie 1?
Otóż jak się przyjrzysz tabeli którą wcześniej przetoczyłeś to w trybie 1 licznik zlicza do TOP=0xFF czyli do pełna; natomiast dla trybu 5 licznik zlicza do TOP=OCR0A. W tym trybie Rejestr porównania A wyznacza niejako rozdzielczość PWM kanału B. Czyli jeśli ustawimy OCR0A np na 100, to w kanale PWM B można będzie regulować wypełnienie w zakresie od 0 - 100 ładując wartość do rejestru OCR0B, natomiast przekroczenie wartości 100 będzie równoznaczne z ustawieniem 0. (oczywiście analogicznie jak ustawimy OCR0A na 250, to wartości OCR0B będą w zakresie 0 - 250).
Oczywiście zmieniając wartość OCR0A zmieniamy rozdzielczość, ale co za tym idzie również częstotliwość generowania przebiegu, bo należy pamiętać że to nadal licznik który działa jak w trybie CTC z rejestrem porównania OCR0A. Reasumując w trybie PWM Phase Correct 5 tracimy niejako jeden kanał PWM na pinie OC0A/PD6.
Mam nadzieję że powyższe wywody będą zrozumiałe jak by co to pytaj.
dbaran napisał(a):
2. Kiedy dioda ma się "zaświecać" w pierwszej pętli ( a właściwie przed nią ) występuje błysk diody. Czy jest sposób, aby to zniwelować ?
Efekt ten wynika z tego jak masz podpiętą diodę (a zdaje się że masz anodą do plusa, katodą do portu) tak więc gdy na początku main pin diody ustawiasz jako wyjście to jako że wartości w rejestrach po starcie procka są zerowe, to pin po ustawieniu się jako wyjście ustawia na nim stan niski który powoduje zaświecenie diody do czasu zainicjalizowania timera. Wystarczy zaraz po ustawieniu pinu jako wyjście ustawić na nim stan na 1 czyli PORTD |= (1<<PD6), możesz nawet przed ustawieniem pinu jako wyjście ustawić w port na 1 (bo ustawiając go po to dla oka może jest to niezauważalne ale w rzeczywistości na pinie na ułamek sekundy pojawi się zero)