123

Dependencies:   mbed

Fork of LG by igor Apu

host/Source/App/CyclesSync.c

Committer:
Kovalev_D
Date:
2016-02-03
Revision:
22:12e6183f04d4

File content as of revision 22:12e6183f04d4:


/**--------------File Info---------------------------------------------------------------------------------
** File name:           CycleSync.c
** Last modified Date:  2011-09-06
** Last Version:        V1.00
** Descriptions:        
**
**--------------------------------------------------------------------------------------------------------
** Created by:          Electrooptica Inc.
** Created date:        2011-09-06
** Version:             V1.00
** Descriptions:        There is the routines for device synchronization
**
**--------------------------------------------------------------------------------------------------------       
*********************************************************************************************************/
#include "CyclesSync.h"
#include "CntrlGLD.h"
#include "SIP.h"
#include "el_lin.h"
#include "inputOutput.h"

uint32_t 	Sys_Clock;      //e. counter of system ticks //r. ñ÷åò÷èê  âðåìåííîé ñåòêè ñèñòåìû
uint32_t 	Seconds = 0;    //e. seconds from power on //r. ÷èñëî ñåêóíä îò ìîìåíòà âêëþ÷åíèÿ ïèòàíèÿ
int32_t 	time_1_Sec = DEVICE_SAMPLE_RATE_uks;     //e. pseudosecond timer //r. ïñåâäîñåêóíäíûé òàéìåð
uint32_t 	trm_cycl;
uint32_t	count;
 int32_t	PrevPeriod = 0;
uint32_t	num;
volatile uint32_t	Latch_Rdy = 0;

 int32_t    LatchPhase = INT32_MAX;
uint32_t 	Ext_Latch_ResetEnable = 1;
volatile uint32_t 	data_Rdy = 0;

uint32_t	Delay_UART_Enbl = DELAY_UART_ENBL;
//uint32_t	Delay_UART_Disbl = DELAY_UART_ENBL;

uint32_t 	main_cycle_latch = 0; 
uint32_t 	Out_main_cycle_latch; //e. counter of main cycles between external latch pulse appearence
uint32_t 	T_latch, Out_T_latch, temp_T_latch;

/******************************************************************************
** Function name:		Latch_Event
**
** Descriptions:		Routine for latch appearing
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void Latch_Event()
{
  static unsigned PreLatch = 0;
//  static int cc = 0;
	if (LatchPhase < INT32_MAX)  //Åñëè LatchPhase(ôëàã çàùåëêè) < ìåíüøå ìàêñèìàëüíîãî 32-õ áèòíîãî èíòà (ïðè èíèöèàëèçàöèè int32_t    LatchPhase = INT32_MAX;) òî: 
	    {	
		  Latch_Rdy = 1;		   //e. óñòàíîâèòü ôëàã äëÿ îáðàáîòêè íèæå
			if (RgConB)			   //Åñëè RgConB (äîïîëíèòåëüíûé ðåãèñòð óïðàâëåíèÿ, óñòàíîâëåí â åäåíèöó ïðè èíèöèàëèçàöèè â ìýéíå) óòàíîâëåí â åäåíèöó òî:
			{
		  	    if (PreLatch)		   //e. åñëè ìû îòêëàäûâàåì çàùåëêó
		     	  PreLatch = 0;
						
		  	     else if ((LatchPhase < LPC_PWM1->TC) && (num == Sys_Clock)) //e. latch have appeared in current cycle
		  	    	{			
		  		    	Latch_Rdy = 0;	//e. bring it to the next cycle	
				      	PreLatch = 1;
		  		    }						  			
			} 
		}
	  else
		Latch_Rdy = 0;				//e. latch is absent
 //---------------------------temp-------------------------------
 /*	Latch_Rdy = 0;				//e. latch is absent  
	if (cc++ == 19)
	{
	  cc = 0;
	  Latch_Rdy = 1; 
	  LatchPhase = 2500; 
	} 	*/
	//----------------------temp--------------------------------
}

