Spróbuję to rozwiąć.
Podstawa czasu 2.5ms jest graniczną dla wyświetlacza (8 sztuk 7segmentów). Każdy case x: z odczytTemeratury(); (kod powyżej) zajmuje ~0.5ms - więc spokojnie się mieści w podstawie czasu 2.5ms
Powinno być tak:
pierwszyIF -> wyswietl(); + drugiIF->odczytTemeratury(); + pozostały czas do następnego przerwania. I tak powinno być cały czas.
Ale jeżeli:
pierwszyIF->wyswietl(); + drugiIF->odczytTemeratury(); + pozostały czas do następnego przerwania
I teraz jeśli z jakiś powodów znowu:
drugiIF->odczytTemeratury(); [to 'zabiera on' 0.5ms] + pierwszyIF->wyswietl(); + pozostały czas do następnego przerwania
Dwa 'drugieIFy' powyżej trwają łącznie 3ms i to już jest widoczne jako migotanie.
Albo inaczej pisząc na wykonanie 'pierwszychIFów' powyżej trzeba czekać powyżej 3ms, co jest już widoczne jako migotanie.
Powyższe zachowanie jest wynikiem zmiany kolejności wykonywania IFów. Ale jak pisałem powyżej, one nie są 'gubione' tylko wykonywane są tak jakby w losowy sposób ale zawsze oba.
Nie wiem czy bardziej wyjaśniłem czy zamotałem ale starałem się jak mogłem.
------------------------ [ Dodano po: 14 minutach ]auers napisał(a):
qutrit napisał(a):
Ta zmiana kolejności wykonywania ifów w rzeczywistości powoduje migotanie LED. Dlaczego ta zamiana występuje ? Zawsze wykonywane są oba ify, tylko czasami następuje zmiana kolejności ich wykonywania.
Sama zmiana kolejności sterowań przekaźnikami, przy takim kodzie jest możliwa.
Jeżeli przerwanie wykona się po pierwszym if'ie najpierw wywoła się obsługa przekaźnika2, a w następnym obiegu pętli dopiero obsługa przekażnika1.
------------------------ [ Dodano po: 36 minutach ]Powinieneś trochę zmienić podejście do obsługi zadań związanych z wyświetlaczem i odczytem danych.
Jeżeli masz wyświetlacz LCD, który obsługujesz przez multipleksowanie, to priorytetem jest obsługa tego wyświetlacza a nie odpytywanie temperatury.
W zależności od czujnika i czemu to ma służyć, temperaturę możesz odpytać np. raz na sekundę (przy DS18B20 i tak nie wiele szybciej możesz to zrobić). Szkoda zakłócać wyświetlacz obsługą DS'a.
Same if'y zostaw tak jak masz i będzie dobrze.
Ustaw tylko wartość test1 nie na 1 a np. na 400 i daj znać jaki jest efekt.
wlacz/wylaczPrzekaznikx() - służuły mi teraz to podłaczenia analizatora. Same przekaźniki na ten czas były oczywiście odłączone. Tylko nazwy funkcji pozostały.
Generalnie muszę odczyt temepratury podzielić na fragmenty, bo na raz się nie da. Tzn. wykonując wszystkie komendy raz/sekunde będę miał migotanie co sekunde (może i rzadziej niż teraz ale za to bardziej widzoczne).
"Ustaw tylko wartość test1 nie na 1 a np. na 400 i daj znać jaki jest efekt." Coś podobnego realizuję w 'case KONWERSJA_CZAS' w funkcji odczytTemeratury() (kod powyżej) ale też zamieszczam poniżej:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To znaczy zanim przejdzie mi do następnego case ( w tym przypadku powrót do case RESET:) to ten case KONWERSJA_CZAS wykona się 400 razy. Co w sumie i tak sprowadza się do odczytu temepratury co ~1sekunde.
Jak zauważyłem to zmiana kolejności wykonywania IFów następuje głównie w momencie wysyłania/odbierania danych z DSa. Przyczym jak pisałem powyżej IFy nie są gubione.
Tak jak pisałem powyżej. Jeżeli to migotanie w jakiś sposób zależałoby od funkcji wyswietl(); i odczytTemeratury(); to efekt byłby widoczy również w sytuacji gdy obie funkcjie umieszcze są w jednym IFie. A w tym przypadku
efekt migotania nie występuje. Pojawia sie tylko po umieszceniu tych funkcji w osobnych IFach.