Problem with modulo (%) and reset

I change this to more correct forum from HW
(was http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1293529218)

Problem with modulo (%) and reset
Today at 10:40:18 | | Modify | Remove
I have a problem that after a small piece of code the Arduoino (UNO)
does no reset. It resets only by uploading a new sketch or by power off.

In the code below I separated the problem to % operation. My idea
was to give exact 1 second signal compared to last reset. I can go
around the problem by other ways, but I'm worried about why this peace of code has a problem. Because I got the same problem in longer code but occasionally (when interrupt happens during %).

My guess is that if reset or interrupt happens during % then the board is somehow in unknown state and does not reset.

The problem can be repeated by code below and pressing the reset button repeatedly until led in line 13 remains blinking. Then the Arduino is possible to reset only by new sketch or power on.

#include <Wire.h>
#include <string.h>

#undef int
#include <stdio.h>

const int dummyPort = 7;

void setup() {
Serial.begin(115200);
Serial.println("Start Arduino");
pinMode(dummyPort, OUTPUT);

}

unsigned long n1000 = 0;
boolean dOn = false;

void loop() {

n1000 = micros() % 1000000;
if ( !dOn && n1000 >= 500000 ) {
digitalWrite(dummyPort, 1);
dOn = true;
}

if ( dOn && n1000 < 500000 ) {
digitalWrite(dummyPort, 0);
dOn = false;
}

}


Replies to few questions:

This code is not doing the reset. The problem is that if YOU do reset
somehow during this code, the Aruino hangs and you can not do another
reset. Why should you do the reset? When you start serial from PC
it sinks the DTR and resets Arduino. So the problem is that when you have code like my example, you have good change to hang the Arduino
when you connect it thru USB from PC. And to simulate that it is much faster to just press the reset button and see what happends.

The micros (not millis) is just OK for me, because millis is not accurate enough in my purpose.

And the worst thing is that the same problem comes when some interrupt happens. And that is the main point, but I think Reset is more familiar for most people.


I have 3 Arduino Uno module and all behaves the same way.
And the reset comes also from USB-serial line by DTR low and
it has exactly same effect. So do external reset.

The difference in reset by reset button, external reset,
serial start reset and uplod is that when upload is done, the
rset signal stays 5 V, goes to 0 V and the over 7 V and then back to
5 V. All others just pull reset signal to 0 V and returns it 5 V.

The reset is one of my worries. The biggest is that WHY Arduino
hangs when Reset or Interrupt is done during %-operation???