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 10 lis 2025, o 02:31


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 18 sty 2015, o 01:12 
    Offline
    Nowy

    Dołączył(a): 16 lis 2014
    Posty: 3
    Pomógł: 0

    Witam.

    Mam następujący problem. Postanowiłem zrobić sobie własny protokół komunikacji za pomocą UART, którego chciałbym używać do komunikacji między Atmegami. Do testów posłużyłem się projektem Pana Mirka wyjaśniającym działanie bufora cyklicznego. Zmodyfikowałem go nieco do swoich potrzeb i pojawił się problem... modyfikacja polegała na tym, że w przerwaniu wywoływanym po odebraniu danych przez procesor, dodałem flagę która przyjmuje wartość 1 w momencie gdy odebrany bajt wskazuje na koniec sekwencji nadawania - jeżeli tak, drugie przerwanie pochodzące od timera może użyć bufora w którym znajdują się odebrane dane. Założeniem tego mechanizmu było zapewnienie pracy na buforze odbiorczym tylko w przypadku gdy zawiera dane zebrane pomiędzy bajty "FRAME_START" oraz "FRAME_STOP". Problem polega na tym, że w przerwaniu od timera, wspomniana flaga nie jest prawidłowo sprawdzana w warunku "if". Wiem to, bo wyrzuciłem wartość flagi na wyświetlacz - jeżeli w przerwaniu jest wspomniany if - flaga ma cały czas wartość 1 (ustawioną w prawidłowy sposób po pierwszej "paczce danych"), a funkcja w warunku nie wykonuje się. Jeżeli zakomentuję wspomnianego if - na wyświetlaczu widać zmianę tej zmiennej i funkcja z przerwania wykonuje się...
    Nie mam już pomysłu gdzie jest problem
    Proszę o jakieś sugestie - poniżej fragmenty kodu:

    plik mkuart.c:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    plik mkuart.h:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    plik main.c:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Ostatnio edytowano 18 sty 2015, o 11:00 przez golytm, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 sty 2015, o 10:14 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    Wrzuć kod w znacznikach syntax=c
    bo takie są zasady na forum a po drugie nie cały
    kod jest widoczny



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 sty 2015, o 11:01 
    Offline
    Nowy

    Dołączył(a): 16 lis 2014
    Posty: 3
    Pomógł: 0

    Przepraszam z tym syntaxem - poprawiłem. Widać cały kod któy wkleiłem - nie chciałem wklejać całego kodu z plików, bo trochę tego jest. Chyba że to pomoże, to oczywiście uzupełnię.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 sty 2015, o 11:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    co zwraca funkcja receive_status() przy poprawnym statusie
    bo jeśli zero to zmienna się nie wyzeruje
    ponieważ ten if się nie spełni .

    Czy dioda na PB1 mruga ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 18 sty 2015, o 11:33 
    Offline
    Nowy

    Dołączył(a): 16 lis 2014
    Posty: 3
    Pomógł: 0

    receive_status zwraca 1 jeżeli wykona się poprawnie (i wykonuje się). diada dodana w celach debugowych - żeby zobaczyć jak daleko dochodzi program. Jak usunę całkowicie if(buffer_ready){}, dioda miga, "buffer_ready" zmienia wartości tak jak zmieniać powinno (wyrzuciłem to na wyświetlacz i widzę aktualną wartość tej zmiennej). Jak pozostawię ten felerny if(buffer_ready){}, to pomimo tego że na wyświetlaczu widzę że "buffer_ready" ma wartość 1, to program nie wchodzi do tego warunku ("buffer_ready" pozostaje na wartości 1, dioda nie zmienia stanu).



    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 0 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