Witajcie,
przychodzę z problemem, który meczy mnie od dłuższego czasu :/
Niebieskie piki do masy to dane przesyłane przez uart z komputera do mikrokontrolera, żółte, to piki które AVR uznaje jako poprawną transmisje.
Jak widać sporo błędów, jedna transmisja na 4 jest uznawana za poprawną... I to ten problem :/
Myślę, że to nie BaudRate, wprawdzie 16MHz, ale 76800.
Jak sprawdzam czy transmisja jest poprawna?
Oto co wysyłam:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Czyli wysyłam jeden bajt rozpoczynający - 85(% w ASCII) kod uint8_t R, G, B, i bajt kończący - '\n'.
I sprawdzam w kodzie AVR, czy bajt '%' jest w buforze odczytu na miejscu 0:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
jak jest to spoko, jak nie to kicha.
No i ta kicha jest za często... tak o 4 razy za często, buforek mi się przekręca...
Jest to uart_getln(buforek,5); funkcja ta sczytuje 5 bajtów, lub do znaku nowej linii '\n'.
i chodzi o to, że bajt rozpoczynający w tym buforze jest raz na miejscu 0 raz na 1, 2, 3, 4 itd...
Przekręca mi się w buforze :/
Niby spoko, mogę sobie napisać by czytało wartości od bitu start w buforze na miejscu 1,2,3 zamiast 0, no i tak zrobiłem, podziałało, częstotliwość wykonywania wzrastała, ale ta funkcja odczytu danych zawsze usuwa po odczycie ostatni bajt buforu na 0 albo null, więc jak mam na 3 miejscu w buforze bajt rozpoczynający (%) to na 5 mam uint8_t R, a dalej 0 czyli tylko zmienna R jest użyteczna :/
No myślałem że funkcję odczytu napisać od nowa, ale... Zwrot akcji - uwaga, zaprogramowałem sobie inny uC jako przekaźnik uart, miał w sobie funkcję:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Robił tylko to, w kółko, bez jakiegoś _delay_ms, w prawdzie, wysyłał naet NULL'e, przez co uart w mikrokontrolerze był aktywny non stop, ale szybko działał więc spoko, i się okazało, że miałem prawie 100% odczytanych danych z PC poprawnie - LOL, jak?
Jeszcze raz, dane szły tak :
PC >> uC[uart_putc(uart_getc());] >> uC[Wykonywany kod X] - w takiej konfiguracji działało bez problemu...
PC >> uC[Wykonywany kod X] - już tylko co 4 string jest okej :/
Co jest grane? :/
Pozdrawiam serdecznie internautów