1) First of all, GPRS is a best-effort service, so it's latency is variable. You can try all you want to achieve timing precision, but if bandwidth is not available all that would be for nothing.
2) There are two preferred patterns for applications like yours:
- In power-saving pattern the device is put asleep between sampling/sending. Either external nano-power timer or internal watchdog is used to generate wake-up event. Note that wake-up period can be smaller than required sending period, which gives your code an opportunity to prepare data in advance and send it immediately upon certain timer tick.
- In precision pattern the main loop constantly reads ADC and uses oversampling/rolling average to counter ADC fluctuations. This leaves you with frequently updated value that you can use for your calculations either on every sample or at some intervals. The interrupt from either external or internal timer is used to trigger sending procedure, making sending period independent from the calculation code. This requires somewhat complex task management support because it is not a good idea to do long processing in the interrupt function itself. A simpler variant of this would be to assert "time to send" flag in the interrupt and pepper your long-running code with calls to "check the flag and send when ready" procedure.
3) In both patterns above the timer interrupt is used. Carefully chosen external timer can give you great precision out of the box, but it complicates the schematics. Given uncertain nature of GPRS the precision of internal MCU timers should be sufficient. MCU datasheets usually include detailed description of calibration procedure for RTC, which is ideal for this purpose.
4) No timer is precise. Even very good crystal-based external timer will have some drift. This is exactly the reason I suggested internal MCU timers in the first place, as they are precise enough over certain time period. In the long run you can utilize your GPRS connection for clock synchronization. The simplest would be NITZ service when it is available from current provider, however if you have internet connection you can try using NTP as well.
5) Finally, make sure this is not a XY problem. Ask yourself this: do you want to send data at fixed time only because you need to know when it was obtained? If yes, then simple preparation timestamp on the data allows it to be sent at irregular intervals, removing dependency on GPRS latency and calculation time. You still need precise timer to sign your data, but otherwise your code can do calculations and send results without hard timing constraints.