Go Down

Topic: Stopwatch with Pause/Lap  6 digit 7 seg LED. HELP! (Read 123 times) previous topic - next topic

CrossRoads

#30
Dec 29, 2010, 04:58 pm Last Edit: Dec 29, 2010, 07:08 pm by CrossRoads Reason: 1
Hmm, doesn't seem to matter how long I set the interval, with the code as written there is 1mS jitter as to when latchpin goes from High to Low.
The whole time update section & incrementing, rolling over, etc, takes .02mS
The whole shift out sequence only takes 0.8mS.

On to the previousMillis update ...
Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

CrossRoads

#31
Dec 29, 2010, 07:00 pm Last Edit: Dec 29, 2010, 07:12 pm by CrossRoads Reason: 1
Okay, I updated the code as follows:
Code: [Select]

unsigned long currentmillis = 0;
unsigned long previousmillis = 0;
unsigned long interval = 10;
unsigned long elapsedmillis = 0;

byte latchpin = 2; // connect to pin 12 on the 74HC595
byte clockpin = 3; // connect to pin 11 on the 74HC595
byte datapin = 4; // connect to pin 14 on the 74HC595
byte testpin5 = 5;

byte ones_seconds = 0;
byte tens_seconds = 0;
byte ones_minutes = 0;
byte tens_minutes = 0;
byte tenths = 0;
byte hundredths= 0;


int segdisp[10] = {
 63,6,91,79,102,109,125,7,127,111 }; //segment references using 74HC595 Shift Registers
//The above numbers light up different segments of a digit

byte time_update = 0;// added new flag
void setup()
{
 pinMode(latchpin, OUTPUT);
 pinMode(clockpin, OUTPUT);
 pinMode(datapin, OUTPUT);
 pinMode(testpin5, OUTPUT);
 Serial.begin(57600);
}

void loop()
{
 currentmillis = millis();  // read the time.
 elapsedmillis = currentmillis - previousmillis;

 if (elapsedmillis >= interval) // 10 milliseconds have gone by
 {
   previousmillis  = previousmillis + elapsedmillis;  // save the time for the next comparison
   time_update = 1;
//    if (elapsedmillis>10){                       // commented this out to display time below
//      Serial.println (ones_seconds,DEC);
//      Serial.println (elapsedmillis,DEC);
//    }
   // digitalWrite (testpin5, LOW); // used to see how long the nex section took
 }
 // else {digitalWrite (testpin5, HIGH);}  // set flag to upate & shift out

 if (time_update == 1){  // no updating if not at 10ms interval, skip this whole section
   // increment the counters, roll as needed, shift the digits out

   time_update = 0; // reset for next pass thru

   hundredths = hundredths +1;

   if (hundredths == 10){
     hundredths = 0;
     tenths = tenths +1;
   }

   if (tenths == 10){
     tenths = 0;
     ones_seconds = ones_seconds +1;
     Serial.print ( tens_minutes,DEC);  // sending minutes/seconds to the screen
     Serial.print (ones_minutes,DEC);
     Serial.print (tens_seconds,DEC);
     Serial.println(ones_seconds,DEC);
   }

   if (ones_seconds == 10){
     ones_seconds = 0;
     tens_seconds = tens_seconds +1;
   }

   if (tens_seconds == 6){
     tens_seconds = 0;
     ones_minutes = ones_minutes +1;
   }

   if (ones_minutes == 10){
     ones_minutes = 0;
     tens_minutes = tens_minutes +1;
   }
   if (tens_minutes == 6){
     tens_minutes = 0;
   }
   // digitalWrite (testpin5, HIGH); // used to see how long the if's were taking
   // counters are all updated now, just do the shiftout one time here:
   digitalWrite(latchpin, LOW); // send the digits down to the shift registers!
   shiftOut(datapin, clockpin, MSBFIRST, segdisp[hundredths]); // print the % first "hundredths" digit
   shiftOut(datapin, clockpin, MSBFIRST, segdisp[tenths]); // print the tens of hundredths digit
   shiftOut(datapin, clockpin, MSBFIRST, segdisp[ones_seconds]); // print the % first "seconds" digit
   shiftOut(datapin, clockpin, MSBFIRST, segdisp[tens_seconds]); // print the tens of seconds digit
   shiftOut(datapin, clockpin, MSBFIRST, segdisp[ones_minutes]); // print the % first "minute" digit
   shiftOut(datapin, clockpin, MSBFIRST, segdisp[tens_minutes]); // print the tens of minutes digit
   digitalWrite(latchpin, HIGH);

 } // end if time to be updated

} // end void loop




am seeing that elapsedmillis = 11 four times a second consistently.
Have it running now, comparing time to my laptop clock, see if they stay in sync together.

Hmm, PC clock not good enough - I get the impression that it drifts a little also, as the two of them don't seem to update once a second together, the display lag between them drifts.
Designing & building electrical circuits for over 25 years. Check out the ATMega1284P based Bobuino and other '328P & '1284P creations & offerings at  www.crossroadsfencing.com/BobuinoRev17.
Arduino for Teens available at Amazon.com.

Warren Reeve

I'm running your code above Robert and it seems to be running almost 2 secs slow after 3 minutes..  :-[

I'm running more tests now.

Coding Badly


@Warren Reeve:  Give this a try...

Code: [Select]
unsigned long currentmillis = 0;
unsigned long previousmillis = 0;
unsigned long interval = 10;
unsigned long elapsedmillis = 0;

byte latchpin = 2; // connect to pin 12 on the 74HC595
byte clockpin = 3; // connect to pin 11 on the 74HC595
byte datapin = 4; // connect to pin 14 on the 74HC595
byte testpin5 = 5;

byte ones_seconds = 0;
byte tens_seconds = 0;
byte ones_minutes = 0;
byte tens_minutes = 0;
byte tenths = 0;
byte hundredths= 0;


int segdisp[10] = {
 63,6,91,79,102,109,125,7,127,111 }; //segment references using 74HC595 Shift Registers
//The above numbers light up different segments of a digit

void setup()
{
 pinMode(latchpin, OUTPUT);
 pinMode(clockpin, OUTPUT);
 pinMode(datapin, OUTPUT);
 pinMode(testpin5, OUTPUT);
 Serial.begin(57600);
}

void loop()
{
 currentmillis = millis();  // read the time.
 elapsedmillis = currentmillis - previousmillis;

 while (elapsedmillis >= interval) // 10 milliseconds have gone by
 {
   hundredths = hundredths +1;

   if (hundredths == 10){
     hundredths = 0;
     tenths = tenths +1;
   }

   if (tenths == 10){
     tenths = 0;
     ones_seconds = ones_seconds +1;
     Serial.print ( tens_minutes,DEC);  // sending minutes/seconds to the screen
     Serial.print (ones_minutes,DEC);
     Serial.print (tens_seconds,DEC);
     Serial.println(ones_seconds,DEC);
   }

   if (ones_seconds == 10){
     ones_seconds = 0;
     tens_seconds = tens_seconds +1;
   }

   if (tens_seconds == 6){
     tens_seconds = 0;
     ones_minutes = ones_minutes +1;
   }

   if (ones_minutes == 10){
     ones_minutes = 0;
     tens_minutes = tens_minutes +1;
   }
   if (tens_minutes == 6){
     tens_minutes = 0;
   }
   previousmillis  = previousmillis + interval;  // save the time for the next comparison
 }

 // digitalWrite (testpin5, HIGH); // used to see how long the if's were taking
 // counters are all updated now, just do the shiftout one time here:
 digitalWrite(latchpin, LOW); // send the digits down to the shift registers!
 shiftOut(datapin, clockpin, MSBFIRST, segdisp[hundredths]); // print the % first "hundredths" digit
 shiftOut(datapin, clockpin, MSBFIRST, segdisp[tenths]); // print the tens of hundredths digit
 shiftOut(datapin, clockpin, MSBFIRST, segdisp[ones_seconds]); // print the % first "seconds" digit
 shiftOut(datapin, clockpin, MSBFIRST, segdisp[tens_seconds]); // print the tens of seconds digit
 shiftOut(datapin, clockpin, MSBFIRST, segdisp[ones_minutes]); // print the % first "minute" digit
 shiftOut(datapin, clockpin, MSBFIRST, segdisp[tens_minutes]); // print the tens of minutes digit
 digitalWrite(latchpin, HIGH);

} // end void loop

Warren Reeve

Will try it now Codey (thank you).

After more test Robert that was loosing 5 secs after 12 mins..

Go Up