Robot-Will/Stino

Improper compilation causing endless rebooting

CptAwe opened this issue · 1 comments

Edit: this issue is solved. See solution at the bottom.


If the following code is compiled through Stino then the arduino will reset itself endlessly. On the other hand, if the code is compiled through the arduino IDE then everything is fine.

The problem seems to appear when the three functions (WakeUp(), ShowInfo(), Select_level_1()) in loop() are executed in that order.

I suspect it has something to do with the MFRC522 or SPI libraries or the way serial communication is compiled and handled through Stino.

Sorry for the endless code, but I don't know exactly where the problem is.

Environment:

  • OS version: Win 10
  • Arduino IDE version: 1.8.5
  • MFRC522 Library version: 1.4.0
  • Stino version: Stino 2017
  • Arduino device: Arduino UNO
 /*   RFID-RC522 (SPI connection)
 *   
 *    RC522           Arduino (UNO)
 *     SDA  -----------  9 (See SDA_PIN) [Slave Select pin]
 *     SCK  -----------  13
 *     MOSI -----------  11
 *     MISO -----------  12
 *     IRQ  ----------- 
 *     GND  -----------  GND
 *     RST  -----------  8 (See RST_PIN)
 *     3.3V -----------  3.3V
 *     
 */

#include <MFRC522.h>
#include <SPI.h>

#define RST_PIN 8
#define SDA_PIN 9


byte Card[16][4];


MFRC522 NFC(SDA_PIN, RST_PIN);

void WakeUp(bool debug=false);
void ShowInfo(bool debug=false);
void Select_level_1(bool debug=false);

void setup() {

	Serial.begin(19200);// Initialize serial communications with the PC


	Serial.println("\n~~~~~~~~~~");
	Serial.print("Starting SPI...");
	SPI.begin();                                    // Init SPI bus
	Serial.println(" Done!");
	Serial.print("Initializing the RC522...");
	NFC.PCD_Init();                                 // Init MFRC522
	Serial.println(" Done!");
	//  NFC.PCD_DumpVersionToSerial();              // Show details of PCD - MFRC522 Card Reader details
	Serial.println("Ready...");
	Serial.println("~~~~~~~~~~");

}



void loop() {

	// if( !NFC.PICC_IsNewCardPresent()) {
	// 	return;
	// }

	// if ( ! NFC.PICC_ReadCardSerial()) {
	// 	return;
	// }


	WakeUp();
	ShowInfo(true);
	
	Select_level_1(true);

	Serial.println("Done...");
	Serial.println("~~~~~~~~~~");
	while(true){}

}

// Wakes up the card
void WakeUp(bool debug=false){
	Serial.println("Waking Up the card...");

	MFRC522::StatusCode status;

	byte response[2];
	status=NFC.PICC_REQA_or_WUPA(NFC.PICC_CMD_WUPA, response, 2);

	Serial.print("   PICC_REQA_or_WUPA(): ");
	Serial.println(NFC.GetStatusCodeName(status));

	if(debug){
		Serial.println("   Expected: 44 0");
		Serial.print("   Response: ");
		for (byte i=0; i<2; i++){
			Serial.print(response[i],HEX);
			Serial.print(" ");
		}
	Serial.println();
	}
}

// fills the "Card[16][4]" with 0s
void ResetInfo(){
	for (int i=0; i<=15; i++){
		for (int j=0; j<=4; j++){
			Card[i][j]=0;
		}
	}
}

// fills the "Card[16][4]" with data
void ReadInfo(bool debug=false) {

	ResetInfo();
  
	MFRC522::StatusCode status;

	byte buffer[18]; // 16 (data) + 2 (CRC)

	for (byte page=0; page<=15; page+=4){

	    byte byteCount = sizeof(buffer);
	    status=NFC.MIFARE_Read(page,buffer,&byteCount);
	    if (status != NFC.STATUS_OK) {
	      Serial.print("MIFARE_Read(): ");
	      Serial.println(NFC.GetStatusCodeName(status));
	      return;
	    }

		//     [page][index]
		//      0-15   0-3
		// Card [16]   [4]

		//      0-3   page 0
		//      4-7   page 1
		//      8-11  page 2
		//     12-15  page 3
		// response[16+2]

	    int i_=0;
	    for (int i=page; i<=page+3; i++){
	      for (int j=0; j<=3; j++){
	        Card[i][j]=buffer[4*i_ + j];
	      }
	      i_++;
	    }

	}

	//  This is to stop the card from sending the info over and over again
	// NFC.PICC_HaltA();
}

// Nice way to show the card's data
void ShowInfo(bool debug=false){
	ReadInfo(debug);

	Serial.print("--------------------");
	for (byte i=0; i<=15; i++){
		Serial.print("\n ");
		for (byte j=0; j<=3; j++){
			Serial.print(Card[i][j],HEX);
			Serial.print(" ");
		}
	}
	Serial.print("\n--------------------\n");
}

void Select_level_1(bool debug){

	MFRC522::StatusCode status;

	byte command[9];
	command[0]=0x93; // Select command
	command[1]=0x70; // Select argument
	command[2]=0x88; // Cascade Tag

	command[3]=Card[0][0]; // ID0
	command[4]=Card[0][1]; // ID1
	command[5]=Card[0][2]; // ID2
	command[6]=0x88^Card[0][0]^Card[0][1]^Card[0][2];// BCC1

	status=NFC.PCD_CalculateCRC(command,2,&command[7]);
	if (debug){
		Serial.print("PCD_CalculateCRC(): ");
	    Serial.println(NFC.GetStatusCodeName(status));
	}
	

	// This part causes the endless reseting
	for (int i = 0; i < 9; i++)
	{
		Serial.print(command[i],HEX);
		Serial.print(" ");
	}
		

	// byte command_size=sizeof(command);

	// byte response[3];
	// byte response_size=sizeof(response);
	// status=NFC.PCD_TransceiveData(	command,
	// 								command_size,
	// 								response,
	// 								response_size,
	// 								NULL,
	// 								0,
	// 								true);
	// if (debug){
	// 	Serial.print("PCD_TransceiveData(): ");
	//     Serial.println(NFC.GetStatusCodeName(status));
	// }

}

Well, after some sleep I solved the issue.

For future reference:
The Arduino will reset itself if you try to access a value of an array outside of it's original size (see: ResetInfo() > "for (int j=0; j<=4; j++)")

This issue is solved and has nothing to do with the plugin!