Witam.
Projektuję prosty układ na podstawie ATMegi328, jedną z części tego układu jest pasek kilku diod LED, który ma stopniowo zwiększać częstotliwość migania diod do osiągnięcia zadanej wartości w ustalonym czasie. Obsługa paska LED zrealizowana jest przez przerwanie generowane przez TIMER1 skonfigurowany następująco:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przerwanie zrealizuje prostą funkcję switch przełączającą stany diod:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po wciśnięciu przycisku start, diody mają "rozpędzić się" do zadanej prędkości. Zrealizowałem to 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.
Z kodu wynika, że wartość OCRA1 jest skokowo obniżana, co powoduje zwiększenie częstotliwości występowania przerwania. Niestety nie działa to prawidłowo, podczas przyspieszania program w przerwaniu dostaje chwilowych zwiech w losowych momentach, co skutkuje chwilowym zatrzymaniem przesuwającego się paska. Analogicznie napisałem funkcję działającą w drugą stronę, powodującą hamowanie diod, działa ona zgodnie z zamierzeniami bez żadnych zawieszeń.
Proszę o nakierowanie w znalezieniu błędu, oraz o wyrozumiałość, gdyż jest to jeden z moich pierwszych projektów.