Skocz do zawartości

Problem z przesyłaniem programu - Arduino UNO R3


Pichciooo

Pomocna odpowiedź

Cześć,

wgrałem program na programowalną diodę RGB ale dioda się nie zapaliła, więc zacząłem sprawdzać sygnał miernikiem ale sondą dotknąłem czegoś czego nie powinienem 😞 Płytkę rozłączyło z komputerem ale od razu połączyła się od razu (były słychać sygnał rozłączania w Windows oraz diody na UNO zgasły). Nie było czuć żadnego zapachu spalenizny i płytka wygląda ok (zdjęcie pod spodem).

Teraz przy każdym wgraniu programu kompilacja przebiega prawidłowo ale nie można przesłać programu na płytkę, występuje błąd

avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x8b
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x8b
Failed uploading: uploading error: exit status 1

Oprogramowanie prawidłowo wykrywa płytkę oraz port do którego jest podłączona. Przy podłączaniu napięcia na płytkę świeci tylko dioda zasilająca. Podczas wgrywaniu programy co jakiś czas zapala się dioda Rx ale Tx się nie świeci. 

Stary program działa, ponieważ podawałem sygnał na wyjście analogowe A0 i nadal podawane jest tam napięcie. 

Jak mogę sprawdzić czy płytka działa prawidłowo, który element został uszkodzony?

 

Posiadam orginalne Arduino UNO 

IMG_20230420_103532.jpg

IMG_20230420_103457.jpg

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Na płytce są dwa uC, ten mniejszy jest odpowiedzialny za połączenie z PC, ten większy sterował ledami i do niego wgrywałeś program. Jeśli płytka pokazuje się prawidłowo w PC to pewnie problem jest z tym większym, mały do niego mruga tym ledem RX, a większy nie odpowiada. 

Użyj programatora i spróbuj coś wgrać tą drogą do Atmega328p, jak się uda to wgraj jakieś programy używające pinów UART, jakiś komunikat drukowany na serial, komunikat wysyłany z PC do Arduino i odsyłający z Arduino z powrotem do PC.

Programator to np. USB ASP, można też zrobić programator z innej, sprawnej płytki Arduino.

Ten uC łatwo też wyjąć na stykówkę, znaleźć schemat dać mu zasilanie, podłączyć się do niego programatorem poza płytką Arduino., popatrzeć jak się zachowuje, czy to w nim problem, czy z zasilaniem od strony płytki Arduino.

  • Lubię! 1
Link do komentarza
Share on other sites

Z góry przepraszam za brak profesjonalizmu i wykonanie schematów w "paint". 

Zamówiłem nową płytkę arduino Uno, teoretycznie jutro powinna przyjść i wtedy będę walczyć dalej. Ale mam jeszcze kilka pyań. 

@kaczakat 

Podłączam sprawne arduino wedle poniższej rozpiski i schematu:

zasilanie – 5V 

masa – GND

MOSI – D11

MISO – D12

SCK – D13

reset – D10

A uszkodzone arduino do złącza programowego uC (ATmega328p) też tak jak na schemacie. 

1301586544_podlaczenieUnojakoprogramator.thumb.jpg.280deb7eb9bec5301fc03e5c60a5e8d9.jpg

W menu wybieram rodzaj programatora Tools/Programmer/Arduino as ISP i następnie wgrywam program np. taki jak w kursie "Kurs Arduino – #3 – UART (komunikacja z PC), zmienne" 

void setup(){
  Serial.begin(9600); //Uruchamiamy transmisję
  
  pinMode(8, OUTPUT); //Wyjście diody czerwonej
  pinMode(9, OUTPUT); //Wyjście diody zielonej
  pinMode(10, INPUT_PULLUP); //Przycisk
  
  digitalWrite(8, LOW); //Wyłączenie obu diod
  digitalWrite(9, LOW);
}
 
void loop() {
  
  if (digitalRead(10) == LOW) { //Jeśli przycisk jest wciśnięty
    digitalWrite(9, HIGH); //Włączenie diody zielonej
    digitalWrite(8, LOW); //Wyłączenie diody czerwonej
  } else { //Jeśli przycisk nie jest wciśnięty
    digitalWrite(9, LOW); //Wyłączenie diody zielonej
    digitalWrite(8, HIGH); //Włączenie diody czerwonej
    Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");
    
    while (digitalRead(10) == HIGH) {
      //Zatrzymujemy się w pustej pętli do ponownego zamknięcia okna
      delay(25); //W pętli wprowadzamy małe opóźnienie 25ms, aby niwelować zakłócenia
    }
 
  }
}

Przechwytywanie.thumb.JPG.4001f593eeac33f71efe4c03bb188c36.JPG

I podłączam taki prosty schemat.
Dobrze wszystko rozumiem?

  • Lubię! 1
Link do komentarza
Share on other sites

Jeszcze raz przepraszam za używanie "painta" do robienia schematu.

