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 23 maja 2025, o 07:37


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 7 lut 2015, o 17:32 
    Offline
    Nowy

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

    Witam
    Mam problem z komunikacją układu Arduino Atmega 2560 po serial port.
    Zrobiłem ploter laserowy, komunikujący się po serial port z komputerem.
    Napisałem także program odbierający dane i wysyłający komendy do układu.
    Niestety w pewnym losowym momencie układ mi się zawiesza i zachowuje się tak jakby tracił dane.
    Chciałbym się zapytać czy mogę coś zrobić aby temu zapobiec, czy jest to nieuniknione?
    Prędkości jakie ustawiałem na module Arduino to 9600 i nawet 2400.
    Prosił bym o pomoc.



    Ostatnio edytowano 9 lut 2015, o 22:49 przez tdx, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 lut 2015, o 20:00 
    Offline
    Nowy

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

    Powiem wprost.
    Sama płytka jest połączona z komputerem przez USB (wirtualny port COM).
    Układ wysyła informacje za pomocą polecenia "Serial.print("OK")".
    Komputer odbiera informacje za pomocą programu napisanego w Visual Basic za pomocą:
    Kod:
        Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            While SerialPort1.ReadExisting() = "OK"
                Thread.Sleep(20)
            End While
            Wysyłanie = True
        End Sub



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 lut 2015, o 22:52 
    Offline
    Użytkownik

    Dołączył(a): 15 cze 2013
    Posty: 599
    Lokalizacja: Lubin
    Zbananowany użytkownik

    Pomógł: 35

    sleep(20)
    to 20 milisekund postoju. Możne tu właśnie "gubią" się dane.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2015, o 10:15 
    Offline
    Nowy

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

    Witam
    Komunikację właśnie sprawdzałem na 2400 i 9600
    Przepełnienia bufora po stronie Atmega2560 nie ma ponieważ odbiera on często tylko kilka znaków (góra 8-9, a przeważnie jest to 3 znaki).
    Z tego co się orientuje to bufor ma większą pojemność.
    Poza tym teraz jak sprawdziłem to jak ustawiłem komputer aby reagował na odbiór znaku końca linii zamiast "OK" to wszystko dobrze chodzi.

    Inną sprawą jest pętla While. Ta pętla jest w wątku głównym a odbieranie i nadawanie po Serial Port odbywa się w innym wątku i nie wpływa to na odbiór danych.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2015, o 21:01 
    Offline
    Nowy

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

    Błędnie użytkownik rozumuje.
    1. Ploter nie jest szybki
    2. Odbierana jest porcja danych, uC czyści bufor przez odczyt informacji i wydaje polecenie sterujące do silników krokowych. Następnie jak to wykona to układ wysyła do komputera "OK" i czeka na odbiór danych.
    Samemu napisałem kod do opróżniania bufora odczytu bajt bo bajcie i przepisywania go do tablicy, która ma określoną wielkość.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 lut 2015, o 20:49 
    Offline
    Nowy

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

    Przepraszam że piszę post pod postem, ale uważam to za dość ważne.
    Otóż problem z komunikacją po UART może występować przez to iż do Atmega2560 jest podłączony kwarc 16MHz.
    Jak sprawdzić można to przy tym kwarcu błąd jaki może wystąpić przy przesyłaniu danych to około 0,1%.
    Może to i mało, ale jak otrzymuje się nawet kilkanaście tysięcy informacji to może spowodować błąd.
    Wiem że można wyeliminować błąd przez zamianę na odpowiedni kwarc, jednakże w Arduino to odpada (chyba nie ma możliwości i nie chce prezentu od dziewczyny niszczyć :))
    Stąd moje pytanie do zacnych forumowiczów.
    Czy istnieje sposób na zniwelowanie tego błędu inny niż powtórne wysyłanie i odbieranie informacji?
    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 lut 2015, o 00:19 
    Offline
    Moderator
    Avatar użytkownika

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

    mokrowski napisał(a):
    Uwierz, to nie jest forum telepatów. A ja nie piszę tego w akcie złej woli.

    Podziwiam cierpliwość ... podziwiam - na prawdę ...

    _________________
    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: 13 lut 2015, o 01:04 
    Offline
    Nowy

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

    Chcecie kod to proszę część.
    Poza tym nie prosiłem o analizowanie kodu tylko o podanie innych przyczyn zakładając że kod jest dobrze napisany.
    [ popraw formatowanie kodu zgodnie z tą instrukcją topic7402.html - mirekk36 ]
    Bardziej mi chodzi o to że Komputer nie otrzymuje informacji, a z Arduino wysyłam je za pomocą Serial.println("OK").
    Po pewnym czasie gubi mi Jakąś literę.
    Jeśli chodzi natomiast chodzi o odbiór kodu w PC to jest on napisany w Visual Basic .NET
    Składnia: [ Pobierz ] [ Ukryj ]
    język vb
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Przy tej operacji gubi mi jakiś znak, że po pewnym czasie jak działa się zawiesza na tym.

    EDIT:
    Znalazłem problem.
    Jako że Arduino jest taktowane kwarcem 16 MHz nie da się uzyskać dokładnych częstotliwości transferu danych.
    Z tego powodu co jakiś czas są ramki tracone/przestawiane.
    Aby zapobiec temu zdarzeniu wystarczy sprawdzać i porównywać przesyłane dane.

    EDIT2 (Rozwiązanie problemu):
    Witam.
    Jako że znalazłem problem to dla potomnych i dla osób z podobnymi problemami postanowiłem zamieścić informacje o problemie i sposób jej rozwiązania.
    1. Problemem z komunikacją mogły okazać się zakłócenia na przewodzie USB, więc postanowiłem w następujący sposób to rozwiązać.
    - Zmniejszyć obciążenie przewodu USB poprzez dołączenie dodatkowego zasilania
    2. Program w komputerze podczas działania programu do wysyłania pakietów danych mógł łapać błędy przez użytkowanie komputera.
    - Rozwiązałem to w ten sposób, że podczas działania programu nie wykonuję żadnych dodatkowych czynności (przeglądanie internetu, granie, oglądanie filmów itp.)
    PS:
    Jakby ktoś był ciekaw to to sterowanie jest do plotera laserowego wykonanego przeze mnie z laserem o mocy 250 mW :evil:



    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 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO