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



Teraz jest 5 gru 2024, o 02:25


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 1 gość


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