arduino ha smesso di funzionare

l’arduino ha smesso di funzionare…
dopo aver uppato un programma…l’arduino ha fatto qualcosa, non andava, l’ho resettato ed è come se si resettasse continuamente…
pensando di aver fatto casino con il watchdog ho preso l’altro arduino per riprogrammare ATmega… MA NON FA!
mi dà:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

quando cerco di ricaricarci il bootloader… … come è possibile???

nemmeno provando a riprogrammarlo mettendolo sulla board e facendo la programmazione avr

è possibile che tu lo abbia mandato in corto? io collegavo male due fili e mi si spegneva subito...

nono...avevo caricato uno sketch, pigiato reset ed è impazzito non c'erano cavi o cose strane attaccate....boh

ma hai inserito l'atmega nell' altro arduino e non funziona neanche con quello?

prova a mandargli uno sketch di esempio e premi e rilascia il tasto reset appena appare la scritta Binary sketch size: xxx bytes (of a 30720 byte maximum) edit: scusa non avevo visto

nemmeno provando a riprogrammarlo mettendolo sulla board e facendo la programmazione avr

manda lo sketch che hai caricato e che ha mandato in tilt l' arduino. Ciao Uwe

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <Udp.h>        
#include <avr/io.h>
#include <avr/wdt.h>


byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,202 };
unsigned int localPort = 8888;      // local port to listen on

byte remoteIp[] = { 192,168,0,201 }; 
byte remoteIp2[] = {192,168,0,203 };

unsigned int remotePort = 8888; // holds received packet's originating port
unsigned int remotePort2 = 8889;

char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 

int risposta;
int arrivo;
char invio[]="0";

int persi = 0;

int stato4 = 0;
int stato5 = 0;
int stato6 = 0;
int stato7 = 0;
int stati = 0;

void setup() {
  wdt_enable(WDTO_2S);
  
  pinMode(2, OUTPUT); //POMPA
  pinMode(3, OUTPUT); //Acquedotto
  pinMode(8, OUTPUT); //Assenza rete
  pinMode(9, OUTPUT); //Reset Arduino
  digitalWrite(9,LOW);  
  
  pinMode(4,INPUT); //Pompa ON
  pinMode(5,INPUT); //Acquedotto ON
  pinMode(6,INPUT); //Avaria Pompa
  pinMode(7,INPUT); //Energia Elettrica
  
 
  Ethernet.begin(mac,ip);
  Udp.begin(localPort);

  Serial.begin(9600);
}

void loop() {
  
   wdt_reset();
   stati = 0;
   //char packetBuffer[] = "0";

  int packetSize = Udp.available(); 
  if(packetSize)
  {     persi =0;


    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
   arrivo=atoi(packetBuffer);
   
    Serial.print("Ho Ricevuto:");
    Serial.println(arrivo);

  switch (arrivo) {
    case 1:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      break;
    
    case 2:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      break;
      
    case 3:
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      delay (5000);
      break;
    
    default: 
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      
  }}
  else { persi= persi+1;}
    if (persi >20){
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    Serial.println("Nessun Collegamento");}
    
    if (persi == 100){
      digitalWrite(9,HIGH);
      delay(50);
      digitalWrite(9,LOW);}
          
  
  Serial.print("pacchetti Persi: ");
  Serial.println(persi);
  Serial.println();
   stato4 = digitalRead(4);
   stato5 = digitalRead(5);
   stato6 = digitalRead(6);
   stato7 = digitalRead(7);
   
    
   if (stato4 == HIGH) { (stati=stati+1);   }  
   if (stato5 == HIGH) { (stati=stati+2);  }   
   if (stato6 == HIGH) { (stati=stati+4);  }
   if (stato7 == LOW) { (stati=stati+8);
                        digitalWrite(8, HIGH); }   
   if (stato7 == HIGH) {digitalWrite(8, LOW);} 

itoa(stati,invio,10); 

//invio[0] = char(stati);
//invio[1] = '\0';

Serial.print("Ho inviato");
Serial.println(invio);


    Udp.sendPacket( invio, remoteIp, remotePort);
    Udp.sendPacket( invio, remoteIp2, remotePort2);
  
  delay(250);
}

lo avevo fatto per vedere se funzionava il watchdog…nel caso avessi ricevuto 3 doveva attendere 5 secondi, quindi scattare il watchdog

azz
quando parte l’atmega, non parte subito il codice di skecth, ma il boot-loader, che attende qualche secondo se c’è comunicazione seriale di uno sketch e lo carica. la procedura ti sarai ben accorto che dura più di qualche secondo, soprattutto in sketch belli grossi.

PROBLEMA: da avr-libc: <avr/wdt.h>: Watchdog timer handling

Note that for newer devices (ATmega88 and newer, effectively any AVR that has the option to also generate interrupts), the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms)

quindi al restet parte il watchdog settato a 15ms…
quindi il boot-loader viene “bloccato” dal watch-dog!
Però il maledetto watch-dog non parte se togli la corrente, però se prima che carichi il nuovo codice parte il tuo sketch sei punto a capo.
Per risolvere dovresti:
0. aprire arduino IDE e scegliere uno sketch base tipo blink (giusto per sicurezza e velocità in upload)

  1. togliere corrente ad arduino (staccarlo da fonti di alimentazine come USB etc…)
  2. tenere premuto reset
  3. attaccare l’usb, TENENDO premuto reset
  4. cliccare upload. rilascia il tasto reset appena appare la scritta
    “Binary sketch size: xxx bytes (of a 30720 byte maximum)”

è difficile le prime volte prendere il tempo “giusto”. meglio qualche istante (ma comunque < 1s) PRIMA che compaia la scritta che dopo (esperienza personale). Il tempo che ci mette la scritta a comparire è sempre lo stesso, a meno che non cambi il codice o non hai programmi pesanti che rallentano il compilatore

ma ho provato anche a riprogrammarlo, sia co arduio come ISP, che come su board...ora mi stavo costruendo il programmattore parallelo.........

beh resettarlo e riprogrammarlo da ISP può essere una soluzione, se il watchdog non resetta l’arduino prima che tu riesca a resettarlo :slight_smile:

Ok! funzionaaaaaaaaaaa! Grazie! Con un cronometro sono riuscito a cronometrare esattamente il tempo :) ! ora però vorrei capire quale è l'errore nel programma.....