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 30 kwi 2025, o 01:23


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
    Autor Wiadomość
     Tytuł: Printf i UART
    PostNapisane: 27 wrz 2018, o 13:29 
    Offline
    Użytkownik

    Dołączył(a): 14 wrz 2017
    Posty: 85
    Pomógł: 1

    Witam,
    Zapewne pytanie banalne, ale w przypadku użycia skonfigurowaniu UART i skorzystanie z printf() z standardowej bibloteki to czy do wysylki odbioru to wykorzystywane jest przerywanie czy na czas wysyłki program jest blokowany i całość jest robiona w programie głównym?

    Michał Szymanski



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 wrz 2018, o 19:24 
    Offline
    Użytkownik

    Dołączył(a): 02 gru 2015
    Posty: 548
    Pomógł: 27

    Słuchaj co to znaczy standardowa biblioteka dla Mirka jego jest standardowa dla mnie Moja dla kogoś innego jego jest standardowa chce Ci przez to powiedzieć że to nie forum wróżek jak chcesz uzyskać pomoc to wklej kod albo jak masz bibliotekę z BB lub GB to napisz że chodzi o te.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 wrz 2018, o 20:55 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    tonygryps napisał(a):
    Słuchaj co to znaczy standardowa biblioteka...

    https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa

    Funkcja printf należy do biblioteki standardowej avr-libc stdio
    Zgodnie z tym cytatem:
    Cytuj:
    The standard streams stdin, stdout, and stderr are provided, but contrary to the C standard, since avr-libc has no knowledge about applicable devices, these streams are not already pre-initialized at application startup. Also, since there is no notion of "file" whatsoever to avr-libc, there is no function fopen() that could be used to associate a stream to some device. (See note 1.) Instead, the function fdevopen() is provided to associate a stream to a device, where the device needs to provide a function to send a character, to receive a character, or both.

    biblioteka ta nie zawiera funkcji wysyłających czy też odbierających dane przez UART. Użytkownik biblioteki musi sobie taką funkcję napisać sam. To od niego zależy, czy będzie używał przerwań czy też nie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2018, o 11:47 
    Offline
    Użytkownik

    Dołączył(a): 14 wrz 2017
    Posty: 85
    Pomógł: 1

    andrews napisał(a):
    tonygryps napisał(a):
    Słuchaj co to znaczy standardowa biblioteka...

    https://pl.wikibooks.org/wiki/C/Biblioteka_standardowa

    Funkcja printf należy do biblioteki standardowej avr-libc stdio
    .



    To może inaczej zadam pytanie. Jak tworzycie soft na atmege to domyslam sie, ze uzywacie UARTa aby przez putty miec wglad co wykonuje procek - pytanie uzywacie jakies gotowej bibloteki czy po prostu tworzycie stringi i uzywacie w petli funkcji uart_putc i wysylacie cały string?

    Michał



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2018, o 11:59 
    Offline
    Moderator
    Avatar użytkownika

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

    szymanskim napisał(a):
    To może inaczej zadam pytanie. Jak tworzycie soft na atmege to domyslam sie, ze uzywacie UARTa aby przez putty miec wglad co wykonuje procek - pytanie uzywacie jakies gotowej bibloteki czy po prostu tworzycie stringi i uzywacie w petli funkcji uart_putc i wysylacie cały string?

    Panie - wysyłanie danych czy to w trybie ASCII czy binarnym to NAJMNIEJSZY problem, przy większych prędkościach nie wymaga nawet praktycznie buforowania - a więc można wysyłać w oparciu o fragment kodu praktycznie wprost z noty PDF (jak chodzi o pojedynczy znak) bo przecież później wysyłanie stringa to tylko

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


    więc tu żadnej filozofii nie ma .... Ale jeśli chce się mieć buforowanie cykliczne nadawanych danych, co ma szczególne znaczenie gdy np korzysta się z niskich prędkości żeby nie blokowało programu głównego - no to wtedy warto oprzeć wszystko o jakiegoś LIB'sa - napisać go samemu nawet .... a przykład i DOKŁADNE omówienie w jaki sposób to zrobić masz w Bluebooku:

    https://atnel.pl/mikrokontrolery-avr-jezyk-c.html

    tyle że NAJWAŻNIEJSZE jest jednak odbieranie danych ..... bo tu PRAKTYCZNIE zawsze (no może nie zawsze) ale stosuje się buforowanie (bufory cykliczne) niezależnie od baudrate, żeby nie tracić danych

    _________________
    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: 3 paź 2018, o 12:09 
    Offline
    Użytkownik

    Dołączył(a): 14 wrz 2017
    Posty: 85
    Pomógł: 1

    To ja wiem i w kodzie mam bufor cykliczny i przerywania , chyba zbyt mało precyzyjnie napisałem :) oczywiście można użyć tą funkcję która ze stringa przepisuje do bufowa.
    Ja się o co innego pytam, jeśli przykładow chciałbym przesłać na putty taki tekst "Aktualna temperatura 20C" gdzie 20C jest brane z inta to muszę to zrzutować na string a później ten string przesłać przez UART'a.
    Pytanie czy używacie printf czy po prostu używacie sprintf a później w pętli uart_putc ?
    Znalazłem jakieś przykłady gdzie jest taka konstrukcja:

    FILE uart_str = FDEV_SETUP_STREAM(uart_putc , NULL, _FDEV_SETUP_WRITE);

    chociąż nie bardzo rozumiem z przykładu implementacje uart_putc

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


    Zastanawiam się jaki sens jest parametru "stream" chyba, że on po prostu musi być i tyle.

    i z tego co na razie zrozumiałem "wiążę" to strumień z naszą funkcją do wysłania znaku (a właściwie do wrzucenia znaku do bufora) i jak to zrobimy po prostu można używać printf. Co prawda jeszcze tego nie testowałem, zrobię to jak wróce do domu - pytanie jakie rozwiązanie jest przez was rekomendowane.



    Michał



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2018, o 12:36 
    Offline
    Moderator
    Avatar użytkownika

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

    Już wyżej kolega andrews odpisał ci precyzyjnie:

    post212091.html#p212091

    a ty wciąż zadajesz ....hmm sorki wybacz, troszkę dziwne pytanie: "jak wy to robicie?" Toż to zależy od programisty, indywidualnych potrzeb, założeń projektu itp itd - nie ma uniwersalnej odpowiedzi.

    Z praktyki mogę tylko powiedzieć, choć mogę się mylić oczywiście, że rzadko kto sobie przełącza strumień do printfa - skoro i tak używa jakiejś biblioteki do obsługi UARTA, która jeśli już jest to zwykle serwuje różne gotowe funkcje....

    szymanskim napisał(a):
    gdzie 20C jest brane z inta to muszę to zrzutować na string a później ten string

    ło matko ;) ..... ja bym ci jednak polecił zapoznać się z podstawami języka C zanim będziesz pisał o takich rzeczach ... których delikatnie mówiąc nie ma w C ;) jakie rzutowanie inta na stringa ? Jak masz miejsce we Flash to wystarczy zrobić

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


    i wysłać bufor czyli tak utworzony string przez UARTA

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


    i po zawodach.

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

    oczywiście można i bez sprintf() .... można samemu tworzyć w locie string, można posługiwać się funckjami do sklejania stringów jak strcat() , itoa() itp itd itp

    _________________
    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: 3 paź 2018, o 12:58 
    Offline
    Użytkownik

    Dołączył(a): 14 wrz 2017
    Posty: 85
    Pomógł: 1

    Ok, rozumiem. W C i innych językach programuję już 20 lat i to w ramach normalnej pracy (i w tym czasie tekstów naparsowałem się bez liku) tak więc 'mniej więcej' wiem o co w tym chodzi z tym że programowałem duże systemy serwerowe, użycie słowa "rzutowanie" było skrótem myślowym.

    Co do pytania "jak to robicie" zdaje sobie sprawy, że nie ma rozwiązania uniwersalnego chodziło o dobre praktyki. W dużych systemach nikt się nie bawi nawet w używanie w printf (czy jak mowa o javie system System.out.println) bo są bibloteki typu log4j, tylko zdaje sobię sprawę że programowanie mikrokontrolerów rządzi się swoimi prawami i to co w programowaniu serwerów jest normą (typu programowanie obiektowe, dążenie do jak największej czytelności/łatwości utrzymania kodu kosztem np. pamięci) w kontrolerach wygląda inaczej. Z tego powodu chciałem się podpytać co sugerujecie , bo może np. użycie printf jest to armata na muchę.

    Tak czy inaczej dzięki za informację :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 paź 2018, o 17:38 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    szymanskim napisał(a):
    i z tego co na razie zrozumiałem "wiążę" to strumień z naszą funkcją do wysłania znaku (a właściwie do wrzucenia znaku do bufora)

    Chciałbym jeszcze tylko wyjaśnić, że jeśli już zdecydujesz się na użycie printf, to ta przykładowa funkcja podana przez Ciebie (czy też ta w dokumentacji biblioteki stdio z avr-libc) blokuje mikrokontroler na czas wysłania całego ciągu znaków przez UART, a więc na dość długo (szczególnie przy małych prędkościach transmisji). Zdecydowanie lepiej byłoby właśnie napisać funkcję, która (tak jak podałeś w nawiasie) dodaje tylko znak do bufora (cyklicznego), a transmisja odbywa się z wykorzystaniem przerwań.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2018, o 19:31 
    Offline
    Użytkownik

    Dołączył(a): 14 wrz 2017
    Posty: 85
    Pomógł: 1

    Dzięki. Swoją droga czy w bluebooku w kodzie do obsługi nie brakuje załączenia wszystkich przerywań przynajmniej w Atmega328p musiałem dodać SREG |= 0x80 zeby kod ruszył. Chyba, że domyśnie w atmega32 przerywania są włączone.

    Michał



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2018, o 19:56 
    Offline
    Moderator
    Avatar użytkownika

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

    szymanskim napisał(a):
    Dzięki. Swoją droga czy w bluebooku w kodzie do obsługi nie brakuje załączenia wszystkich przerywań przynajmniej w Atmega328p musiałem dodać SREG |= 0x80 zeby kod ruszył. Chyba, że domyśnie w atmega32 przerywania są włączone.

    Michał


    Nic nie brakuje, a przerwania włącza się poleceniem w C dla AVR:

    sei();

    _________________
    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 13 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO