Witak wszystkich.
Mam dziwny problem. Piszę obsługę RS-485 na Atmega328P.
Testowo program jest bardzo prosty:
Przy czym funkcje wysyłania ramki danych wyglądają jak w książce Tomasza Francuza:
Transmisja niby idzie dobrze, dane sa wysyłane. Problem jest taki że stan PD2 jest zerowany zanim wszystko łącznie z CRC zostanie wysłane. Dokładniej ustawienia 0 na tym pinie następuje dokładnie wtedy (sprawdzałem oscyloskopem) kiedy wysyłane jest 0 świadczące o końcu ciągu znaków. Zastąpienie "nop" funkcją _delay_ms() pomaga, ale nie do końca. Pierwsza zwłoka jest ok, ale druga już nie, jest krótsza i zależy od tego jak długi ciąg znaków jest wysyłany.
Wiem że funkcja że funkcja uart_9600(); ustawia inną prędkość transmisji ale nie jest to w tej chwili ważne.
O co tu może chodzić? Nie zmieniam nigdzie w czasie wysyłania znaków stanu PD2 a jednak stan tego pinu ulega samemu zmianie. Układ ma wszystkie potrzebne kondensatory itd.
Mam dziwny problem. Piszę obsługę RS-485 na Atmega328P.
Testowo program jest bardzo prosty:
Kod: C / C++
Przy czym funkcje wysyłania ramki danych wyglądają jak w książce Tomasza Francuza:
Kod: C / C++
Transmisja niby idzie dobrze, dane sa wysyłane. Problem jest taki że stan PD2 jest zerowany zanim wszystko łącznie z CRC zostanie wysłane. Dokładniej ustawienia 0 na tym pinie następuje dokładnie wtedy (sprawdzałem oscyloskopem) kiedy wysyłane jest 0 świadczące o końcu ciągu znaków. Zastąpienie "nop" funkcją _delay_ms() pomaga, ale nie do końca. Pierwsza zwłoka jest ok, ale druga już nie, jest krótsza i zależy od tego jak długi ciąg znaków jest wysyłany.
Wiem że funkcja że funkcja uart_9600(); ustawia inną prędkość transmisji ale nie jest to w tej chwili ważne.
O co tu może chodzić? Nie zmieniam nigdzie w czasie wysyłania znaków stanu PD2 a jednak stan tego pinu ulega samemu zmianie. Układ ma wszystkie potrzebne kondensatory itd.
