goslawen napisał(a):
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po pierwsze, jeśli w trybie Fast PWM chcesz uzyskać sygnał PWM na pinie OC0B (PD0), to musisz w rejestrze
TCCR0A ustawić bit
COM0B1, a nie
COM0A1.
Po drugie nie przedstawiłeś całego kodu, więc może to robisz w innym miejscu, ale dla uzyskania na wyjściu OC0B(PD0) sygnału PWM wymagane jest także ustawienie tego pinu jako wyjście:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dodatkowo w linii 2 Twojego kodu, wpisując nową wartość do rejestru TCCR0A, zerujesz bit WGM00, który wcześniej ustawiłeś w linii 1. Podobnie jest w linii 4. Aby tego uniknąć powinieneś zastosować operator
|= lub
| w następujący sposób:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Później wartość wypełnienia regulujesz poprzez wpisanie odpowiedniej wartości do rejestru
OCR0B. Należy jednak pamiętać o tym, że przy takich ustawieniach timera nie da się uzyskać wypełnienia 0%, czyli nawet wpisując do OCR0B wartość
0 nie da się uzyskać ciągłego stanu niskiego na pinie OC0B. Po każdym przepełnieniu licznika na wyjściu OC0B będzie pojawiać się krótkotrwały impuls.
Lex_ napisał(a):
Jeżeli rejestry są poprawne to tylko wpisać wartość od 0 do 255 i oczywiście nie zapomnieć o
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po pierwsze ten mikrokontroler nie ma rejestru TIMSK, tylko np. (między innymi) TIMSK0.
OCR0B to nazwa rejestru, a nie bitu. Zezwolenie na przerwanie od porównania realizuje bit OCIE0B w rejestrze TIMSK0.
Włączenie przerwań od porównania wcale nie jest konieczne do wygenerowania sygnału PWM.