Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 9 lis 2024, o 03:46


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: 27306
Lokalizacja: Szczecin
Pomógł: 1041

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