Problema com Millis()

Olá amigos, estou fazendo um sistema de cronometragem que usa o millis() como base para obter o tempo. O problema é que quando o tempo é enviado para o receptor que irá guardar o tempo (e demonstra-lo), parece que o tempo trava, ou seja, apos a primeira medicao de tempo, todas em diante serão iguais, como se a variavel tempo (millis()) parasse na primeira comparação para pausar. Segue o codigo.

#include <VirtualWire.h>  
#undef int
#undef abs
#undef double
#undef float
#undef round

long tempo;
long tempoparado;
char memoria[10];
char TempoParado[8];
int botao = 9;
int fotocelula = 11;
int verde = 12;
int vermelho = 10;
int tempocorrendo = false;
int usuariorecebido = false;


void setup()
{
    pinMode(vermelho, OUTPUT);
    pinMode(verde, OUTPUT);
    pinMode(fotocelula, INPUT);
    pinMode(botao, INPUT);
    Serial.begin(9600);
    vw_setup(2000);                 
    vw_set_tx_pin(3);   
    vw_set_rx_pin(4);    
}

void loop()
{ 
       int val;
       val = digitalRead(botao);  //botao para iniciar o sistema
       if (val == HIGH)
       {
         tempo = millis(); // atribui a tempo os milisegundos
         digitalWrite(verde, HIGH);
         delay(2000);
         digitalWrite(verde, LOW);
         delay(2000);
         
         tempocorrendo = true;
         
         while ( tempocorrendo == true){  
         
         vw_rx_start();  //pega ID do usuario(lcd) que irá receber o tempo
         
         uint8_t buf[VW_MAX_MESSAGE_LEN];
         uint8_t buflen = VW_MAX_MESSAGE_LEN;
         
         if (vw_get_message(buf, &buflen)) {
           switch (buf[0]){ 
             case 'X': 
               usuariorecebido = true;
               digitalWrite(verde, HIGH);
               while (usuariorecebido == true  ) //usuario identificado
               {
                 vw_rx_stop();
                 int val1;
                 val1 = digitalRead(fotocelula);
                 if (val1 == HIGH)  // fotocelula para abrir o tempo
                 {  
                   tempoparado = tempo; // aqui ele pega o tempo e copia pra tempoparado

                   digitalWrite(verde, LOW);

                   // envia as informaçoes

                   memset(memoria, '\0', sizeof(memoria));
                   memset(TempoParado, '\0', sizeof(TempoParado));
                   ltoa( tempoparado, TempoParado, 10 );
                   strcat(memoria,"A");     // Adiciona A que é a fotocelula da largada
                   strcat(memoria,"X");     // adiciona o ID do usuario X
                   strcat(memoria,TempoParado);  // adiciona o tempo
                   delay(200);
                   vw_send((uint8_t *)memoria, strlen(memoria));
                   vw_wait_tx();    
                   delay(500);
                   usuariorecebido = false;                          
             }}
         break;
         
         case 'Y': // o mesmo para um segundo usuario
           usuariorecebido = true;
           digitalWrite(verde, HIGH);
           while (usuariorecebido == true){
             int val1;
             val1 = digitalRead(fotocelula);
             if (val1 == HIGH)
             {  
                 tempoparado = tempo;
                 digitalWrite(verde, LOW);
                 memset(memoria, '\0', sizeof(memoria));
                 memset(TempoParado, '\0', sizeof(TempoParado));
                 ltoa( tempoparado, TempoParado, 10 );
                 strcat(memoria,"A");
                 strcat(memoria,"Y");
                 strcat(memoria,TempoParado);  
                 delay(200);
                 vw_send((uint8_t *)memoria, strlen(memoria));
                 vw_wait_tx();     
                 delay(500);
                 usuariorecebido = false;
             }} 
        break;   
       }}}}}

Se alguem puder me ajudar, já tentei criar uma funcao void tempo(){tempo = millis()} , tentando assim manter o tempo correndo, mas nao funcionou. Alguem?

Acho que vc não está atualizando o tempo dentro do while, certo?

Exatamente!
Acabei de refazer o code e testar, como o tempo tem que ser igual tanto na fotocelula da largada como na chegada eu nao podia botar o millis() dentro do while, caso contrario daria diferença de tempo na hora da subtração.

Vou postar o codigo aqui caso alguem tenha um duvida parecida no futuro.

Obrigado à todos!

#include <VirtualWire.h>  
#undef int
#undef abs
#undef double
#undef float
#undef round


long tempo;
long tempo1;
long tempoparado;
char memoria[10];
char TempoParado[8];
char usuariorecebido;
int botao = 9;
int fotocelula = 11;
int verde = 12;
int vermelho = 10;
int comeca = false;
int usuario = false;
int statususuariorecebido = false;
int iniciar = false;


void recebeusuario(){
 
  if(iniciar == true){
       usuario = true;
       while(usuario == true){
          
             vw_rx_start();
             uint8_t buf[VW_MAX_MESSAGE_LEN];
             uint8_t buflen = VW_MAX_MESSAGE_LEN;
             
             if (vw_get_message(buf, &buflen)) {
               usuariorecebido = buf[0];
               usuario = false;
               statususuariorecebido = true;
               vw_rx_stop();
             }}
}}

void setup()
{
    tempo = millis();
    pinMode(vermelho, OUTPUT);
    pinMode(verde, OUTPUT);
    pinMode(fotocelula, INPUT);
    pinMode(botao, INPUT);
    Serial.begin(9600);
    vw_setup(2000);                 
    vw_set_tx_pin(3);   
    vw_set_rx_pin(4);    
}

void loop()
{ 
       int val;
       val = digitalRead(botao);
       if (val == HIGH)
       {
         comeca = true;
       }
       if(comeca == true){
       
       tempo = millis();
       digitalWrite(verde, HIGH);
       delay(1000);
       digitalWrite(verde, LOW);
       delay(500);
       iniciar = true;
       recebeusuario();
       switch (usuariorecebido){  
                 case 'X':
                   digitalWrite(verde, HIGH);
                   while(statususuariorecebido == true  )
                   {
                     int val1;
                     val1 = digitalRead(fotocelula);
                     if (val1 == LOW)
                     {  
                       delay(1000);
                       tempoparado = tempo;
                       digitalWrite(verde, LOW);
                       memset(memoria, '\0', sizeof(memoria));
                       memset(TempoParado, '\0', sizeof(TempoParado));
                       ltoa( tempoparado, TempoParado, 10 );
                       strcat(memoria,"A");
                       strcat(memoria,"X");
                       strcat(memoria,TempoParado); 
                       delay(200);
                       vw_send((uint8_t *)memoria, strlen(memoria));
                       vw_wait_tx();    
                       delay(500);
                       statususuariorecebido = false;                          
                 }}
                 break;
             
                 case 'Y':
                   digitalWrite(verde, HIGH);
                   while(statususuariorecebido == true){
                     int val1;
                     val1 = digitalRead(fotocelula);
                     if (val1 == HIGH)
                     {  
                         tempoparado = tempo;
                         digitalWrite(verde, LOW);
                         memset(memoria, '\0', sizeof(memoria));
                         memset(TempoParado, '\0', sizeof(TempoParado));
                         ltoa( tempoparado, TempoParado, 10 );
                         strcat(memoria,"A");
                         strcat(memoria,"Y");
                         strcat(memoria,TempoParado);  
                         delay(200);
                         vw_send((uint8_t *)memoria, strlen(memoria));
                         vw_wait_tx();     
                         delay(500);
                         statususuariorecebido = false;
                     }} 
                     break;   
       }}}