Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 13 lip 2025, o 15:37


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 20 sty 2016, o 21:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    Cytuj:
    Mimo to zawsze mryga on, gdy w cyfrze 2 segment "g" jest zapalony.
    Kiedy w cyfrze 2 segment "g" zgaszony, to w cyfrze 1 segment "g" nie mryga.

    Analogicznie jak zamienię cyf1 z cyf2 tj. na stałe wygaszę "g" w cyfrze 2, to mryga z kolei "g" w cyfrze 1.

    Coś pokręciłeś w opisie ;( W drugim zdaniu sugerujesz miganie w cyfrze 1 a w trzecim zdaniu że jak zamienisz to z kolei w cyfrze 1 ...

    --
    Pozdrawiam,
    Robert



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sty 2016, o 21:30 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    Cytuj:
    Nie umiem tego prościej wytłumaczyć

    Teraz już wiadomo o co chodzi.

    Pokaż jak masz zrobione definicje stałych typu PORT oraz fragment inicjalizacji portów.

    --
    Pozdrawiam,
    Robert

    ------------------------ [ Dodano po: 2 minutach ]

    Cytuj:
    No nic, za chwilę przełączę ten cholerny segment "g" do innego portu (choć nie mam już wolnego, ale w ramach eksperymentu).

    A na pewno nie mieszasz nigdzie w kodzie na PORTD i DDRD?
    Zakomentuj wszystko oprócz wyświetlania i zobacz czy nadal będzie problem.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sty 2016, o 22:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    I tu pies pogrzebany :)
    Robisz zmiany w pętli głównej i na przerwaniu.
    Daj ten kod w ATOMIC_BLOCK i będzie OK :)

    --
    Pozdrawiam,
    Robert


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 sty 2016, o 23:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    Operujesz w pętli głównej, czy wykorzystywanej tam bibliotece, na zasobie PORTD (L_RGB_PORT). Odbywa się to w cytowanym ostatnio case (tego którego zahashowanie naprawia wyświetlanie segmentu G). Robisz tam dwukrotnie odczytanie wartości portu, dokonanie manipulacji na tej wartości i ponowny zapis.
    A w przerwaniu timera TIMER0_OVF robisz podobne operacje na porcie D - dokujesz zmian stanu pinów.

    Co się według Ciebie stanie jak we wspominanym case nastąpiło już odczytanie PORTD i w tym momencie wystąpiło przerwanie TIMER0_OVF? Przerwanie ustawi sobie nowy stan dla pinów w PORTD (oczywiście zmieni tylko pin dla segmentu G). Ale po zakończeniu przerwania wrócisz do swojego case i tam masz dalsze operacje na odczytanej przed przerwaniem wartości PORTD. Więc po tej operacji nastąpi zapis do portu i .... bity które zostały zmienione w czasie przerwaniu zostaną odtworzone ze stanu przed przerwaniem.
    Dlatego w takich wypadkach używa się sekcji ATOMIC_BLOCK, która uniemożliwia przerwanie wykonywania danego bloku.
    Zrób w problematycznym case takie coś:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    }

    Tylko musisz jeszcze dodać jednego include do tego pliku:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    --
    Pozdrawiam,
    Robert



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 21 sty 2016, o 19:05 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    W ATOMIC_BLOCK wstawiaj jak najmniejsze ilości kodu. Tylko to co potrzeba, bo na czas wykonania tego bloku wstrzymywana jest możliwość obsłużenia przerwania to przerwania.
    Dałeś tylko kawałek kodu switcha z tylko jednym case, więc ciężko jest powiedzieć czy zasadne jest dawanie całego switcha w ATOMIC_BLOCK czy nie.

    --
    Pozdrawiam,
    Robert



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO