problema reset - Arduino Mega 2560 R3

Ciao ragassi, ho un problema con un mega 2560 R3 originale. praticamente se lo resetto dal tasto reset, levando la corrente, o ricaricando lo stesso sketch mi si impallano le periferiche, in particolare una RF24 che deve ricevere dei dati e che invece mi risponde che non riceve nulla. se invece cambio anche solo una riga dello sketch (es. commento una riga, carico, levo il commento e ricarico lo sketch identico a prima) funziona tutto. mistero. mi si è fottuto il circuito di reset? ma allora perché se ricarico da pc devo per forza cambiare lo sketch????

la configurazione è questa: mega con attaccata la ethernet shield 5100, ricevitore nRF24l01 + pa, ed un display lcd

potrebbe essere altrimenti la radio che mi si è fottuta?

ciao

tutto può essere, ma per un certo periodo di tempo ti ha funzionato tutto o hai avuto sempre qualche problema?

in realtà in questa configurazione non ho mai avuto modo di provarlo. prima usavo un "uno" R3 ma poi sono dovuto passare a mega per i pin. il mega cmq prima funzionava tranquillamente. nel frattempo ho provato un alimentatore da 2 ampere, eliminando - credo - il sospetto di un problema di alimentazione....

non puoi riprovare la UNO per vedere se il problema si presenta comunque?

si, con la uno funziona. ma non posso attaccare la RF24, quindi lo posso dire solo della shield.... ma lo sketch, se identico a quello già presente sulla scheda, viene comunque ricaricato?

ciao

federikk79: mi si è fottuto il circuito di reset?

No, il tuo problema è sicuramente di natura software, prova a far funzionare solo la RF24, ovvero commenta tutta la parte di programma non relativo a questo modulo, e verifica se funziona regolarmente dopo un reset.

grazie, posso chiederti cosa ti fa essere così categorico?
cmq incollo il codice, magari qualcuno può darmi una mano:

#include <LiquidCrystal.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#include <Ethernet.h>

//configurazione webserver


RF24 radio(49,53);
const uint64_t pipes[3] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0F3LL };

LiquidCrystal lcd(23, 25, 27, 29, 31, 33);



void setup(void) {
    pinMode(tasto, INPUT);
digitalWrite(tasto, HIGH);
  //pin della shield ethernet: w5100 n.10, sd n.4
  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);  
//pin shield nrf24
  pinMode(49, OUTPUT);
  pinMode(53, OUTPUT);  
  
//disabilita nrf24
  digitalWrite(49, HIGH);
  digitalWrite(53, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(4, LOW);  
  
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());

  Serial.begin(57600);
  lcd.begin(16, 2);

Serial.println("setup");

  digitalWrite(49, LOW);
  digitalWrite(53, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(4, HIGH);


  printf_begin(); 
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setRetries(15,15); 
  radio.setPayloadSize(8);    
  radio.openWritingPipe(pipes[0]);     
//blocco la lettura dal box, solo dal ripetitore in veranda
//radio.openReadingPipe(1,pipes[1]);
  radio.openReadingPipe(2,pipes[2]); 
 ;   
  radio.startListening();   
  radio.printDetails(); 
  } 


void loop(void) {
 Serial.println("inizio loop");

     delay(20);

  if( ! digitalRead(tasto)){
  luce=2;}
  
  delay(5);
  Serial.println("letto tasto");
lcd.setCursor(2, 0);
  lcd.print(luce);

  digitalWrite(49, LOW);
  digitalWrite(53, LOW);
  digitalWrite(10, HIGH);
  digitalWrite(4, HIGH);

radio.stopListening();
delay(5);
radio.write( &luce, sizeof(luce));
delay(400);
 radio.startListening();
  delay(2000);
      while ( radio.available() )
    {delay(30);
     bool done = false;
      while (!done){
        done = 
        radio.read( &dato[0], sizeof(dato[0]));
       done =
       radio.read( &dato[1], sizeof(dato[1]));

	delay(5);
      }   
}
lcd.setCursor(0, 0);
  lcd.print("     ");
  lcd.setCursor(0, 0);
      lcd.print(dato[0]);
      lcd.setCursor(2, 0);
  lcd.print(luce);
if (dato[0]==1){
   lcd.setCursor(6, 0);
      lcd.print(dato[1]);
      valori[0]=dato[1];}
      if (dato[0]==2){
   lcd.setCursor(0, 1);
      lcd.print(dato[1]);
   valori[1]=dato[1]; }
            if (dato[0]==3){
   lcd.setCursor(6, 1);
      lcd.print(dato[1]);
    valori[2]=dato[1]; }
      
 if (dato[0]==4){
   lcd.setCursor(13, 0);
      lcd.print(dato[1]);
    valori[3]=dato[1]; }
  if (dato[0]==5){
   lcd.setCursor(13, 1);
      lcd.print(dato[1]);
    valori[4]=dato[1]; }
      
      if(dato[0] == 1 && dato[1] > 1000){
        lcd.clear();
       lcd.setCursor(2, 0);
  lcd.print("PROX - beep");}
     delay(100);
   if( ! digitalRead(tasto)){
  luce=2;}
      else{luce=1;}   
      
  digitalWrite(49, HIGH);
  digitalWrite(53, HIGH);
  digitalWrite(10, LOW);
  digitalWrite(4, LOW);   
  
  Serial.println(data);
if (valori[2]>1600){
    valori[2]=valori[2]-2000;
    negativo=1;}
    if(valori[2]>600){
      negativo=0;
  valori[2]=valori[2]-1000;}
  Serial.println(valori[0]);
    Serial.println(valori[1]);
      Serial.println(valori[2]);
        Serial.println(valori[3]);
          Serial.println(valori[4]);
  EthernetClient client = server.available();
 //SEGUE PARTE PALLOSA IN HTML OMESSA
    Serial.println("client disonnected");
  }   
          
     if( ! digitalRead(tasto)){
  luce=2;}  
}

Secondo me è un problema di condivisione del bus SPI.

poèsse, dai un'occhiata al codice: c'è un'alternanza HIGH - LOW dei pin preposti alla radio ed all'ethernet (il display è parallelo), ti pare corretta?

ciao

Non devi imporre i pinmode lo fa già la libreria cosi come l'abilitazione o la disabilitazione dei pin SS.

ciao, allora grazie a tutti. in questo momento ho risolto comandando l'nrf24 con il pin 49(collegato al pin CE - e non CS - bah) e con la shield ethernet comandata comunque tramite pin 10. il 53 (SS) va lasciato output ma non toccato assolutamente.

qualcuno ha idea di come mai funzioni solo così? l'nRF24 non si comanda col pin SS/CS? la shield ethernet non va comandata dal 53 sul mega 2560?

L'interfaccia SPI prevede l'uso di 4 pin + Vcc e GND I 4 pin sono: MISO, MOSI, SCK e SS MISO, MOSI e SCK sono i canali di comunicazione e di sincronismo comuni a tutte le periferiche. Il pin SS serve invece per selezionare la periferica con cui si vuole comunicare. Tra tutte le periferiche collegate tra di loro, nella maggioranza dei casi, c'è una che comanda (master) e le altre che ascoltano e restituisco dati (slave). Il master non ha bisogno del pin SS mentre è necessario per gli Slave. Adesso, il pin SS (10 sulla UNO, 53 sulla MEGA) è relativo alla Arduino quando questa funziona da Slave (praticamente quasi mai) e quindi può essere ignorato, ovvero deve essere inizializzato come output ma può essere usato come normale uscita modificando lo stato in HIGH o LOW secondo necessità. Se fosse impostato in INPUT, automaticamente l'Arduino passerebbe in modalità SLAVE e quindi non comanderebbe più le altre periferiche ma aspetterebbe comandi dagli altri. Se questa cosa non è compresa si rischia di fare confusione e creare malfunzionamenti difficilmente risolvibili.

Nel tuo caso tu hai 3 periferiche connesse al bus SPI, la MEGA, la Ethernet e la RF. Tutte e tre hanno in comune i pin MISO, MOSI e SCK, mentre dovranno avere differenti pin SS. La RF usa anche un 5° pin per l'abilitazione della radio stessa. Siccome la MEGA è usata come master la libreria SPI pone in automatico il pin 53 in output con segnale LOW, ma come detto prima è possibile utilizzarlo per pilotare uno slave. L'importante e non metterlo in INPUT. La Ethernet ha come pin SS il pin 10 di Arduino mentre per la RF dovresti usare il 53 sopramenzionato.

Spero di essere stato chiaro e di non aver detto cose inesatte (tanto adesso passano Astro o Uwe e mi correggono :disappointed_relieved:)

grazie davvero a tutti. non so perchè, ma se provo a pilotare l'RF con il 53 - anche se resta OUTPUT - mi crasha tutto se resetto. a sketch appena caricato funziona.

altra cosa strana è che sto pilotando l'RF tramite pin E, e non CS. se inverto, non va del tutto.

sono entrambi OUTPUT. bah!

ad ogni modo ho risolto, quindi davvero grazie.