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 25 lip 2025, o 01:16


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 27 wrz 2018, o 00:05 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 17 wrz 2015
    Posty: 16
    Pomógł: 0

    Witajcie,

    przychodzę z problemem, który meczy mnie od dłuższego czasu :/

    Obrazek

    Niebieskie piki do masy to dane przesyłane przez uart z komputera do mikrokontrolera, żółte, to piki które AVR uznaje jako poprawną transmisje.
    Jak widać sporo błędów, jedna transmisja na 4 jest uznawana za poprawną... I to ten problem :/
    Myślę, że to nie BaudRate, wprawdzie 16MHz, ale 76800.

    Jak sprawdzam czy transmisja jest poprawna?
    Oto co wysyłam:
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Czyli wysyłam jeden bajt rozpoczynający - 85(% w ASCII) kod uint8_t R, G, B, i bajt kończący - '\n'.

    I sprawdzam w kodzie AVR, czy bajt '%' jest w buforze odczytu na miejscu 0:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    jak jest to spoko, jak nie to kicha.

    No i ta kicha jest za często... tak o 4 razy za często, buforek mi się przekręca...

    Jest to uart_getln(buforek,5); funkcja ta sczytuje 5 bajtów, lub do znaku nowej linii '\n'.

    i chodzi o to, że bajt rozpoczynający w tym buforze jest raz na miejscu 0 raz na 1, 2, 3, 4 itd...
    Przekręca mi się w buforze :/

    Niby spoko, mogę sobie napisać by czytało wartości od bitu start w buforze na miejscu 1,2,3 zamiast 0, no i tak zrobiłem, podziałało, częstotliwość wykonywania wzrastała, ale ta funkcja odczytu danych zawsze usuwa po odczycie ostatni bajt buforu na 0 albo null, więc jak mam na 3 miejscu w buforze bajt rozpoczynający (%) to na 5 mam uint8_t R, a dalej 0 czyli tylko zmienna R jest użyteczna :/

    No myślałem że funkcję odczytu napisać od nowa, ale... Zwrot akcji - uwaga, zaprogramowałem sobie inny uC jako przekaźnik uart, miał w sobie funkcję:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Robił tylko to, w kółko, bez jakiegoś _delay_ms, w prawdzie, wysyłał naet NULL'e, przez co uart w mikrokontrolerze był aktywny non stop, ale szybko działał więc spoko, i się okazało, że miałem prawie 100% odczytanych danych z PC poprawnie - LOL, jak?

    Jeszcze raz, dane szły tak :
    PC >> uC[uart_putc(uart_getc());] >> uC[Wykonywany kod X] - w takiej konfiguracji działało bez problemu...
    PC >> uC[Wykonywany kod X] - już tylko co 4 string jest okej :/

    Co jest grane? :/
    Pozdrawiam serdecznie internautów :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 wrz 2018, o 09:44 
    Offline
    Użytkownik

    Dołączył(a): 04 cze 2013
    Posty: 33
    Pomógł: 0

    Po pierwsze to nie powinieneś przesyłać danych binarnie, tak jak robisz to w przypadku zmiennych R, G i B tylko przez kod ASCII (zamieniasz bajty na HEX-y i wysyłasz), być może to nie jest główna przyczyna problemu, ale na pewno warto sprawdzić.
    Po drugie możesz wstawić kod funkcji uart_getln, może tam tkwi błąd



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 wrz 2018, o 11:04 
    Offline
    Moderator
    Avatar użytkownika

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

    kalani napisał(a):
    mromano napisał(a):
    nie powinieneś przesyłać danych binarnie

    Moduł USART w AVR (ani w innych znanych mi µC) nie narzuca takiego ograniczenia.

    Ale biblioteka która np działa w ASCII już może narzucać takie ograniczenie

    _________________
    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: 27 wrz 2018, o 11:11 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 17 wrz 2015
    Posty: 16
    Pomógł: 0

    mromano napisał(a):
    (zamieniasz bajty na HEX-y i wysyłasz)
    Dlaczego? toż to marnowanie 8'mio bitowej transmisji, każdy znak znak z '2''4''5' ma 8 bitów, a tak mam tylko 8 bitów więc po co ?

    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 wrz 2018, o 11:48 
    Offline
    Moderator
    Avatar użytkownika

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

    Tded napisał(a):
    Dlaczego? toż to marnowanie 8'mio bitowej transmisji, każdy znak znak z '2''4''5' ma 8 bitów, a tak mam tylko 8 bitów więc po co ?

    To się zorientuj najpierw czym różni się transmisja binarna od transmisji ASCII ... a po tej procedurze widać, że takiej używasz - a więc nie dziwota że co to świruje gdy binarkę ślesz ;)

    Pomyśl chwilę, jeśli wartość twojego wysyłanego bajtu będzie równa w pewnym momencie 13 .... a twoja funkcja czeka na znak końca linii 13 (ENTER) ... bo przygotowana jest do obsługi ASCII to co się stanie ?

    _________________
    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: 27 wrz 2018, o 12:15 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1978
    Lokalizacja: Lipsko
    Pomógł: 125

    Co prawda w jednym z testowych projektów z przed paru lat też przesyłałem binarnie zamiast ascii, ale wcześniej przerobiłem odpowiednio bibliotekę do swoich potrzeb i gnało to bez błędów jak należy. Zależało mi na szybkiej transmisji sporej ilości danych i szybkim odświeżaniu. Jest to więc możliwe, ale bez przeróbki się nie obejdzie, poza tym może masz jakieś zakłócenia po drodze.

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 wrz 2018, o 12:21 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 17 wrz 2015
    Posty: 16
    Pomógł: 0

    mirekk36 napisał(a):
    twoja funkcja czeka na znak końca linii 13 (ENTER)


    Dlatego się zabezpieczam programowo na PC:

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


    no i ta teoria była by poprawna gdyby przesłanie przez inny mikrokontroler [PC>>uC>>uC(docelowe)] nie eliminowało problemu, a w tedy ten problem nie istnieje.

    Może bufor nie zawsze jest pusty, a wysłanie pustej ramki na uart jakoś to resetuje, spróbuję po przesyłać z komputera jakieś puste ramki.

    SylwekK napisał(a):
    poza tym może masz jakieś zakłócenia po drodze.
    jak już to CH340 >> uC, ale na pinie RX od uC ramka wygląda bardzo dobrze, wyślę oscylogram, za jakiś moment,

    EDIT:
    Obrazek
    Niebieski, pod RX, żółty pod diodę, na płytce arduino nano.
    Żółty załącza się w momencie gdy:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    i trwa do ponownego odczytu uart:
    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 oscylogram z tej ramki którą złapał:
    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 wrz 2018, o 23:23 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 17 wrz 2015
    Posty: 16
    Pomógł: 0

    Znalazłem błąd:
    Po pierwsze, tablica była za mała o jeden bajt, znaczy była okej, ale jak się znalazł błąd o jeden bit, to całość się "przekręcała", tak samo jak '\n', przez co znowu funkcja odczytu kończyła się ciupke za szybko (o jeden bajt) i tablica była niepełna, przez co się "przekręcała" i tak aż się to zsynchronizowało. Czyli aż funkcja zdążyła złapać '\n' na innej pozycji - działo się to około 4 iteracje.

    Po drugie, błąd delikatnie wynikał z funkcji, ale to nie był największy problem, chyba troszkę zawinił program na komputerze, czasami zdarzało mu się wysłać o jeden bajt za dużo, albo za mało, dzieje się to przy "połączeniu" z CH340, przez co ramki w buforze od razu startują przesunięte. No a funkcja po prostu nadpisywała bufor, jak sczytała 3 bity a 4 to '\n' to tylko 4 bity nadpisywała, nie 5.

    Oba te błędy powodowały że nie byłem w stanie ich wykryć, bo jak po omacku naprawiałem jeden to drugi powodował że dalej nie działało, albo działało przez sekundę, a ja myśląc, że to nie to, się cofałem i szukałem gdzie indziej...

    Teraz dopisałem parę zmian...
    Pierwsza to większy bufor, przez co '\n' w przypadku błędu nie wskakuje na pierwszą pozycję buforu, tylko na ostatnią i funkcja ma szanse się "wybronić". Druga to czyszczenie "ręczne" buforu po otrzymaniu danych i przetworzeniu, by czasami za mała ilość bajtów odebranych nie przekręcała mi buforu. Ale tak czy siak się to czasami zdarza z jakiejś przyczyny, ale jest to tak z 1 na 500 odczytów, ale częstotliwość wysyłania to czasami 60Hz więc i tak względnie często wciskały się błędy... Więc gdy wartość "%" - moja wartość startowa ramki, jest nie tam gdzie powinna, program synchronizuje "strumień danych" z buforem, robi to przez zmniejszenie chwilowe wielkości bufora odczytanego, przez co zmienne w nim się zaczynają przekręcać na pozycjach, i gdy te będą na właściwych miejscach, ponownie rozmiar bufora jest ustawiany na standardowy.

    I tyle, teraz mam 99% ramek przesłanych poprawnie, można by powiedzieć że mało, ale w moim wypadku wystarczająco.

    Dziękuję wszystkim, i każdemu z osobna, za pomoc, jakoś się udało ;)



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 18 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