diff --git a/scheduler/include/scheduler.h b/scheduler/include/scheduler.h
index cdbdae51afea7b792d61cded39081c118bf8bcbe..539b9c502894b20471fa03ca6ba503c445db991d 100644
--- a/scheduler/include/scheduler.h
+++ b/scheduler/include/scheduler.h
@@ -24,25 +24,26 @@
 typedef enum {SCHED_CH1=0,SCHED_CH2=1,SCHED_CH3=2,SCHED_CH4=3} sched_channel_t;
 
 typedef struct{
-  void (*function)(void);
+  void (*function)(void *data);
   unsigned char period_ms;
   unsigned int pulse;
   unsigned char enabled;
+  void *data;
 }TSchedulerChannel;
 
 typedef struct{
   TSchedulerChannel channels[SCHEDULER_MAX_CHANNELS];
   unsigned char num_channels;
   unsigned short int prescaler;
-  void (* start)(sched_channel_t);
-  void (* stop)(sched_channel_t);
-  void (* set_pulse)(sched_channel_t,unsigned short,unsigned char);
+  void (* start)(unsigned short int);
+  void (* stop)(unsigned short int);
+  void (* set_pulse)(unsigned short int,unsigned short int,unsigned char);
 }TScheduler;
 
 void scheduler_init(TScheduler *scheduler,unsigned char num_channels, unsigned short int prescaler);
 void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id);
 unsigned short int scheduler_get_pulse(TScheduler *scheduler, sched_channel_t channel_id);
-void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void), unsigned char period_ms);
+void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char period_ms,void *data);
 void scheduler_enable_channel(TScheduler *scheduler,sched_channel_t channel_id);
 void scheduler_change_period(TScheduler *scheduler,sched_channel_t channel_id,unsigned char period_ms);
 void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id);
diff --git a/scheduler/src/scheduler.c b/scheduler/src/scheduler.c
index a9bfd0d96ffad632eaadb31c5a7c718492d46b80..d4f420decf26a9cba28e4f6439e294d40fbfd79c 100644
--- a/scheduler/src/scheduler.c
+++ b/scheduler/src/scheduler.c
@@ -42,13 +42,13 @@ void scheduler_interrupt(TScheduler *scheduler,sched_channel_t channel_id)
   if(channel_id<scheduler->num_channels)
   {
     if(scheduler->set_pulse!=0x00000000)
-      scheduler->set_pulse(channel_id,scheduler->channels[channel_id].pulse,0x01);
+      scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x01);
     if(scheduler->channels[channel_id].function!=0x00000000)
-      scheduler->channels[channel_id].function();
+      scheduler->channels[channel_id].function(scheduler->channels[channel_id].data);
   }
 }
 
-void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void), unsigned char period_ms)
+void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, void (*function)(void *data), unsigned char period_ms,void *data)
 {
   if(channel_id<scheduler->num_channels)
   {
@@ -61,6 +61,7 @@ void scheduler_set_channel(TScheduler *scheduler,sched_channel_t channel_id, voi
     scheduler->channels[channel_id].function=function;
     scheduler->channels[channel_id].period_ms=period_ms;
     scheduler->channels[channel_id].pulse=scheduler_ms_to_pulse(scheduler,period_ms);
+    scheduler->channels[channel_id].data=data;
   }
 }
 
@@ -71,9 +72,9 @@ void scheduler_enable_channel(TScheduler *scheduler,sched_channel_t channel_id)
     if(scheduler->channels[channel_id].enabled==0x00)
     {
       if(scheduler->set_pulse!=0x00000000)
-        scheduler->set_pulse(channel_id,scheduler->channels[channel_id].pulse,0x00);
+        scheduler->set_pulse(scheduler_get_channel(channel_id),scheduler->channels[channel_id].pulse,0x00);
       if(scheduler->start!=0x00000000)
-        scheduler->start(channel_id);
+        scheduler->start(scheduler_get_channel(channel_id));
       scheduler->channels[channel_id].enabled=0x01;
     }
   }
@@ -92,8 +93,8 @@ void scheduler_disable_channel(TScheduler *scheduler,sched_channel_t channel_id)
     if(scheduler->channels[channel_id].enabled==0x01)
     {
       if(scheduler->stop!=0x00000000)
-        scheduler->stop(channel_id);
-      scheduler->channels[channel_id].enabled=0x0;
+        scheduler->stop(scheduler_get_channel(channel_id));
+      scheduler->channels[channel_id].enabled=0x00;
     }
   }
 }