help with seven segment timer sketch

Hello,
I am construction a seven segment timer display. and after handling with the hardware issues I am having trouble with the software. don't get me wrong everything works until I get to Zero. the timer eventually I suppose to count down from 13:00 to 00:00 and than I should restart and do it again. that it's doing now is when it get to zero he count down in twice the speed for two rounds and than back in normal speed. I just can't figure out why he does that, nothing I did made it work differently.

this is the sketch:

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/wdt.h>

#define T 20


int a=T,min_tens=0,min_ones=0,sec_tens=0,sec_ones=0,testsec=0, elp=0;
int tmt=0,tmo=0,tso=0,tst=0;

int A_ON =  52;
int A_OFF =  53;
int B_ON = 50;
int B_OFF = 51;
int C_ON =  48;
int C_OFF =  49;
int D_ON = 46;
int D_OFF = 47;
int E_ON =  44;
int E_OFF =  45;
int F_ON = 42;
int F_OFF = 43;
int G_ON =  40;
int G_OFF =  41;
int SEC_O = 26;
int SEC_T = 27;
int MIN_O = 28;
int MIN_T = 29;


////////////// 7 Segment numbers //////////////////
void one()
{
  digitalWrite(A_ON,  LOW);
  digitalWrite(A_OFF, HIGH);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  LOW); 
  digitalWrite(G_OFF, HIGH);  
   
  
}
void two()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  LOW);
  digitalWrite(C_OFF, HIGH);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void tree()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void four()
{
  digitalWrite(A_ON,  LOW);
  digitalWrite(A_OFF, HIGH);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void five()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  LOW);
  digitalWrite(B_OFF, HIGH); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void six()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  LOW);
  digitalWrite(B_OFF, HIGH); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void seven()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  LOW); 
  digitalWrite(G_OFF, HIGH);  
    
}
void eight()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
  
}
void nine()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
  
}
void ziro()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  LOW); 
  digitalWrite(G_OFF, HIGH);  
    
}
////////////////////////////////////////////////////

///////////// Serial print for teasting ////////////


void seven_seg(int num)
{
 switch (num)
 {
  case 0:
   ziro();
   Serial.print("0");
  break; 
  case 1:
   one();
   Serial.print("1");
  break; 
  case 2:
   two();
   Serial.print("2");
  break; 
  case 3:
   tree();
   Serial.print("3");
  break; 
  case 4:
   four();
   Serial.print("4");
  break; 
  case 5:
   five();
   Serial.print("5");
  break; 
  case 6:
   six();
   Serial.print("6");
  break; 
  case 7:
   seven();
   Serial.print("7");
  break; 
  case 8:
   eight();
   Serial.print("8");
  break; 
  case 9:
   nine();
   Serial.print("9");
  break; 
 }
////////////////////////////////////////////


void setup()   {                
 Serial.begin(9600);


  pinMode(A_ON,  OUTPUT); 
  pinMode(A_OFF, OUTPUT);
  pinMode(B_ON,  OUTPUT); 
  pinMode(B_OFF, OUTPUT);
  pinMode(C_ON,  OUTPUT); 
  pinMode(C_OFF, OUTPUT);
  pinMode(D_ON,  OUTPUT); 
  pinMode(D_OFF, OUTPUT); 
  pinMode(E_ON,  OUTPUT); 
  pinMode(E_OFF, OUTPUT);
  pinMode(F_ON,  OUTPUT); 
  pinMode(F_OFF, OUTPUT);
  pinMode(G_ON,  OUTPUT); 
  pinMode(G_OFF, OUTPUT);
  pinMode(SEC_O, OUTPUT);
  pinMode(SEC_T, OUTPUT);
  pinMode(MIN_O, OUTPUT);
  pinMode(MIN_T, OUTPUT);
  
  
              }



void loop()                     
{
   
if (a>=0  &&  a!=T-testsec  )
//for(int i=T;i>=0;i--)
      {
                min_tens=((a/60)/10);         // Finding minute tens number
                if (tmt!=min_tens){           // Checking if it changed since last time (save power)
                digitalWrite(MIN_T, HIGH);    // activate the seven segmant panel "minute tens"
                seven_seg(min_tens);          // sending the number to the display
                delay(100);                   // Time needed for flap to change position
                digitalWrite(MIN_T,LOW);}     // turing off the panel
                
               
            min_ones=((a/60)%10);
                if (tmo!=min_ones){
                digitalWrite(MIN_O, HIGH);
                seven_seg(min_ones);
                delay(100);
                digitalWrite(MIN_O,LOW);}
            Serial.print(":");


                sec_tens=((a%60)/10);
                if (tst!=sec_tens){
                digitalWrite(SEC_T, HIGH);
                seven_seg(sec_tens);
                delay(100);
                digitalWrite(SEC_T,LOW);}
                
                sec_ones=((a%60)%10);
                if (tso!=sec_ones){
                digitalWrite(SEC_O, HIGH);
                seven_seg(sec_ones);
                delay(100);
                digitalWrite(SEC_O,LOW);}
            
              Serial.println(" "); // dropping line
            
              a=a-1;      // Second update

      }
tso=sec_ones;  
tst=sec_tens;
tmo=min_ones;
tmt=min_tens;      
 testsec=millis()/1000-elp;

 if (a==0)
 {
   elp=millis()/1000;
   a=T;
 }
}

if anyone has a different way to reset the timer I would like to know cuz I am becoming bold...

Thanks,
Tom

Its difficult to follow code that uses variables with names like T, a, tmt, tso, tst, elp

Try to give them meaningful names

Also, why not use a variable that represents the total number of seconds to countdown ( 780 if your countdown is for 13 minutes)

Here is a fragment that shows one way to handle this (the seven_seg function is not included here)

int SEC_O = 26;
int SEC_T = 27;
int MIN_O = 28;
int MIN_T = 29;


void setup()
{                
  Serial.begin(9600);  
}

void loop()                     
{
  int countDown  = 13 * 60 + 0; // countdown for 13 minutes and zero seconds
  while(countDown > 0)
  {
     displayDigit(MIN_T, countDown / 600);
     displayDigit(MIN_O, (countDown / 60) % 10);
     displayDigit(SEC_T, (countDown % 60) / 10);
     displayDigit(SEC_O, (countDown % 60) % 10);
     Serial.println();
     countDown--;
     delay(1000);    
  }
  Serial.println("countdown is 0");  
}


void displayDigit(int place, int value)
{
  digitalWrite(place, HIGH);
  seven_seg(value);
  digitalWrite(place, LOW); 
  Serial.print(value);
}

I have changed some of the parameters names to be better understood.
I need a total variable to so I could have it unchanged and can use it everywhere quickly without having to go and change the timer duration everywhere it's in use .
my problem is not running a timer, but restarting it at the end...
if you can run it and let it run out of time and see what happens...

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/wdt.h>

#define T 20                       // Time in second, defines the duration of the timer


int a=T;                           // gets the duration of the timer. a constantly changing variable
int min_tens=0,min_ones=0,sec_tens=0,sec_ones=0,testsec=0, elpesed=0;
int tmt=0,tmo=0,tso=0,tst=0;       // abbriviations of "Temporary Minute Tens" and so on... 

int A_ON =  52;
int A_OFF =  53;
int B_ON = 50;
int B_OFF = 51;
int C_ON =  48;
int C_OFF =  49;
int D_ON = 46;
int D_OFF = 47;
int E_ON =  44;
int E_OFF =  45;
int F_ON = 42;
int F_OFF = 43;
int G_ON =  40;
int G_OFF =  41;
int SEC_O = 26;
int SEC_T = 27;
int MIN_O = 28;
int MIN_T = 29;


////////////// 7 Segment numbers //////////////////
void one()
{
  digitalWrite(A_ON,  LOW);
  digitalWrite(A_OFF, HIGH);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  LOW); 
  digitalWrite(G_OFF, HIGH);  
   
  
}
void two()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  LOW);
  digitalWrite(C_OFF, HIGH);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void tree()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void four()
{
  digitalWrite(A_ON,  LOW);
  digitalWrite(A_OFF, HIGH);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void five()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  LOW);
  digitalWrite(B_OFF, HIGH); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void six()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  LOW);
  digitalWrite(B_OFF, HIGH); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
    
}
void seven()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  LOW);
  digitalWrite(F_OFF, HIGH);                  
  digitalWrite(G_ON,  LOW); 
  digitalWrite(G_OFF, HIGH);  
    
}
void eight()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
  
}
void nine()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  LOW); 
  digitalWrite(D_OFF, HIGH);  
  digitalWrite(E_ON,  LOW);
  digitalWrite(E_OFF, HIGH); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  HIGH); 
  digitalWrite(G_OFF, LOW);  
  
}
void ziro()
{
  digitalWrite(A_ON,  HIGH);
  digitalWrite(A_OFF, LOW);                
  digitalWrite(B_ON,  HIGH);
  digitalWrite(B_OFF, LOW); 
  digitalWrite(C_ON,  HIGH);
  digitalWrite(C_OFF, LOW);                  
  digitalWrite(D_ON,  HIGH); 
  digitalWrite(D_OFF, LOW);  
  digitalWrite(E_ON,  HIGH);
  digitalWrite(E_OFF, LOW); 
  digitalWrite(F_ON,  HIGH);
  digitalWrite(F_OFF, LOW);                  
  digitalWrite(G_ON,  LOW); 
  digitalWrite(G_OFF, HIGH);  
    
}
////////////////////////////////////////////////////

///////////// Serial print for teasting ////////////


void seven_seg(int num)
{
 switch (num)
 {
  case 0:
   ziro();
   Serial.print("0");
  break; 
  case 1:
   one();
   Serial.print("1");
  break; 
  case 2:
   two();
   Serial.print("2");
  break; 
  case 3:
   tree();
   Serial.print("3");
  break; 
  case 4:
   four();
   Serial.print("4");
  break; 
  case 5:
   five();
   Serial.print("5");
  break; 
  case 6:
   six();
   Serial.print("6");
  break; 
  case 7:
   seven();
   Serial.print("7");
  break; 
  case 8:
   eight();
   Serial.print("8");
  break; 
  case 9:
   nine();
   Serial.print("9");
  break; 
 }
////////////////////////////////////////////


void setup()   {                
 Serial.begin(9600);


  pinMode(A_ON,  OUTPUT); 
  pinMode(A_OFF, OUTPUT);
  pinMode(B_ON,  OUTPUT); 
  pinMode(B_OFF, OUTPUT);
  pinMode(C_ON,  OUTPUT); 
  pinMode(C_OFF, OUTPUT);
  pinMode(D_ON,  OUTPUT); 
  pinMode(D_OFF, OUTPUT); 
  pinMode(E_ON,  OUTPUT); 
  pinMode(E_OFF, OUTPUT);
  pinMode(F_ON,  OUTPUT); 
  pinMode(F_OFF, OUTPUT);
  pinMode(G_ON,  OUTPUT); 
  pinMode(G_OFF, OUTPUT);
  pinMode(SEC_O, OUTPUT);
  pinMode(SEC_T, OUTPUT);
  pinMode(MIN_O, OUTPUT);
  pinMode(MIN_T, OUTPUT);
  
  
              }



void loop()                     
{
   
if (a>=0  &&  a!=T-testsec  )
//for(int i=T;i>=0;i--)
      {
                min_tens=((a/60)/10);         // Finding minute tens number
                if (tmt!=min_tens){           // Checking if it changed since last time (save power)
                digitalWrite(MIN_T, HIGH);    // activate the seven segmant panel "minute tens"
                seven_seg(min_tens);          // sending the number to the display
                delay(100);                   // Time needed for flap to change position
                digitalWrite(MIN_T,LOW);}     // turing off the panel
                
               
            min_ones=((a/60)%10);
                if (tmo!=min_ones){
                digitalWrite(MIN_O, HIGH);
                seven_seg(min_ones);
                delay(100);
                digitalWrite(MIN_O,LOW);}
            Serial.print(":");


                sec_tens=((a%60)/10);
                if (tst!=sec_tens){
                digitalWrite(SEC_T, HIGH);
                seven_seg(sec_tens);
                delay(100);
                digitalWrite(SEC_T,LOW);}
                
                sec_ones=((a%60)%10);
                if (tso!=sec_ones){
                digitalWrite(SEC_O, HIGH);
                seven_seg(sec_ones);
                delay(100);
                digitalWrite(SEC_O,LOW);}
            
              Serial.println(" "); // dropping line
            
              a=a-1;      // Second update

      }
tso=sec_ones;  
tst=sec_tens;
tmo=min_ones;
tmt=min_tens;      
 testsec=millis()/1000-elpesed;

 if (a==0)
 {
   elpesed=millis()/1000;
   a=T;
 }
}

I think its much easier to time addition and subtraction using the approach shown in my reply above. I would be happy to answer any questions you have about how it works or help you modify it to get it closer to what you want.