2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  "avr/io.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "util/delay.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "pt.h" 
  
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "timer/clock.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "timer/timer.h" 
  
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Two flags that the two protothread functions use. */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  protothread1_flag ,  protothread2_flag ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* Two timers for the two protothreads. */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  struct  timer  timer1 ,  timer2 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								protothread1 ( struct  pt  * pt )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /* A protothread function must begin with PT_BEGIN() which takes a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *       pointer  to  a  struct  pt .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  PT_BEGIN ( pt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /* We loop forever here. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while ( 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* Wait until the other protothread has set its flag. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PT_WAIT_UNTIL ( pt ,  protothread2_flag  ! =  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PORTB  | =  _BV ( PB3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    timer_set ( & timer1 ,  CLOCK_SECOND / 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PT_WAIT_UNTIL ( pt ,  timer_expired ( & timer1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    PORTB  & =  ~ _BV ( PB3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    timer_set ( & timer1 ,  CLOCK_SECOND / 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PT_WAIT_UNTIL ( pt ,  timer_expired ( & timer1 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* We then reset the other protothread's flag, and set our own
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       flag  so  that  the  other  protothread  can  run .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread2_flag  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread1_flag  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* And we loop. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /* All protothread functions must end with PT_END() which takes a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *       pointer  to  a  struct  pt .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  PT_END ( pt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								protothread2 ( struct  pt  * pt )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /* A protothread function must begin with PT_BEGIN() which takes a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     pointer  to  a  struct  pt .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  PT_BEGIN ( pt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /* We loop forever here. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while ( 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* Let the other protothread run. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread2_flag  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* Wait until the other protothread has set its flag. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PT_WAIT_UNTIL ( pt ,  protothread1_flag  ! =  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PORTB  | =  _BV ( PB2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    timer_set ( & timer2 ,  CLOCK_SECOND / 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PT_WAIT_UNTIL ( pt ,  timer_expired ( & timer2 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    PORTB  & =  ~ _BV ( PB2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    timer_set ( & timer2 ,  CLOCK_SECOND / 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PT_WAIT_UNTIL ( pt ,  timer_expired ( & timer2 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* We then reset the other protothread's flag, and set our own
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       flag  so  that  the  other  protothread  can  run .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread1_flag  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread2_flag  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* And we loop. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /* All protothread functions must end with PT_END() which takes a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *       pointer  to  a  struct  pt .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  PT_END ( pt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  struct  pt  pt1 ,  pt2 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 18:38:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  main ( void )  {  
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  // pin 11 = PB3
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  DDRB  | =  _BV ( PB3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  // pin 10 = PB2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  DDRB  | =  _BV ( PB2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 20:51:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  /* Initialize clock */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  clock_init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-04-03 03:23:33 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  /* Initialize the protothread state variables with PT_INIT(). */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  PT_INIT ( & pt1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  PT_INIT ( & pt2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  /*
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   *  Then  we  schedule  the  two  protothreads  by  repeatedly  calling  their 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   *  protothread  functions  and  passing  a  pointer  to  the  protothread 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   *  state  variables  as  arguments . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while ( 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread1 ( & pt1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    protothread2 ( & pt2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}