Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega328p-pu wgrywanie sketch przez UART

rafik73 08 Jan 2019 12:05 1257 22
  • #1
    rafik73
    Level 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
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    kotekturek
    Level 10  
    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
    rafik73
    Level 13  
    Szczerze? nic nie ruszałem. Jakim softem i na jakim sofcie to najlepiej zrobić?
    Większość tutoriali nic o tym nie wspomina
  • #4
    kotekturek
    Level 10  
    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.
  • #5
    karwo
    Level 26  
    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.
  • #7
    kotekturek
    Level 10  
    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
    rafik73
    Level 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.
  • #10
    rafik73
    Level 13  
    Tak. W paczkomacie czekają 3 nowe atmegi. może trafiłem na uszkodzoną?
  • #12
    rafik73
    Level 13  
    Tak. Oscylator podpięty. Jak już wspominałem przez SPI sketch'e wchodzą.
  • #13
    Slawek K.
    Level 35  
    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
    rafik73
    Level 13  
    Kondzie podpięte zgodnie ze sztuką. ładowałem sketche przez SPI przy załadowanym uprzednio bootloaderze.
  • Helpful post
    #15
    khoam
    Level 41  
    rafik73 wrote:
    przez ft232 z resetem atmegi podpiętym do pinu DTR w ftdi.

    No tak, to może się nie udać. DTR z ft232 powinien być wpięty przez kondensator 100n do RESET atmegi.

    Atmega328p-pu wgrywanie sketch przez UART
  • Helpful post
    #16
    kaczakat
    Level 33  
    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.
  • #17
    rafik73
    Level 13  
    kaczakat wrote:
    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
    kaczakat
    Level 33  
    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.
  • #19
    rafik73
    Level 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
    khoam
    Level 41  
    rafik73 wrote:
    3. przed załadowaniem kolejnego skecza załadowanie bootloadera przez SPI

    Nie bardzo rozumiem, po co ponownie w takim scenariuszu ładować bootloader.
    Jeżeli ładujesz kod programu przez USB/UART (opcja "Upload") to nic złego się nie stanie z bootloaderem - nie pamiętam ani jednego przypadku (Uno/Nano/Mini), aby konieczne było ponowne załadowanie bootloadera, po wgraniu kodu programu.

    W wypadku korzystania z programatora USBasp i złącza ISP, korzystasz w Arduino IDE z opcji "Upload Using Programmer", a wtedy możesz załadować zarówno kod, jak i bootloader.
  • #21
    rafik73
    Level 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ę?
  • #23
    khoam
    Level 41  
    rafik73 wrote:
    2. sketch przez SPI
    3. sketch przez UART nie wchodzi z powodu punku 2

    Nie wchodzi, bo wyczyszczasz w pkt. 2 bootloader.
    Jeżeli chcesz koniecznie ładować kod przez SPI, to po co w ogóle wgrywać bootloader ? Fusebity ustawiasz tylko raz na początku.