/******************************************************************************
** Function name:		QEI_IRQHandler
**
** Descriptions:		Latch counters by reference meander
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
 __irq void QEI_IRQHandler (void) 
 {
   static uint32_t halfQEIPeriod = 0;

	 Cnt_curr =  LPC_QEI->POS;		//e. read accumulated value of counter
	 if (LPC_QEI->INTSTAT & 0x0008)
	 {
	   data_Rdy = 0x0004;			//e. data for Cnt_Pls or Cnt_Mns calculation are ready

	  if (++halfQEIPeriod & 0x0001)	//e. period elapsed, we can calculate Cnt_Dif
	   {
	    data_Rdy = 0x000C;	
	   }
   }
	  LPC_QEI->CLR = 0x1fff;			//e. reset interrupt request //r. ñáðîñèòü çàïðîñ ïðåðûâàíèÿ
 }
/******************************************************************************
** Function name:		SetIntLatch
**
** Descriptions:		Set timer for accumulation period
**
** parameters:			Period of accumulation
** Returned value:		None
** 
******************************************************************************/
void SetIntLatch(uint32_t cycle)
{
 LPC_TIM3->TCR = 0x2;							//switch off and reset timer3
 if (cycle != 0)
 {
 	LPC_TIM3->MR0 = (cycle<<2);						//load new value
 	LPC_TIM3->TCR = 1;							//switch on timer3
 }
}
/******************************************************************************
** Function name:		SwitchRefMeandInt
**
** Descriptions:		Enable/disable interrupt from reference meander
**
** parameters:			switcher
** Returned value:		None
** 
******************************************************************************/
void SwitchRefMeandInt(uint32_t s)
{
  LPC_QEI->CLR = 0x1fff; 			//e. reset all interrupts //r. ñáðîñèòü âñå ïðåðûâàíèÿ
 if (s)
  LPC_QEI->IEC = 0x1fff;			//e.  disable direction changing interrupt //r. çàïðåòèòü ïðåðûâàíèå ïðè èçìåíåíèè íàïðàâëåíèÿ
 else
  LPC_QEI->IES = 0x0008;			//e.  enable direction changing interrupt //r. ðàçðåøèòü ïðåðûâàíèå ïðè èçìåíåíèè íàïðàâëåíèÿ
}
/******************************************************************************
** Function name:		ExtLatch_IRQHandler
**
** Descriptions:		Routine for external latch appearence processing
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
 __irq void EINT3_IRQHandler (void) 
 {
 //LPC_GPIO2->FIOSET = 0x00000020;		//e. turn on the LED 
 	LatchPhase = LPC_PWM1->TC;			//e. read moment of latch
	LPC_TIM0->TCR = 1;					//e. start Mltdrop delay timer
	LPC_GPIOINT->IO0IntClr |= 0x0000800;//e. clean interrupt request
 //LPC_GPIO2->FIOCLR = 0x00000020;		//e. turn off the LED 
 }
 /******************************************************************************
** Function name:		IntLatch_IRQHandler
**
** Descriptions:		Routine for Internal latch appearence processing
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
 __irq void IntLatch_IRQHandler (void) 
 {
 //LPC_GPIO2->FIOSET |= 0x00000080;		// turn on the LED 
 	LatchPhase =(int)LPC_PWM1->TC;			//e. read moment of latch
  LPC_TIM3->IR = 0x0001;				//e. clear interrupt flag 
	num = Sys_Clock;
//	count++;					
 //LPC_GPIO2->FIOCLR |= 0x00000080;		// turn off the LED 
 }

 /******************************************************************************
** Function name:		SwitchMode
**
** Descriptions:		Switch mode of device functionality
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
int SwitchMode()
{
 //-----------------------disable latch sources ---------------------
      SetIntLatch(0); 	   					//e. disable internal latch
	  LPC_TIM3->IR = 0x0001;				//e. clear internal latch interrupt request

   	  LPC_GPIOINT->IO0IntEnR &= ~0x0000800;	//e. disable external latch
	  LPC_GPIOINT->IO0IntClr |=  0x0000800;	//e. clean external latch interrupt request

   	  LPC_TIM0->TCR = 2;						//e. stop and reset the multidrop delay timer
	  LPC_TIM0->IR = 0x03F;				//e. clear internal latch interrupt request
//----------------------wait while UART and DMA are active-------------									 	
	if ( LPC_GPDMACH1->CConfig & DMA_BUSY)				//e. if DMA channel is busy, wait //r. åñëè êàíàë ïåðåäà÷è çàíÿò, æäàòü
	  return 0;	
	LPC_GPDMACH1->CConfig &=  ~DMAChannelEn;			//e. disable DMA for UART transmition
	LPC_GPDMACH2->CConfig &=  ~DMAChannelEn;

	if (!(LPC_UART1->LSR & TRANS_SHIFT_BUF_EMPTY))      //e. transmit buffer is not empty //r. ïåðåäàþùèé áóôåð íå ïóñò
	 return 0;
	LPC_UART1->FCR |= 0x4;								//e. reset TX FIFO

	LPC_TIM0->IR = 0x3F;				 		//e. clear all interrupt flags 
//---------------------configure a new exchanging parameters------------
   if (Device_Mode > 3)		   					//e. external latch mode enabled
   {
    LPC_TIM0->MR0 = 10;	
	LPC_TIM0->MR1 = 50;						//e. /10 = delay before enable signal (us)
 //   LPC_UART1->FCR &= ~0x08;  					//e. TX FIFO is not source for DMA request

// 	LPC_SC->DMAREQSEL = 0xC;						//e. external latch delay timer is source for DMA request
//	LPC_GPIOINT->IO0IntEnR |= 0x0000800;	//e. enable rising edge interrupt
   }
   else						   				//e. internal latch mode enabled
   {
   	LPC_TIM0->MR0 = 10;	
	LPC_TIM0->MR1 = 5000;						//e. /10 = delay before enable signal (us)
//	LPC_SC->DMAREQSEL = 0x3;   				//e. FIFO generate DMA request

//	LPC_SC->EXTINT = 0x8;					//e. clean interrupt request
   }
 
   UART_SwitchSpeed(SRgR & 0x0030);

   if (Device_Mode == DM_INT_LATCH_DELTA_PS)
   	 SetIntLatch(50000);
   return 1;
}

 /******************************************************************************
** Function name:		ServiceTime
**
** Descriptions:		Routine for pseudoseconds counting
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
 void ServiceTime(void)// ïñåâäîñåêóíäíûé ñ÷åò÷èê.
{
  time_1_Sec -= PrevPeriod;

   if (time_1_Sec < (PrevPeriod>>1)) //1 sec elapsed with accurate 0.5 of main period
	{
		time_1_Sec = DEVICE_SAMPLE_RATE_uks;
		Seconds++;
	}
	if (Seconds == 3) { Seconds++;close_all_loops();}	
	Sys_Clock++; //e. increment of the system clock register //r. èíêðåìåíò ðåãèñòðà âðåìåííîé ñåòêè ñèñòåìû
	PrevPeriod = LPC_PWM1->MR0;
} // ServiceTime

/******************************************************************************
** Function name:		WDTFeed
**
** Descriptions:		Feed watchdog timer to prevent it from timeout
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void WDTFeed( void )
{
  LPC_WDT->FEED = 0xAA;		/* Feeding sequence */
  LPC_WDT->FEED = 0x55;
  return;
}

/******************************************************************************
** Function name:		CounterIquiryCycle_Init
**
** Descriptions:		CounterIquiryCycle_Init setup demanded GPIOs for PWM1,
**						reset counter, all latches are enabled, interrupt
**						on PWMMR0, install PWM interrupt to the VIC table.
**
** parameters:			
** Returned value:		
** 
******************************************************************************/
void CounterIquiryCycle_Init(uint32_t cycle)
{ 
  										//PWM1 enabled after reset by default
	LPC_SC->PCLKSEL0 &= ~(3<<12);	
 	LPC_SC->PCLKSEL0 |=  (1<<12);	 	//PWM1 is synchronized by CCLK (100 MHz)(CCLK) PCLKSEL0 - Peripheral Clock Selection registers.
  
	LPC_PWM1->TCR = TCR_RESET;	/* Counter Reset */ //#define TCR_RESET		0x00000002 èíêðåìåíòèðîâàòü ñ÷åò÷èê ïðè ñïàäåíèè èìïóëüñà ÏÂÌ.
	LPC_PWM1->MCR = PWMMR0I |PWMMR0R; 	//generate interrupt and reset timer counter ( PWMMR0I - ïðåðûâàíèå ãåíåðèðóåòñÿ êîãäà PWMMR0 ñîâïîäàåò ñî çíà÷åíèåì PWMTC. )
	                                    //                                           ( PWMMR0R - ñáðàñûâàåò PWMTC ïðè ñîâïîäåíèè PWMTC è PWMMR0. )
	
	LPC_PWM1->CCR = 0x1;				//ðàçðåøèòü ïðåðûâàíèå òîëüêî ïðè ñîâïàäåíèè PWMTC ñ PWMMR0	 (åùå ÷òî òî ñâÿçàíî ñ çàãðóçêîé ÒÑ)					   
					

	PrevPeriod = 10000;
	LPC_PWM1->MR0 = PrevPeriod;		/* set PWM cycle */// çàäàíèå ïåðèîäà ñáðîñà ñ÷åò÷èêà.
	LPC_PWM1->PCR = PWMENA1;  			//e. single edge control mode, PWM1 out enabled only âêëþ÷åíèå âûõîäà ØÈÌ 1.
	LPC_PWM1->LER = LER0_EN ;  			//e. enable updating of register
	LPC_PWM1->TCR = TCR_CNT_EN | TCR_PWM_EN;	/* counter enable, PWM enable */ //âêëþ÷åíèå ñ÷åò÷èêà è ØÈÌ

 	NVIC_DisableIRQ(PWM1_IRQn);//çàïðåòèòü ïðåðûâàíèå.


  return ;
}

__irq void TIMER0_IRQHandler()
{
  int val = LPC_TIM0->IR;
  LPC_TIM0->IR |= 3;

  if (val & 1)	//MAT 1.0 interrupt
  {
    LPC_GPIO2->FIOSET |= 1<<6;		// turn on the LED 	
	LPC_TIM0->IR |= 1;
	 return;
  }
  if (val & 2)	 //MAT 1.1 interrupt
  {
	LPC_GPIO2->FIOCLR |= 1<<6;		// turn on the LED 	
	LPC_TIM0->IR |= 2;
	 return;
  }
   if (val & 4)	//MAT 0.2 interrupt
  {
//    LPC_GPIO0->FIOSET2 |= 0xFF;				//set P0.23
//	LPC_GPIO2->FIOSET |= 0x00000040;		// turn on the LED 	
//	LPC_TIM0->IR |= 4; 
	return;
  }			 
 return;
}

/******************************************************************************
** Function name:		ExtLatch_Init
**
** Descriptions:		Initialization of external latch 
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void ExtLatch_Init() 
{
	LPC_PINCON->PINSEL4 &= ~0xC000000;		//e. èñïîëüçîâàòü P2.13 êàê GPIO.
  LPC_PINCON->PINSEL0 &= ~0x0C00000;		//e. èñïîëüçîâàòü P0.11 êàê GPIO.
	LPC_GPIO0->FIODIR   &= ~0x0000800;		//e. èñïîëüçîâàòü P0.11 âõëîä.
	LPC_GPIOINT->IO0IntEnR &= ~0x0000800;	//e. îòêëþ÷èòü âíóòðåííþþ çàùåëêó.
	LPC_GPIOINT->IO0IntClr |=  0x0000800;	//e. ñáðîñèòü çàïðîñû íà ïðåðûâàíèÿ

	NVIC_EnableIRQ(EINT3_IRQn);	          // ðàçðåøèòü ïðåðûâàíèÿ.

//+++++++ initialization of timer for multidrop delay generation+++++++++++++++++++++++
										 //e.  TIMER0 enabled by default   
	LPC_SC->PCLKSEL0 &= ~(3<<2);		 //e. ñáðîñèòü ÷àñòîòó òàéìåðà 0
  LPC_SC->PCLKSEL0 |= (3<<2);		 	 //e. óñòàíîâèòü ÷àñòîòó òàéìåðà 0 íà CLK/8.
	LPC_TIM0->PR = 0;					       //e. óñòàíîâèòü äåëèòåëü ÷àñòîòû â 0.
	LPC_TIM0->IR = 0x3F;				     //e. î÷èñòèòü ôëàãè ïðåðûâàíèé. 
	LPC_TIM0->MCR = 1 |(1<<3)|MR1_RESET |MR1_STOP; //e. ñáðîñèòü è îñòàíîâèòü òàéìåð ïîñëå ñîâïàäåíèÿ  MR1 è TC.
	LPC_TIM0->CCR = 0; 			 		 //e. ñîäåðæèìîå òàéìåðà çàãðóæàåòñÿ ïðè ïîÿâëåíèè ïåðåäíåãî ôðîíòà çàùåëêè.
	LPC_TIM0->CTCR = 0; 				 //e. timer0 â ðåæèìå òàéìåðà.
	
	LPC_TIM0->MR0 = /*Device_blk.Address**/10;	 		//e. delay before UART transmitter loading
	LPC_TIM0->MR1 = /*Device_blk.Address**/5000;		//e. delay before UART transmitter start
									//e. set first empty) event of timer
	NVIC_DisableIRQ(TIMER0_IRQn);		 
}
/******************************************************************************
** Function name:		IntLatch_Init
**
** Descriptions:		Initialization of iternal latch cycle generation
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void IntLatch_Init() 
{
    LPC_SC->PCONP |= (1<<23);  //âêëþ÷èò TIME3(òàéìåð)
	//e. by default timer3 mode is not counter (T3CTCR[1,0]=0) 
   
  	LPC_SC->PCLKSEL1 &= SYNC_CLCK4;	 // ÷àñòîòà âõîäíîãî ñèãíàëà ðàâíà CLCK/4
  	LPC_SC->PCLKSEL1 |= (1<<14);		 // timer 3 input frequency equal to CLCK/4
	
//	LPC_PINCON->PINSEL1 |= (3<<16);	      //e. CAP 3.1 is connected to P0.24
	//e. by default CAP3.0 is connected to timer3
	LPC_TIM3->PR = 0;					                          //e. óñòàíîâèòü ïðåääåëèòåëü òàéìåðà3 íà 0.
	LPC_TIM3->IR = 0x0001;			                      	//e. î÷èñòèòü ôëàãè ïðåðûâàíèé. 
	LPC_TIM3->MCR = MR0_RESET |MR0_INT_EN |MR0_NO_STOP;	// óñòàíîâêà ôëàãîâ ïðåðûâàíèé êîòîðûå âûïîëíÿþòñÿ ïðè ñîâïàäåíèè òàéìåðà è ÌÑR.
	LPC_TIM3->CCR = 0x0001; 			                      //ñîäåðæèìîå ñ÷åò÷èêà çàãðóæàåòñÿ ïî ïðèõîäó ïåðåäíåãî ôðîíòà çàùåëêè.
	
	NVIC_EnableIRQ(TIMER3_IRQn);	                      //ðàçðåøèòü ïðåðûâàíèÿ.
}
/*****************************************************************************
** Function name:		WDTInit
**
** Descriptions:		Initialize watchdog timer, install the
**						watchdog timer interrupt handler
**
** parameters:			None
** Returned value:		true or false, return false if the VIC table
**				is full and WDT interrupt handler can be
**				installed.
** 
*****************************************************************************/
uint32_t WDTInit( void )
{
  NVIC_DisableIRQ(WDT_IRQn);

  LPC_WDT->TC = WDT_FEED_VALUE;	// once WDEN is set, the WDT will start after feeding 
  LPC_WDT->MOD = WDEN;

  LPC_WDT->FEED = 0xAA;		// Feeding sequence
  LPC_WDT->FEED = 0x55;  
    
  return 1;
}
/******************************************************************************
**                            End Of File
******************************************************************************/