logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wgrywanie sketch do Atmega328p-pu przez UART - błędy synchronizacji

rafik73 08 Sty 2019 12:05 1929 22
REKLAMA
  • #1 17684967
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Witam
    Temat niby przewałkowany a jednak...
    Mam Atmega328p-pu. Za pomocą Arduino Uno wgrałem bootloader. Wszystko poszło cacy. Ładowałem przez SPI. Czyli piny 11,12,13 oraz 10 jako reset. Sketch wgrywa się bez problemu. Gorzej wygląda sprawa, gdy próbuję wgrać sketch przez UART. Używam do tego konwertera pl-2303. łączę:
    pl-2303 atmega328p
    rx tx
    tx rx
    gnc gnd

    ustawiam programator na standard avr mk
    Gdy po krótkim resecie atmegi wciskam wgraj
    nic się nid dzieje a po chwili wyskakują błędy synchronizacji
    not in sync: resp=0x00
  • REKLAMA
  • #2 17685049
    kotekturek
    Poziom 11  
    Posty: 8
    Ocena: 9
    Kolego jak ustawiłeś fusebity? dokładnie SPIEN i RSTDISBL jeśli ustawiłeś tam 1 to odciąłeś sobie tą drogę. datashet str 297
  • #3 17685055
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Szczerze? nic nie ruszałem. Jakim softem i na jakim sofcie to najlepiej zrobić?
    Większość tutoriali nic o tym nie wspomina
  • #4 17685093
    kotekturek
    Poziom 11  
    Posty: 8
    Ocena: 9
    Spróbuj może je odczytać mkavrcalculatorem jak będą zera to będziemy szukać dalej. swoją drogą kiedyś kupiłem ten konwerter na pl-2303 i nie specjalnie mi chciał działać (ale to go i tak system nie wykrywał) a druga rzecz jest jeszcze taka, że nie specjalnie jestem przekonany czy on działa z UART czy nie ma zwykłego RS232 bo też nie zadziała. kiedyś porównywałem chyba właśnie transmisję danych z RS232 i UART i jest jakby przerzucona w fazie tz tam gdzie jest 1 na RS to na UART 0 i odwrotnie z tego co pamiętam.
  • REKLAMA
  • #5 17685139
    karwo
    Poziom 31  
    Posty: 1559
    Pomógł: 152
    Ocena: 367
    Wrzuć do Atmegi jakiś sketch przez SPI w którym będziesz coś po serilau nadawał i kombinuj aby odebrać to na PC poprzez konwerter USB-Serial - w ten sposób ustawisz przetestujesz komunikacje.
  • REKLAMA
  • #7 17685215
    kotekturek
    Poziom 11  
    Posty: 8
    Ocena: 9
    Może zacznijmy od początku. Napisz dokładnie co zrobiłeś, w jaki sposób wgrywałeś bootloader przez IDE? jakie opcje wybrałeś(czym już wiemy użyłeś UNO). Do czego wgrywałeś ten bootloader? do samego mikrokontrolera czy jakieś gotowej płytki typu nano albo pro mini albo drugie uno? itd. mogą być fusebity, twój konwerter ten na pl2303 może nie gadać z uartem, może być problem z zegarem czyli np zaprogramowałeś zewnętrzny zegar a nie jest dołączony do procka oscylator. Pod załączonym linkiem masz informacje jak odblokować procka któremu zaprogramowano zewnętrzny zegar kiedy ma np pracować na wewnętrznym.
  • #8 17685242
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Mikrokontroler standalone + oscylator 16Mhz
    Na Uno załadowany program ArduinoISP
    Potem wybór programatora Arduino as ISP
    Wypal bootloader
    Zakkńczone sukcesem.
    Aha, reset podciągnięty rezystorem 10k do zasilania 5V.
    Jrszcze jedno. Próbowałem wgrywać sketch przez pl-2303 oraz
    przez ft232 z resetem atmegi podpiętym do pinu DTR w ftdi.
    Efekt ten sam. i pod linuxem i pod win10.
  • #9 17685310
    Slawek K.
    Poziom 35  
    Posty: 3020
    Pomógł: 259
    Ocena: 1303
    Zakładam, że piny Rx i Tx podpiąłeś na krzyż ?

    Pozdr
  • #10 17685365
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Tak. W paczkomacie czekają 3 nowe atmegi. może trafiłem na uszkodzoną?
  • #11 17685394
    Slawek K.
    Poziom 35  
    Posty: 3020
    Pomógł: 259
    Ocena: 1303
    Niesadze, czy kwarc 16MHz i kondensatory 22p podpiales do atmegi ?
  • REKLAMA
  • #12 17685431
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Tak. Oscylator podpięty. Jak już wspominałem przez SPI sketch'e wchodzą.
  • #13 17685853
    Slawek K.
    Poziom 35  
    Posty: 3020
    Pomógł: 259
    Ocena: 1303
    Wgrywanie przez bootloader a przez SPI to zasadnicza różnica. Czy kondensatory 22p od xtal do gnd masz ? to bardzo ważne.
    Ale pod znakiem zapytania jest poprawne wgrywanie bootloadera przez Arduino ISP, mnie się to nigdy nie udało pomimo komunikatu o zakończeniu wgrywania, dlatego korzystam z USBasp.

    Pozdr
  • #14 17685979
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Kondzie podpięte zgodnie ze sztuką. ładowałem sketche przez SPI przy załadowanym uprzednio bootloaderze.
  • Pomocny post
    #15 17686070
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #16 17687089
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 231
    To co napisał @kotekturek jest w większości bez sensu, nie ustawia się fuse wgrywając bootloder w Arduino, bo Arduino przede wszystkim ustawia fuse wypalając bootloader, tylko czasami wgrywa sam program do komunikacji, np. w attiny13 nie ma miejsca na program we flash (ani sprzętu do tego), w niektórych innych prockach można wybrać czy program ma być, ale fuse ustawiane są zawsze wg danych wybranej płytki. Także wgranie ustawienie fuse jest podstawową czynnością wypalenia bootloadera. Po drugie jak już ma czymś sprawdzać to lepiej AVR LAB++ Link, jest darmowy, darmowy MKVKalk obsługuje tylko atmega8, 128a i jednego attiny . No i pl-2303 ma uart TTL, po prostu jest trochę kiepski. Cenną informacją jest natomiast jak powinny być ustawione fuse, po wgraniu bootloadera możesz przenieść się do AVR LAB, odczytać procesor i sprawdzić czy fuse nowego procka różnią się od zaprogramowanego i w ten sposób potwierdzić, czy wgranie bootloadera w ogóle się powiodło - przynajmniej w zakresie fuse.
    Jak chcesz używać ręcznego reset to raczej się go użyj po kliknięciu wgraj, zresztą to trzeba wyczuć na swoim PC. Jak klikasz strzałkę to Arduino ponownie kompiluje, dopiero po pojawieniu się komunikatu "upload" wciskasz reset. Program ma wtedy jakieś 2s by nawiązać połączenie. Program próbuje 10 razy więc jak nie wyjdzie za pierwszym to po 5-10s możesz próbować znowu wcisnąć reset. Najlepiej jest to zrobić automatycznie mając przejściówkę FTDI z wyprowadzonym DTR, ale tak jak napisał @Khoam w szeregu ma być kondensator 100n. Kondensatory przy kwarcu są opcjonalne, styki płytki stykowej mają już pojemność i nie spotkałem się by nie działało bez nich. Jak już to można dać mniejsze. Jak do jest docelowy projekt to też nie zawsze 22p jest najlepszym rozwiązaniem - zależy jakie masz długie ścieżki.
    Pamiętaj też, że jak wgrywasz bootloader mając ustawiony UNO to potem programujesz używając UNO jako programowaną płytkę. W nowszych IDE Arduino to już nie ma takiego znaczenia, bo mają taki sam bootloader, wcześniej miały różne prędkości i wybranie złej płytki kończyło się takimi komunikatami.
    Jeszcze jedno, jak wgrasz jakiś szkic używając programatora to potem ponownie wgraj bootloader.
    Pomogłem? Kup mi kawę.
  • #17 17687126
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    kaczakat napisał:
    Jeszcze jedno, jak wgrasz jakiś szkic używając programatora to potem ponownie wgraj bootloader

    Po wgraniu bootloadera załadowałem sketch przez SPI i od tej pory nie ładowałem jeszcze raz bootloadera tylko próbowałem nadpisać sketch innym przez UART. Sprawdzę to po powrocie z pracy. Dzięki,to bardzo cenna informacja- jeśli nie kluczowa.
    Troche by to skomplikowało projekt. Zakładałem umieścić Atmegę z wgranym bootloaderem na PCB projektu. Miała ona obsługiwać moduł lan ENC28J60 przez SPI. Ponieważ projekt będzie rozbudowywany chciałem stworzyć możliwość wgrywania sketchy po UART bez wyciągania Atmegi z pcb projektu. Skoro każde wgranie sketchu "niszczy " bootloader to trochę mi to komplikuje projekt.
  • #18 17687156
    kaczakat
    Poziom 34  
    Posty: 1748
    Pomógł: 317
    Ocena: 231
    Nie niszczy wgrywanie przez bootloader, tylko ponowne użycie programatora. Zresztą nie powinno tak być używając Arduino IDE, generując kod z Arduino do hexa powinien wgrać ponownie z bootloaderem, ale nie wiem czemu tak się nie dzieje gdy używam programatora USBASP. Najlepiej po użyciu programatora ponownie wgrać bootloader. Używając bootloader możesz wgrywać nawet bezprzewodowo z wykorzystaniem HC-05, robi się podobny autoreset z wykorzystaniem kondensatora 100n i pinu IO HC-05:
    "w niektórych HC-05 można wykorzystać pin state do resetu. Do modułu Arduino należy wgrać najlepiej bootloader od UNO, nawet jeśli to nie jest UNO, ale jest atmega 328, czyli UNO, PRO MINI, NANO itp. Potem te moduły identyfikują się jako UNO i taki moduł należy wybierać. W module HC-05 ustawić transmisję na 115200b komendą "AT+UART=115200,0,0" i tryb pracy PINSTATE "AT+POLAR=1,0". Te ustawienia robi się raz i zostają w module BT. Od strony sprzętowej wtedy robimy "Autoreset Arduino", potrzebny kondensator elektrolityczny wpięty między reset i PINSTATE, 1u i co najmniej 16V. Minus kondensatora do pinu reset. Jak komenda polar zadziała, to powinno się udać z danym modułem. Teraz wystarczy dodać moduł BT do komputera, wybrać przypisany mu port COM w Arduino i ładować. Testowałem, mi działa, robi się autoreset i programuje. Mój moduł nie wymaga konwertera poziomów 5V-3.3V (mam kilka z różnych źródeł i dotyczy to wszystkich moich), wprost podłączam pin TX/RX do Arduino, ale widziałem, że niektórzy kombinują z jakimiś dzielnikami. Z tym bootloaderem chodzi w sumie o to by pasował do prędkości UART, w Nano i Promini jest większy i wolniejszy bootloder. Działa również z płytkami z atmegą 168 i optibotem (nie wiem czemu tylko do UNO dają w Arduino od razu Optiboota, a w reszcie zostawili tego pokraka). Zaletą optiboota jest większa prędkość, 4x mniej kodu, więcej zostaje na program, nie odwala mu po użyciu Watchdoga." Ten wpis jest o tyle nieaktualny, że potem testowałem z ceramicznymi 100n/50V i działa też OK, no i w nowszych NANO jest już bootloader 115200. Od wartości pojemności kondensatora zależy jakie będą piki napięcia, za duży może uszkodzić Arduino, za mały nie zrobi reset. Sposób z HC-05 działa z każdym bootloaderem Arduino o prędkości transmisji 115200, zresztą z innymi też, po prostu wtedy trzeba przestawić prędkość modułu BT, prościej wgrywać wszędzie szybszy bootloader.
    Pomogłem? Kup mi kawę.
  • #19 17687567
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Czyli w telegraficznym skrócie sekwencja działań:
    1. załadowanie bootloadera przez SPI
    2. załadowanie sketch przez UART
    3. przed załadowaniem kolejnego skecza załadowanie bootloadera przez SPI

    Czy tak ma to wyglądać?
  • #20 17687582
    Konto nie istnieje
    Poziom 1  
  • #21 17687610
    rafik73
    Poziom 13  
    Posty: 473
    Ocena: 13
    Czyli wszystko jasne. W moim przypadku:
    1. bootloader przez SPI
    2. sketch przez SPI
    3. sketch przez UART nie wchodzi z powodu punku 2

    Zgadza się?
  • #22 17688332
    Slawek K.
    Poziom 35  
    Posty: 3020
    Pomógł: 259
    Ocena: 1303
    Użycie programatora w trybie SPI kasuje bootloader.

    Pozdr
  • #23 17689054
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z wgrywaniem sketcha do mikrokontrolera Atmega328p-pu przez UART, po wcześniejszym wgraniu bootloadera przez SPI. Po podłączeniu konwertera PL-2303 i ustawieniu programatora na standard AVR MK, pojawiają się błędy synchronizacji. Uczestnicy dyskusji sugerują sprawdzenie fusebitów, poprawności połączeń RX/TX oraz kondensatorów przy oscylatorze. Wskazują również, że wgrywanie kodu przez UART nie powinno niszczyć bootloadera, a problemy mogą wynikać z niekompatybilności konwertera lub błędów w konfiguracji. Użytkownik planuje używać Atmegi w projekcie z modułem ENC28J60 i chce mieć możliwość wgrywania sketcha przez UART bez wyciągania mikrokontrolera z PCB.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA