Grob gesagt: das 'volatile' sagt dem Compiler, dass die Variable u.U.
ausserhalb seiner direkten Kontrolle (z.B. durch eine ISR, oder weil es
ein Portregister ist, ...) verändert werden KÖNNTE, und zwingt ihn dazu
jeden Zugruiff darauf auch wirklich durchzuführen.
Ohne das 'volatile' merkt der Optimierer, dass Deine Zählschleife
eigentlich nichts bewirkt (ein Zeitgefühl haben CPUs (noch? ;-) nicht)
und optimiert die kurzerhand zu "i=10000". Damit blinkt's dann doch ein
klein wenig zu schnell für unsere (um diese Zeit) müden Äuglein...
@Falk:
Delay-Funktionen oder gar Timer kommen doch erst in den nächsten
Lektionen ;-))))