@Nefarious19 żeby wypalić bootlader podłączam sprawne UNO do uszkodzonego według poniższego podłączenia:

Sprawna płytka:

zasilanie – 5V 

masa – GND

MOSI – D11

MISO – D12

SCK – D13

reset – D10

Uszkodzona płytka:

zasilanie - 5V

masa - GND

MOSI - D11

MISO – D12

SCK – D13

reset - RESET (POWER)

983295336_podlaczenieUnodowypalania.thumb.jpg.fe6b6117a83e01ad3a248ec255b9d7cb.jpg

 

W menu wybieram rodzaj programatora Tools/Programmer/Arduino as ISP.

W menu Tools/Board wybieramy taką płytkę, jakiej bootloader chcemy wgrać czyli ARDUINO UNO.

Pozostaje tylko Tools/Burn Bootloader i czekać na komunikat o sukcesie.

Coś pomyliłem czy wszystko ok?

 

Link do komentarza
Share on other sites

Przede wszystkim - na sprawne Arduino musisz wgrać program "Arduino ISP" (jest w przykładach). Poza tym warto podłaczyc kondensator (np 10 uF) między resetem i masą (bez tego Arduino może się niepotrzebnie resetować).

Powodzenia!

  • Nie zgadzam się! 1
Link do komentarza
Share on other sites

Nawet jak podłączysz odwrotnie kabelki to najwyżej nic się nie wgra, nie wykryje procka. Oczywiście nie pomyl GND z VCC.

Najlepiej wypróbować działanie programatora na jakimś sprawnym w 100% uC, albo innej płytce Arduino, może masz trzecie - UNO/NANO/MEGA/PRO MINI/Leonardo.

Możesz zacząć od wypalenia bootloadera, jeśli mocno coś upalone w uC to nie zagra. Ale żeby sprawdzić działanie UART (co jest konieczne dla działania bootloadera potem) to wgraj coś takiego:

/*
  Serial Event example

  When new serial data arrives, this sketch adds it to a String.
  When a newline is received, the loop prints the string and clears it.

  A good test for this is to try it with a GPS receiver that sends out
  NMEA 0183 sentences.

  NOTE: The serialEvent() feature is not available on the Leonardo, Micro, or
  other ATmega32U4 based boards.

  created 9 May 2011
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/SerialEvent
*/

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
int zmienna;
void setup() {
  // initialize serial:
  Serial.begin(115200);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
Serial.println(zmienna++); 
 delay(1000);  
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

Ustaw w terminalu zgodną prędkość, wysyłanie linii tekstu zakończonej znakami NL/CR, wysłana linia tekstu powinna wrócić, a poza tym co 1s wysyła z Arduino wartość zmienna++. 

Tu masz opisaną procedurę w wielu wariantach:

https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP

Link do komentarza
Share on other sites

Dnia 21.04.2023 o 17:52, ethanak napisał:

Przede wszystkim - na sprawne Arduino musisz wgrać program "Arduino ISP" (jest w przykładach). Poza tym warto podłaczyc kondensator (np 10 uF) między resetem i masą (bez tego Arduino może się niepotrzebnie resetować).

Powodzenia!

 

Nie dodawaj żadnego kondensatora. Toż to jakaś bzdura. A już zwłaszcza 10uF... Taka duża pojemność może uszkodzić pin w sprawnym arduino... nie wiem skąd ten pomysł... pomijam już że na płytce Arduino Uno jest już 100nF kondensator a jego celem jest odfiltrowanie dużych zakłóceń które mogłyby wyindukować napięcie na pinie reset podczas normalnej pracy mikrokontrolera. To programator,  (w tym przypadku drugie arduino z wgranym wsadem Arduino as ISP) decyduje kiedy i na ile programowany procek resetuje. Jak dasz taki duży kondek to możesz to zakłócić lub jeżeli będzie programator wiele razy próbował zwierać do masy i zasilania (co się dzieje podczas programowania) taki pin z dużym kondkiem to może uszkodzić pin resetujący. Kondensator podczas zmiany napięcia na nim pobiera duży prąd żeby się przeładować (ic = C 8 dUc / dt). Prąd ogranicza tylko jego ESR i rezystancja kanału mosfetów w driverze GPIO.

Jeżeli w płytce Uno z której wyleciał bootloader stało się tylko to to wystarczy podłączyć sprawne UNO z wgranym Wsadem Arduino as ISP. To wszystko. Wewnątrz skeczu na samej górze opisane jest jakie piny podłączyć do jakich.

Potrzebne są sygnały:

Arudino(AsIP) -> UNO bez bootladera:

VCC->VCC

GND->GND

MISO->MISO

MOSI->MOSI

SCK->SCK

wybrany w skecthu pin -> RST (BROŃ BOŻE ŻADNEGO KONDENSATORA!)

i tyle 🙂

 

póżniej dajesz w ArduinoIDE odpowiedni programator w ustawieniach i klikasz wypal bootlader. To wszystko.

Edytowano przez Nefarious19
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.