Completando un poco lo que dice ezavalla, el compilador de C siempre esta tratando de optimizar lo mas posible el programa y aveces si detecta que una variable no se usa en algun loop o subrutina simplemente no la toma en cuenta, o la pone provisionalmente como constante, con volatile le estas diciendo al compilador que la variable puede cambiar en cualquier momento y asi el compilador se obliga a revisarla constantemente durante todo el programa
No es buena idea declarar todas tus variables como volatiles por que el tamaño del programa se incrementaria demasiado, solo declara como volatiles aquellas variables que sean modificadas por interrupciones o procesos ajenos al procesador (como timers, resultados de convertidores, buffers de transmision serial, etc)