I detailed this a bit in another post, see
Note that using a delay-loop or non-looping timer is essentially the same, as chrudimer pointed above. Your case looks like a good example of a small overtime error accumulating with every trigger. A looping timer would fix that right away.