nanab napisał: . Deklarując zmienną "dowpisania" jako bajt nic się nie zmienia.
W czasie jednej pełnej pętli głównej licznik zwiększa się o 3, więc dla najwyższej możliwej częstotliwości pętla wykona się 16 razy zanim dojdzie do przerwania, nawet zostawiając w głównej pętli wysyłanie ocr2 przez uart, gdyby wywalić tę linijkę, pewnie trwałoby to jeszcze krócej.
Nie zmienia, bo masz błąd w innym miejscu.
A w ogóle to powinieneś ten program przepisać od początku. Tak, (zbyt dużo błędów aby je pojedynczo korygować!), a przed tym, zaznajomić się z funkcjonalnością timerów, a w szczególności ich trybów pracy.....
Zastanów się, co oznacza nazwa trybu CTC (?) – w ang. jest to ‘
Clear
Timer on
Compare’ (pol. - wyzeruj zawartość licznika/timera, gdy jego zawartość jest równa wyznaczonej z góry i ustalonej, bądź to wyliczonej jakiejś wartości w zmiennej ‘Compare’). Zmienna ta jest umieszczona w rejestrze OCR2 (Compare2).
Zatem (w tym trybie), zawartość licznika nigdy nie osiągnie jego maksymalnego stanu 255, momentu w którym może wystąpić interrupt OVF2 (w Bascom jest to nazwane ‘Timer2’) z tytułu przepełnienia tego licznika.
Jeżeli chcesz wywołać przerwanie przy porównaniu zawartości TCNT2 z OCR2, to powinieneś skonfigurować przerwanie od ‘OC2’, albo w Bascom jest to ‘Compare2’, gdzie obie nazwy są akceptowane.
Już na samym początku konfiguracja zmiennych nie jest poprawna...
Zadeklarowanie zmiennej ‘integer’ do odczytu ADC nie jest poprawne.
W Bascom zmienna integer może mieścić liczby zarówno ujemne jak i dodatnie: (-32768 do +32767).
Twój odczyt ADC nigdy nie będzie ujemny, więc stosowne byłoby przyjąć ‘word’ (2 bajty).
W Bascom, nie musisz nic kombinować z uśrednianiem zmiennej z dwóch pomiarów bo program już to robi za ciebie, chociaż tego w programie nie widać!
Aby zabezpieczyć się od zerowych odczytów z potencjometru możesz wprowadzić ograniczenie (SW) softwarowe w programie warunkiem ‘If/then’ albo HW; dodając odpowiedni rezystor pomiędzy potencjometr i GND.
Jeżeli chcesz mieć 8-bitowy odczyt z ADC (obcinając dwa dolne bity), możesz tego dokonać inna metodą:
Ustawić bit (5) ADLAR w rejestrze ADMUX powodujący przesunięcie w lewo wyniku z konwersji ADC i odczytywać tylko górny bajt ADCH. Praktycznie podzielenie przez 4 całego odczytu ADC daje ten sam rezultat.
U ciebie podwojony wynik /8.
nanab napisał:
Czas obsługi przerwania-nie mam pojęcia ile trwa, ale nic tam nie ma, odłożenie adresu na stos, wpisanie jednej wartości do jednego rejestru i powrót, kwestia pojedynczych us(nie liczyłem, zgaduję).
W Bascom, jeżeli nie stosujesz ‘no save’ , potrzebujesz przyjąć minimum 64 cykle zegara na obsługę przerwania + to co jest tam do zrobienia; w twoim przypadku będzie to dodatkowe 5 cykli.
Ponieważ masz prescaler ustawiony na 256 więc nie ma obawy na brak czasu pomiędzy przerwaniami.
e marcus
Marek Skalski: Poprawiłem pisownię. Nie trzeba krzyczeć. 