No, dziś wreszcie mogłem trochę przy kompie z C posiedzieć

Kończy mi się właśnie sezon weselny i mało czasu niestety na naukę mam - idzie zima to myślę, że nadrobię

mirekk36 napisał(a):
PO PIERWSZE - zbyt dużą częstotliwość ustawiłeś dla Timera1 do takich celów 1ms !!! Zupełnie niepotrzebnie do takich celów - wystarczyłoby 10ms. Piszę o tym trochę w bluebooku (co ? jak ? i dlaczego?) .... Pomyśl sobie ile czasu trwają operacje w przerwaniu biorąc pod uwagę prolog i epilog (przeanalizuj sobie nawet pobieżnie kod asm przerwania) ... Drga sprawa w bluebooku pokazałem nieco zoptymalizowany sposób działania na tych timerach programowych
Zgadza się częstotliwość jest dość wysoka, ale zawsze ją dobierałem w BASCOMIE aby zoptymalizować potrzebne czasy do odliczania i wykorzystać przeważnie 8-bitowe zmienne do tego celu. Ten "błąd" tak rażącego migania zauważyłem przez czysty przypadek kiedy komuś na priv demonstrowałem timery programowe.
W moich, niektórych większych projektach ustawałem jeszcze większą częstotliwość (np. 25kHz) i paradoksalnie efekt rozjazdu czasowego był tam pomijalny, a już na pewno nieistotny dla działania programu, który miał np. odliczyć 2 minuty czy 10 minut i jeśli ten czas uciekł mi nawet o 1-2s to tragedii nie było, bo czas ten był powtarzalny (!) i można go było spokojnie podrasować. Można sobie nawet z ciekawości w pierwszym programie ustawić przerwania na 10kHz i sam zobaczysz, że diody migają względnie stabilnie, a przede wszystkim bez nagłych skoków tak jak to miało miejsce przy wolniejszym timerze.
Książkę oczywiście czytam za koleją od początku i jestem już przy ADC i być może dlatego o kombinacjach z timerami programowymi jeszcze nie doczytałem

Czasem tylko wracam do poprzednich rozdziałów jeśli nagle mi się jakaś składnia zapomni...
Wróćmy do programu. Jakoś nie dopuszczam nawet myśli, żeby wyłączyć przerwania na czas badania warunków i takie rozwiązania mnie nie satysfakcjonują. Wróciłem do jednobajtowych zmiennych licznikowych tak jak to robiłem bardzo często w bascomie jeśli zależało mi na większej dokładności Myślałem po prostu, że obsługa przerwań będzie szybsza w C i taki błąd nie wystąpi (bascom naprawdę śmieci w przerwaniach!)... chyba się przeliczyłem

Do rzeczy - wszystkie liczniki z poniższego programu są 16-o bitowe i ustawione na 0,5s, ale tylko jeden tak naprawdę liczy ustawiony czas

język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Aha, czy przypadkiem aby była poprawna częstotliwość rejestr nie musi być uzupełniany liczbą 999?:
OCR1A = 999; //1000Hz 1ms (8000000/8/1000=1kHz)EDIT:Tak sobie kombinuje z tą składnią i coraz bardziej mi się podoba efektywność C. W powyższym kodzie jeszcze uprościłem licznik przez co zyskałem na nim aż 6 bajtów, a to sporo jak na jeden licznik w przerwaniach.
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nie ukrywam, że podobny zapis "
if (L1p-- <1)" podpatrzyłem w jednym z programów z bluboka (postanowiłem odnaleźć przed czasem te liczniki

).
Nawyk optymalizacji mam od początków mojego kontaktu z komputerami, a widzę, że w C jest spore pole do popisu
Myślałem, że jeszcze na takim zapisie coś zyskam "
if (!(L1p--))" ale kod w asm się nie zmienił nawet o 1 bajt.