Skocz do zawartości

Problem z przesyłaniem programu - Arduino UNO R3


Pomocna odpowiedź

Na poprzedniej stronie masz program, 

Wgrałeś bootloader, to tak samo możesz wgrać ten program, zobacz czy masz komunikacje po UART, czy program wysyła komunikaty na UART, oraz czy odpowiada tym co mu wyślesz. Ustalisz czy UART nie działa w ogóle, działa w jedną stronę, a może winny jest tylko autoreset i dlatego nie nawiązuje komunikacji z bootloaderem.

Zrobiłem test zalecany przez stronę arduino.cc tzw Loopback, polega na tym żeby zewrzeć TX i RX na płytce i używając serial monitora wysłać coś i odebrać echo. Test przebiegł ok. Za pomocą USBAsp jestem w stanie wgrywać programy, ale nie za pomocą usb.

  • Lubię! 1

 Test loopback potwierdza, że piny modułu USB-UART są OK, ale nie wiesz czy komunikaty dolatują od/do uC. Poza tym każde otwarcie na nowo okna monitora uart powinno resetować uC, co ładnie widać z tym programem, bo zaczyna wysyłać na UART zmienna++ od nowa.

Więc tak, wgrałem za pomocą UsbAsp program "SerialEvent", wgrało się poprawnie. Odłączyłem usbAsp od portu usb i podłączyłem kabel usb do arduino. Odpaliłem serial monitor i wysłałem pojedyncze znaki, liczby, cale wyrazy, zmieniałem ustawienia znaku końca linii na wszystkie po kolei. W terminalu cisza, nic nie przyszło z uC.

  • Lubię! 1

Nie napisałeś nic o ustawieniu odpowiedniej prędkości UART, zgodnej z tą w programie, ale załóżmy, że była OK.

No to masz podpowiedź, prawdopodobnie linia TX między uC a linią złączy kołkowych jest uszkodzona, zaraz po otwarciu okna terminala miałbyś jakieś komunikaty z uC, weź multimetr, ustaw sprawdzanie ciągłości obwodu i sobie to przetestuj, weź lupę i obejrzyj ścieżki, może zimny lut gniazda uC.

Jest jeszcze opcja dodania migania LED na pinie 13 co 1s, wg przykladowego blinka.

 

Więc tak, sprawdziłem:
- przejście od Atmegi 328P do gniazda pinowego - ok

- przejście od rezystora do gniazda pinowego - ok.

- rezystory - ok

- przejscie od Atmegi 16u2 do rezystorów - ok

Przeprowadziłem jeszcze parę testów:

- wypiąłem Atmegę 328P z płytki, zwarłem piny TX i RX ze sobą i używając serial monitora wysłałem wiadomość, otrzymałem poprawne echo

- wpiąlem Atmegę 328P do płytki, za pomocą usbasp wgrałem przykład AnalogReadSerial, podpiąłem kablem usb do płytki i odpaliłem serial monitor. Otrzymuję : ���gC���gC���gC���gC���gC��

Boudrate w programie jest ustawiony na 9600 i taki sam mam w serial monitorze.

(edytowany)
1 godzinę temu, adull napisał:

�/��gC�/��gC�/��gC�/��gC�/��gC�/�

AnalogReadSerial wysyła dane liczbowe (binarne), a nie tekstowe na Serial. Więc to jak najbardziej mogą być prawidłowe dane...
[B4] [B3] [B2] [B1] \n

Edytowano przez H1M4W4R1
  • Lubię! 1

Hmm, jeśli się nie mylę to powinien wyświetlać wartości liczbowe odczytane z pinu analogowego. Nie powinno być błędu związanego z formatem zmiennej, inaczej ten przykład traciłby sens. Proszę mnie poprawić jeśli źle myślę.

@adull, powinien, nie wiem o czym pisze H1M4W4R1, dane są liczbowe ale w tym przykładzie wysłane funkcją Serial.println a nie write.

Uzyskanie sieczki na ekranie sugeruje, że dane są źle odczytywane, uC może być np. taktowany 9MHz, choć myśli, że jest taktowany 12MHz i źle interpretuje to co odczytuje. W teście loop sam sobie źle nadaje i ten sam błąd robi odczytując, co eliminuje błędy komunikacji.

Nie wiadomo, który uC ma błąd taktowania, raczej stawiam na Atmega328P, Atmega16U2 ma taktowanie związane z wymogami USB, choć akurat takiego przypadku jeszcze nie spotkałem i nie wiem jakie byłyby objawy. Z drugiej strony nie wykrywało początkowo USB, może to ma jakiś związek.

Nie mam pomysłu jak to zweryfikować nie mając oscyloskopu. Na pewno pomoże użycie trzeciego słuchacza - oscyloskop, analizator stanów logicznych Saleae, inne Arduino jako konwerter USB-UART, inny konwerter USB-UART. Masz programator, spróbuj odczytać ustawienie fusebite, wgrać jeszcze raz bootloader do Atmegi 16u, jeszcze raz wgrać mu wsad. Zmniejsz w programie testowym baud do minimum 300.

Weź inne Arduino, zrób sobie z niego przejściówkę UART, albo weź przejściówkę UART-USB, podłącz się pod piny UNO GND, TX (RX z trzeciego słuchacza) i posłuchaj co nadaje Atmega328,  potem zrób przejściówkę UART z tego Arduino (zwarcie RST na stałe)  i pogadaj z trzecim odbiornikiem, może ustalisz który jest winny.

Tak samo można posłuchać co przylatuje z mC Atmega16u, tylko podpinasz się pod pin RX pinem RX trzeciego słuchacza.

Do Atmegi328P można też wgrać bootloader ustawiający pracę uC na wewnętrzny rezonator 8MHz, może masz coś nie halo z kwarcem na płycie. Potem programujesz taką płytkę z tymi ustawieniami, takiej opcji nie ma w typowym Arduino IDE, trzeba dodać definicje płytek MINI CORE:

image.thumb.png.c23cc2cd44dd0b28692332b1034a349e.png

Nawet mając sieczkę na ekranie można zweryfikować działanie autoReset, dodaj w setup delay(5000), jak RST działa OK to dane pojawią się po otwarciu monitora COM z tym opóźnieniem, jak RST nie działa to będą lecieć ciągle niezależnie jak długo jest otwarty terminal.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...