Witam, drogich forumowiczów.
Mam problem z komunikacją kilku urządzeń w sieci rs485. A tak prawdę mówiąc to z komunikacją pomiedzy dwoma, jednym "master" i jednym "slave".
Normalnie staram się zadawać pytania w ostateczności na forum Elektroda, ale po prawie 3 tygodniach siedzenia przy problemie, przeglądaniu masy poradników i postów związanych z rs485 w wolnym czasie, moja frustracja osiąłgneła poziom zenitu.
Przesyłam dwa filmiki na których mam 3 płytki ewaluacyjne z procesorami atmega328, atmega32, atmega8. Dwa pierwsze procki taktuję zewnętrznym kwarcem 8MHz, trzeci wewn.
Przepraszam, że nie korzystam z wbudowanego playera, ale coś nie chce mi wstawić filmu
Pomiędzy atmega328 i 32 zastosowałem kabel skrętkę rj45 4metry, pomiędzy atmega32 i 8 jakiś zwykły kabel lekko ponad 1m. Oczywiście pod każde wyjście AB podpięty terminator, nie połączyłem tylko wspólnych GND bo to mi teraz nic nie dawało i nie robiło żadnej różnicy przy problemie.
Na 1filmie pokazane są 3 płytki
1wsza atmega328 z największym LCD (MASTER)
2ga atmega32, wysw 4x16 (SLAVE)
3cia atmega8, wysw 2x16 (SLAVE ta nic nie robi, tylko teraz nasłuchuje)
każda atmega dostała w programie numer ID 0,1,2
Po 2 tygodniach dumania napisałem coś takiego
Dla Mastera
Dla Slave
Oba programy są tym samym programem, tylko różnią się ustawieniem pinów procesora, stanu wyjścia startowego na rs485, numerem ID i zmienną string do wysłania na inny proc
wyświetlacze 4x20 i 4x16 wyświetlają kilka parametrów, ulokowanych w tych samych miejscach
1 wiersz strona lewa "Odebrane dane z drugiego procka"
1 wiersz strona prawa "stan Ischarwaiting() "
2 wiersz str lewa "wykryty przecinek"
2 wiersz str prawa "rejestr udr( tylko tam jest nie umiem go używać)"
3 wiersz str lewa "tutaj wyświetla się nr ID wycięty z wysłanej ramki"
4 wiersz str lewa "porównanie Id odebranego z ramki z tym co jest w procku, jeżeli stan flagi 1 to przechodzi do wykonywania programu"
Diody mrugające na płycie sygnalizują po lewej 2diody stan przerwania w timer0, przerwanie w pętli gł
po prawej str, lewa dioda to odbiór, prawa nadawanie.
Problemem jest gdzieś z główna pętlą w programie, gdyż w miejscu gdzie wyświetla się na lcd nr ID odebrany z przychodzącej ramki czasem zdarza się że w pętli zostanie on pominięty z pobieranej ramki i w to miejsce wpada to co powinno być w pierwszym wierszu wyświetlacza.
Ten problem crash-uje mi program i kończy nadawanie od Mastera (problem pojawia się zarówno na master jak i na slave).
Program nieraz potrafi wymieniać pomiędzy sobą dane nawet ponad 10min i to na 3 urządzeniach a czasem po pierwszej sekundzie się sypie.
Nie wiem dlaczego czasem pomija ten id w odebranej ramce, nie potrafię stwierdzić czy w pętli gł jest jakaś kolizja, która to powoduje
Program działa w oparciu o przerwanie ok. 100ms (zarówno zwiększanie jak i zmniejszanie czasu przerwania nic nie daje),
BAUD 9600
Format wysyłanej ramki to ID#dane, po napotkaniu hash wycina numer ID, po napotkaniu przecinka zmienia się stan komunikacji na rs485
Pomysły mi się wyczerpały a bardzo potrzebuję to wsadzić do mojego głównego projektu liczącego ponad 2000lini kodu.
Wpadłem jeszcze na jeden pomysł że gdy w miejscu odbieranego nr Id pojawi mi się ten błąd to mogę wysłać do mastera np kod błędu np(nieprawidłowy format danej, ponów wysyłanie) ale wolał bym by wszystko działało w podstawowej idei , tzn. każde odpytane urządzenie slave zwraca jakąś daną spowrotem do mastera.
Bardzo proszę o pomoc, bo może program który napisałem, lub format wysyłanej ramki to bubel.
Pozdrawiam
Mam problem z komunikacją kilku urządzeń w sieci rs485. A tak prawdę mówiąc to z komunikacją pomiedzy dwoma, jednym "master" i jednym "slave".
Normalnie staram się zadawać pytania w ostateczności na forum Elektroda, ale po prawie 3 tygodniach siedzenia przy problemie, przeglądaniu masy poradników i postów związanych z rs485 w wolnym czasie, moja frustracja osiąłgneła poziom zenitu.
Przesyłam dwa filmiki na których mam 3 płytki ewaluacyjne z procesorami atmega328, atmega32, atmega8. Dwa pierwsze procki taktuję zewnętrznym kwarcem 8MHz, trzeci wewn.
Przepraszam, że nie korzystam z wbudowanego playera, ale coś nie chce mi wstawić filmu
Pomiędzy atmega328 i 32 zastosowałem kabel skrętkę rj45 4metry, pomiędzy atmega32 i 8 jakiś zwykły kabel lekko ponad 1m. Oczywiście pod każde wyjście AB podpięty terminator, nie połączyłem tylko wspólnych GND bo to mi teraz nic nie dawało i nie robiło żadnej różnicy przy problemie.
Na 1filmie pokazane są 3 płytki
1wsza atmega328 z największym LCD (MASTER)
2ga atmega32, wysw 4x16 (SLAVE)
3cia atmega8, wysw 2x16 (SLAVE ta nic nie robi, tylko teraz nasłuchuje)
każda atmega dostała w programie numer ID 0,1,2
Po 2 tygodniach dumania napisałem coś takiego
Dla Mastera
Code: vbnet
Dla Slave
Code: vbnet
Oba programy są tym samym programem, tylko różnią się ustawieniem pinów procesora, stanu wyjścia startowego na rs485, numerem ID i zmienną string do wysłania na inny proc
wyświetlacze 4x20 i 4x16 wyświetlają kilka parametrów, ulokowanych w tych samych miejscach
1 wiersz strona lewa "Odebrane dane z drugiego procka"
1 wiersz strona prawa "stan Ischarwaiting() "
2 wiersz str lewa "wykryty przecinek"
2 wiersz str prawa "rejestr udr( tylko tam jest nie umiem go używać)"
3 wiersz str lewa "tutaj wyświetla się nr ID wycięty z wysłanej ramki"
4 wiersz str lewa "porównanie Id odebranego z ramki z tym co jest w procku, jeżeli stan flagi 1 to przechodzi do wykonywania programu"
Diody mrugające na płycie sygnalizują po lewej 2diody stan przerwania w timer0, przerwanie w pętli gł
po prawej str, lewa dioda to odbiór, prawa nadawanie.
Problemem jest gdzieś z główna pętlą w programie, gdyż w miejscu gdzie wyświetla się na lcd nr ID odebrany z przychodzącej ramki czasem zdarza się że w pętli zostanie on pominięty z pobieranej ramki i w to miejsce wpada to co powinno być w pierwszym wierszu wyświetlacza.
Ten problem crash-uje mi program i kończy nadawanie od Mastera (problem pojawia się zarówno na master jak i na slave).
Program nieraz potrafi wymieniać pomiędzy sobą dane nawet ponad 10min i to na 3 urządzeniach a czasem po pierwszej sekundzie się sypie.
Nie wiem dlaczego czasem pomija ten id w odebranej ramce, nie potrafię stwierdzić czy w pętli gł jest jakaś kolizja, która to powoduje
Program działa w oparciu o przerwanie ok. 100ms (zarówno zwiększanie jak i zmniejszanie czasu przerwania nic nie daje),
BAUD 9600
Format wysyłanej ramki to ID#dane, po napotkaniu hash wycina numer ID, po napotkaniu przecinka zmienia się stan komunikacji na rs485
Pomysły mi się wyczerpały a bardzo potrzebuję to wsadzić do mojego głównego projektu liczącego ponad 2000lini kodu.
Wpadłem jeszcze na jeden pomysł że gdy w miejscu odbieranego nr Id pojawi mi się ten błąd to mogę wysłać do mastera np kod błędu np(nieprawidłowy format danej, ponów wysyłanie) ale wolał bym by wszystko działało w podstawowej idei , tzn. każde odpytane urządzenie slave zwraca jakąś daną spowrotem do mastera.
Bardzo proszę o pomoc, bo może program który napisałem, lub format wysyłanej ramki to bubel.
Pozdrawiam