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 w 2025? 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 26 maja 2025, o 02:15


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 4 mar 2018, o 18:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 581
    Pomógł: 17

    Hej
    W całości rozumiem sen używania przerwań RS232 podczas gdy obieramy dane.

    Ale mam problem ze zrozumieniem wysyłania danych kiedy wykorzystujemy i nie wykorzystujemy przerwań.
    Czym różnią się te zapisy:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


    Program załącza diodę, czeka 500ms,wysyła dane po rsie, potem wyłącza diode i znów czeka 500ms

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

    Tu też załączana jest dioda, mamy opoźnienie 500ms, potem wysyłamy dane przez przerwanie, czyli program skacze do obsługi przerwania, wysyła to co ma wysłać i wraca, po powrocie wyłącza diodę i czeka 500ms.

    Czym się różnia w takim razie te 2 programy (korzystające i niekorzystające z przerwań)?
    Byłbym w stanie to zrozumieć, że jeśli wysyłamy coś przez HAL_UART_Transmit_IT, to program w pętli main dalej działa,a wysyłanie jest realizowane niejako równolegle,, ale chyba się to tak nie dzieje?, tylko program z miana jest zatrzymany i potem jest skok do obsługi przerwania?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 18:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 cze 2014
    Posty: 820
    Lokalizacja: Tam gdzie PYRY są
    Pomógł: 64

    Po pierwsze kolego, to w avr nie ma, że jak coś się wykonuje w przerwaniu to robi się równolegle. Obsług przerwania też zatrzymuje niejako pracę pętli głównej i zajmije czas procesorowi Dlatego między innymi obsługa przerwania powinna być jak najkrótsza. Dlatego też w niektórych bardzo ważnych czasowo częściach programu blokuje się możliwość zadziałąnie przerwania komendą cli. Potem odblokowuje się je z powrotem.

    Wysyłanie i odbiór przez uart sprzętowy "idzie" poza programem głównym i niezależnie od niego ale obsługa przerwania już nie

    Co do różnic w funkcjach, musiałbyś pokazać ich ciała a nie tylko nagłówki...

    Poza tym wysłąnie czegokolwiek przez RS jest niczym w porównaniu z czekaniem bezczynnie 500ms

    _________________
    IntegraMETEO
    WordCLOCK
    IntegraTOUCH



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 18:25 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 581
    Pomógł: 17

    Troche tu namieszane będzie bo temat jest w dziale o ARM,ale spójrz:

    W nocie do Amtegi32 znajdziemy taką funkcję, która wysyła znak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Mirek w swoich bibliotekach również stworzył funckję wysyłająca char (ale korzystając z przerwań)
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    No i moje pytanie to jakie sa różnice pomiędzy tymi 2 funkcjami?

    BO przy OBDIERANIU DANYCH to w 100% to rozumiem, ze lepiej korzystać z przerwań i nie blokować programu, ale przy wysyłaniu to nie do końca to przemawia do mnie



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 18:41 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27405
    Lokalizacja: Szczecin
    Pomógł: 1043

    to weź kalkulator i sobie policz ile potrwa wysłanie np 200 bajtów przy prędkości np 2400 i 115200 - może wtedy zacznie coś ci świtać

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 19:05 
    Offline
    Użytkownik

    Dołączył(a): 05 wrz 2017
    Posty: 169
    Pomógł: 31

    Ja uzmysłowiłem sobie sens korzystania z przerwań UART TX przy nadawaniu danych, gdy chciałem w jednej ramce nadać więcej niż wynosi sprzętowy bufor nadajnika UART. Wtedy ustawiasz przy jakim zapełnieniu bufora ma wystąpić ISR, który wczytuje z bufora programowego do bufora sprzętowego kolejne dane. W ten sposób nadajesz ciągłą ramkę bez jakiś nieokreślonych odstępów pomiędzy znakami.
    Tak jak napisał Pan Mirek, przy większej ilości znaków zobacz jak kod będzie wyglądał z wykorzystaniem przerwań i bez przerwań.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 21:33 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27405
    Lokalizacja: Szczecin
    Pomógł: 1043

    abel11 napisał(a):
    przy większej ilości znaków zobacz jak kod będzie wyglądał z wykorzystaniem przerwań i bez przerwań

    Kod jak kod ;) nie chodzi nawet o większe ilości znaków

    proponuję przeliczyć sobie ile zajmuje wysłanie jednego bajtu przy dwóch różnych prędkościach np 2400 i 115200, pomnożyć to przez kilkanaście chociażby bajtów i spróbować sobie odpowiedzieć na pytanie - o co chodzi z tym czasem ? ;) gdzie i kiedy może on przeszkadzać ? o jaki czas w ogóle chodzi ? .... ot proste ćwiczenie

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 22:05 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 581
    Pomógł: 17

    Mirku, staram się jak mogę a ogarnąć nie potrafię.
    Domyślam się, że przy niskiej prędkości np. 2400 wysyłanie powiedzmy 500 bajtów zajmie masę czasu.

    Ale przecież każda funkcja zarówno blokująca :
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    jak i ta korzystająca z przerwań
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    wyśle te dane w tak samo długim czasie - jestem nawet w stanie powiedzieć, że uart_putc będzie wysyłało dłużej.

    Więc dalej załóżmy ten mój program:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    załóżmy tę prędkość 2400 więc:
    1/2400=0,4ms
    czyli jedna ramka z jednym bajtem leci w ciągu ok 0,4ms.
    Pomnóżmy to razy pięćset i mamy całą transmisję wykonaną w 2sekundy.

    A co się zmieni jeśli teraz zamiast funkcji blokującej użyjemy tej korzystającej z przerwań?
    Czas transmisji CHYBA dalej będzie wynosił 2sek ?
    Niestety zostawiłem w domu zestaw uruchomieniowy i nie mogę sobie na żywym organizmie sprawdzić jak będą się różniły czasy wysłania tego przy korzystaniou z funkcji blokującej i nieblokującej.
    Więc proszę o wyjaśnienie tego;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2018, o 23:40 
    Offline
    Użytkownik

    Dołączył(a): 05 wrz 2017
    Posty: 169
    Pomógł: 31

    Może się mylę ale prędkość przy podanym BAUDRATE = 2400 to będzie 1/2400 * ( [liczba bitów danych] + START + STOP + PARITY )
    Przyjmując, że mamy 8 bit danych, rezygnujemy z parity i dajemy jeden bit stop to wychodzi: 1/2400 * ( 8 + 2 ) = 4,167 ms na znak.

    Powiedzmy, że chcesz wysłać 5 znaków w ramce; przyjmijmy też, że sprzętowy bufor może pomieścić max 3 znaki.
    Teraz skąd funkcja blokująca 'wie' kiedy można wpisać kolejny znak do bufora sprzętowego? Pewnie sprawdza flagę czy bufor jest wolny.
    Tym sposobem program spędzi 2 * 4.167ms = 8.334 ms głównie na sprawdzaniu flagi zajętości bufora sprzętowego (2 * 4.167ms ponieważ 2 bajty trzeba dodać do bufora 5-3 = 2).

    Natomiast z przerwaniem wyglądało by to tak:
    Przerwanie wystapi jak bufor sprzętowy jest pusty (właśnie nadaje ostatni znak) -> dopisanie kolejnych bajtów z programowego bufora do bufora sprzętowego (kilka cykli zegara zaledwie) -> powrót na 3 * 4.167ms (długość bufora * czas znaku) do pętli głównej programu (jeśli przyjmiemy, że przerwanie ma być wywołane gdy nadawany jest ostatni bajt ).

    Teraz zastanów się co będzie przy 400 znakach.
    Dla funkcji nie blokującej będzie to 100 wywołań ISR po kilka us każde.
    Natomiast funkcja blokująca będzie czekała, aż nada wszystkie znaki z wyjątkiem ostatnich 3 mieszczących się w buforze, czyli 400 - 3 = 397 znaków * 4.167ms każdy = 1.654 sekundy.

    Jeśli nic nie pokiełbasiłem to by był powód stosowania ISR w nadajniku, jeśli pokiełbasiłem Pan Mirek z pewnością naprostuje mój błąd.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 mar 2018, o 01:14 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27405
    Lokalizacja: Szczecin
    Pomógł: 1043

    No DOKŁADNIE o to chodzi ;) dzięki przerwaniom i wolniejszej prędkości można uzyskać (oczywiście w zależności od ilości przesyłanych danych) to, że główny program nie będzie blokowany.

    Oczywiście jeśli stosujemy prędkość 115200 to często czas nadawania krótkich wiadomości nawet bez przerwań będzie na tyle krótki, że można pokusić się (w zależności od potrzeb) żeby nie używać buforów nadawczych z przerwaniami

    oczywiście te dwie prędkości podałem tak dla kontrastu i przykładu aby porównać czasy - bo jak widać wtedy zaczynamy czuć w czym rzecz ;)

    W efekcie końcowym teraz mam nadzieję będzie jaśniej kiedy i jak dobierać sobie odpowiednie mechanizmy w tym zakresie dla dowolnych prędkości


    Autor postu otrzymał pochwałę

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 mar 2018, o 08:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 581
    Pomógł: 17

    Dzięki wielkie;-)
    Teraz już to rozumiem ;-)
    Dzięki za pomoc;-)



    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: 10 ] 

    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