Witam wszystkich forumowiczów,
Temat postu mniej więcej sugeruje z czym się zmagam. Otóż implementuję obsługę MODBUSa RTU na mikrokontrolerze ATMega 128 (przy czym testuję program również na ATMega 324P). Niestety mimo wielu godzin, zmagam się z jednym problemem. A mianowicie: mój mikrokontroler połączony jest za pośrednictwem RS485 z falownikiem. Zadanie jest proste - wysłać dane, odebrać odpowiedź od falownika. Bazą do komunikacji jest biblioteka MK_USART, obsługująca pojedynczy port UART (w moim przypadku UART0). O ile nie ma żadnych problemów z nadawaniem danych, problem pojawia się z ich odbiorem. Co do idei, zgodnie ze standardem MODBUS, koniec ramki definiowany jest ciszą na magistrali trwającą około 3.5 znaku, co przy prędkości 9600 wynosi około 4ms. Koncepcja jest zatem prosta - utworzyć timer, który będzie się resetował a następnie uruchamiał wraz z każdym odebranych bajtem z portu szeregowego. Przysłanie danych ciągiem będzie resetowało ten timer. Przysłanie ostatniego bajtu uruchomi go, a z powodu braku resetu - wywoła przerwanie. Tak więc przysłanie danych ciągiem powinno wywołać przerwanie tylko raz, na samym końcu. Przynajmniej tyle teorii...
Praktyka niestety daje inne rezultaty. Falownik wysyła do uC ramkę MODBUSa, składającą się z 8 bajtów. Są one wysyłane ciągiem. Niestety mój mikrokontroler, z jakiegoś powodu dwa razy rzuca przerwanie od timera, dzieląc odebrane dane na dwa kawałki 1 i 7 bajtów. Najważniejsze fragmenty kodu wyglądają następująco:
Inicjalizacja UARTu i Timera:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przerwanie odbiorcze UARTu:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Przerwanie od timera:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Próbowałem chyba już wszystkiego - zmian timera, zmian trybu z CTC na tryb licznika, redukcji kodu do absolutnego minimum, pełnej diagnostyki z wysyłaniem dosłownie wszystkiego przez UART1 do komputera. Skutek zawsze zostawał taki sam - zamiast przerwania i 8 bajtów, dwa przerwania i ramka z podziałem 1-7 bajtów. Dla jasności, po "sklejeniu" tych dwóch kawałków ze sobą, odebrane dane z falownika są w pełni poprawne.
Pojawia się moje pytanie, czy ktoś ma pomysł co może być nie tak w tym przypadku? Podejrzewam, że to może być jakiś idiotyczny błąd, którego nie zauważam przez ilość godzin spędzonych nad problemem. Będę wdzięczny za jakiekolwiek sugestie.
Pozdrawiam!