示例#1
0
文件: FSU22.c 项目: alex262/MB90F591
//=============================================================================
//--------------------------------------------------------------------
void TestOutput()
{
	DWORD t=0;
	
	//if(Fsu22.Timer_Test<10) return;
	
	Fsu22.Timer_Test=10;
	
	STRB1=0;
	D_STRB1=1;
	Sleep_1_5mk();
	__DI();
	Fsu22.Test.bits.O1= ~(K1 | K2);
	Fsu22.Test.bits.O2= ~(K3 | K4);
	Fsu22.Test.bits.O3= ~(K5 | K6);
	__EI();
	D_STRB1=0;
	STRB1=1;
	
	
	STRB2=0;
	D_STRB2=1;
	Sleep_1_5mk();
	__DI();
	Fsu22.Test.bits.O4= ~(K1 | K2);
	Fsu22.Test.bits.O5= ~(K3 | K4);
	Fsu22.Test.bits.O6= ~(K5 | K6);
	__EI();
	D_STRB2=0;
	STRB2=1;
	
	D_STRB3=1;
	STRB3=0;
	Sleep_1_5mk();
	__DI();
	Fsu22.Test.bits.O7= ~(K1 | K2);
	Fsu22.Test.bits.O8= ~(K3 | K4);
	Fsu22.Test.bits.O9= ~(K5 | K6);
	__EI();
	D_STRB3=0;
	STRB3=1;
	
	D_STRB4=1;
	STRB4=0;
	Sleep_1_5mk();
	__DI();
	Fsu22.Test.bits.O10= ~(K1 | K2);
	Fsu22.Test.bits.O11= ~(K3 | K4);
	Fsu22.Test.bits.O12= ~(K5 | K6);
	__EI();
	D_STRB4=0;
	STRB4=1;
}
示例#2
0
文件: DAC10.c 项目: alex262/MB90F591
void Operate_Max1329_RegMode(BYTE Num, BYTE RW, BYTE Adr, BYTE Count)
{
	BYTE i;
	
	if(Num == 0xFF) SelectAll_DAC();
	else SelectSPI_DAC(Num);
	__DI();
	
	pak_spi_rm.data = 0;
	pak_spi_rm.bits.RW	= RW;
	pak_spi_rm.bits.adr	= Adr;
	Send_SIO(pak_spi_rm.data);
		
	if(RW == READ_MODE_SPI)
	{
		for(i=0;i<Count;i++)
			Spi_Buf_In[i] = Send_SIO(0);
		stop_sio();
	}else
	{
		for(i=0;i<Count;i++)
			Send_SIO(Spi_Buf_Out[i]);
		stop_sio();
	}
	__EI();
	UnSelectAll_DAC();
}
示例#3
0
//===================================================================
void Driver_NDD20P1()
{
	BYTE i;
	i=ADDR;	
	Ndd.Info.bits.Addr	=i;
	if(i!=ADDR_NODE)
	{
		setState(Initialisation);
		ADDR_NODE			=ADDR;
	}
	__DI();
	Ndd.Info.bits.Mode		=MODE;
	
	if(Ndd.PowerNew !=	Ndd.PowerOld)
	{
		for(i=0;i<4;i++)
		{
			if(digit(Ndd.PowerOld,i) != digit(Ndd.PowerNew,i))
			{
				Ndd.St1[i]		=1;
				Ndd.Timer2[i]	=0;
				Ndd.CurStep[i]	=0;
			}
		}
		Ndd.PowerOld = Ndd.PowerNew;
	}
	//=========================================
	for(i=0;i<4;i++)
		UpdateDataSector(i);
	//=========================================
	__EI();
}
示例#4
0
/*---------------------------------------------------------------------------
   DefaultIRQHandler()
   This function is a placeholder for all vector definitions. Either use
   your own placeholder or add necessary code here. 
-----------------------------------------------------------------------------*/
__interrupt void DefaultIRQHandler( void )
{
	__DI();				/* disable interrupts */
	while( 1 )
	{
		__wait_nop();	/* halt system */
	}
}
示例#5
0
文件: Timer.c 项目: alex262/MB90F591
// р рывани  Reload Timer 1 
__interrupt void ReloadTimer1(void) 
{
	__DI();	
	TMCSR1_UF = 0;       			/* reset underflow interrupt request flag */
	//receiveMsgHandler(0);	
	//receiveMsgHandler(1);
	__EI();	
}
示例#6
0
/*------------------------------------------------------------------------
  DefaultIRQHandler()

  This function is a placeholder for all vector definitions. Either use
  your own placeholder or add necessary code here.
-------------------------------------------------------------------------*/
__interrupt
void DefaultIRQHandler (void)
{
    /* RB_SYNC; */						/* Synchronisation with R-Bus   */
    /* May be required, if there is */
    /* no R-Bus access after the	*/
    /* reset of the interrupt flag  */

    __DI();								/* disable interrupts		   */
    while(1) {
        Kick_Watchdog();				/* feed hardware watchdog	   */
    }
    /* halt system */
}
示例#7
0
文件: Timer.c 项目: alex262/MB90F591
//удаление таймера 
void del_timer(TYPE_DATA_TIMER * tmr)
{
	BYTE cnt;
	cnt = COUNT_USER_TIMERS;
	while (cnt--)
	{				
		if (SystemTimers.timers[cnt]==tmr) // таймер найден
		{
			__DI();
			SystemTimers.timers[cnt] = 0;
			SystemTimers.count--;  
			__EI();
			return;	
		}
	}
}
示例#8
0
文件: DAC10.c 项目: alex262/MB90F591
void Operate_Max1329_ADC_Convert(BYTE Num, BYTE Mux, BYTE Gain, BYTE Bip)
{
	if(Num == 0xFF) SelectAll_DAC();
	else SelectSPI_DAC(Num);
	__DI();
	
	pak_spi_adc.bits.Mux	= Mux;
	pak_spi_adc.bits.Gain	= Gain;
	pak_spi_adc.bits.Bip	= Bip;
	pak_spi_adc.bits.start	= 1;
	
	Send_SIO(pak_spi_adc.data);
	stop_sio();
	__EI();
	UnSelectAll_DAC();
}
示例#9
0
文件: DAC10.c 项目: alex262/MB90F591
void Operate_Max1329_Reset(BYTE Num)
{
	if(Num == 0xFF) SelectAll_DAC();
	else SelectSPI_DAC(Num);
	__DI();
	
	pak_spi_rm.data = 0;
	pak_spi_rm.bits.RW	= WRITE_MODE_SPI;
	pak_spi_rm.bits.adr	= 0x1F;
	Send_SIO(pak_spi_rm.data);
		
	Send_SIO(0xFF);
	stop_sio();
	__EI();
	UnSelectAll_DAC();
}
示例#10
0
文件: DAC10.c 项目: alex262/MB90F591
//========================================================================
//========================================================================
void Operate_Max1329_DAC_Write(BYTE Num, BYTE ch, WORD data)
{
	if(Num == 0xFF) SelectAll_DAC();
	else SelectSPI_DAC(Num);
	__DI();
					
	pak_spi_dac.bits.ch 	= ch;
	pak_spi_dac.bits.d1 	= 1;
	pak_spi_dac.bits.start	= 0;
	pak_spi_dac.bits.dac 	= data;
	pak_spi_dac.bits.rw 	= WRITE_MODE_SPI;
	Send_SIO(pak_spi_dac.data[1]);
	Send_SIO(pak_spi_dac.data[0]);
	stop_sio();
	__EI();
	UnSelectAll_DAC();
}
示例#11
0
文件: DAC10.c 项目: alex262/MB90F591
void Operate_Max1329_DAC_Write_Mask(WORD Mask, BYTE ch, WORD data)
{

	SelectMask_DAC(Mask);
	__DI();
					
	pak_spi_dac.bits.ch 	= ch;
	pak_spi_dac.bits.d1 	= 1;
	pak_spi_dac.bits.start	= 0;
	pak_spi_dac.bits.dac 	= data;
	pak_spi_dac.bits.rw 	= WRITE_MODE_SPI;
	Send_SIO(pak_spi_dac.data[1]);
	Send_SIO(pak_spi_dac.data[0]);
	stop_sio();
	__EI();
	UnSelectAll_DAC();
}
示例#12
0
文件: RVV3_C.c 项目: alex262/MB90F591
//===================================================================================
void DriverRVV()
{
	__DI();
	Rvv.Error&=0x7F;
	Rvv.Error|=RIN2<<7;
	__EI();
	if(Rvv.newDn!=Rvv.Dn)
	{
		Rvv.Dn=Rvv.newDn;
		WriteBlock(5,Rvv.Dn);
		WriteBlock(6,Rvv.Dn>>4);
		if((ReadBlock(5)!=(Rvv.Dn&0xF)) && ((ReadBlock(6)!=((Rvv.Dn>>4)&0xF))))
		{
			Rvv.Error|=0x1;
			WriteBlock(6,0x8|(Rvv.Dn>>4));
		}
		else Rvv.Error&=0xFE;
示例#13
0
文件: uart.c 项目: smarth55/Examples
BYTE uart0_get (void)
{
    BYTE d;
    int i;


    do;
    while (!RxFifo.ct);

    i = RxFifo.ri;
    d = RxFifo.buff[i++];
    RxFifo.ri = i % BUFFER_SIZE;
    __DI();
    RxFifo.ct--;
    __EI();

    return d;
}
示例#14
0
文件: uart.c 项目: smarth55/Examples
void uart0_put (BYTE d)
{
    int i;


    do;
    while (TxFifo.ct >= BUFFER_SIZE);

    i = TxFifo.wi;
    TxFifo.buff[i++] = d;
    TxFifo.wi = i % BUFFER_SIZE;
    __DI();
    TxFifo.ct++;
    if (!TxRun) {
        TxRun = 1;
        UA0TIF = 1;
    }
    __EI();
}
示例#15
0
文件: Init.c 项目: zhangsaisai/MEMS
/* ===================================================================*/
void UserInit(void)
{
    UserDataInit();     /* Initialize user data. */
#if DEBUG
    printf("| -UserDataInit finished.\n");
    printf("|-+OnChipInit begins...\n");
#endif
    __DI();
    OnChipInit();       /* Initialize on-chip devices. */
    __EI();
#if DEBUG
    printf("| -OnChipInit finished.\n");
    printf("|-+PeripheralInit begins...\n");
#endif
    PeripheralInit();   /* Initialize peripheral devices. */
#if DEBUG
    printf("| -PeripheralInit finished.\n");
#endif
}
示例#16
0
文件: FSU22.c 项目: alex262/MB90F591
//=============================================================================
void Driver_FSU22()
{
	BYTE i;
	__DI();
	
	i=ADDR;	
	Fsu22.Info.bits.Addr	=i;
	if(i!=ADDR_NODE)
	{
		setState(Initialisation);
		ADDR_NODE			=ADDR;
	}
	Fsu22.Info.bits.Mode=MODE;
	//**************************************************
	Fsu22.Info.bits.F1=PG_F1;
	//**************************************************
	
	if(Fsu22.Prin.word!=Fsu22.State.word)	//Устанавливаем новые команды
	{
		Fsu22.State.word=Fsu22.Prin.word;
		
		S1=Fsu22.State.bits.O1;
		S2=Fsu22.State.bits.O2;
		S3=Fsu22.State.bits.O3;
		S4=Fsu22.State.bits.O4;
		S5=Fsu22.State.bits.O5;
		S6=Fsu22.State.bits.O6;
		
		S7=Fsu22.State.bits.O7;
		S8=Fsu22.State.bits.O8;
		S9=Fsu22.State.bits.O9;
		S10=Fsu22.State.bits.O10;
		S11=Fsu22.State.bits.O11;
		S12=Fsu22.State.bits.O12;
		
		Fsu22.Timer_Test=0;
	}
	__EI();
	//**************************************************
	TestOutput();	
	//**************************************************
}
示例#17
0
/*
** ===================================================================
**     Method      :  PE_low_level_init (bean MC9S12DP256_112)
**
**     Description :
**         This method is internal. It is used by Processor Expert
**         only.
** ===================================================================
*/
void PE_low_level_init(void)
{
  /* Common initialization of the CPU registers */
/* TSCR1: TEN=0,TSWAI=0,TSFRZ=1 */
  output( TSCR1, input( TSCR1 ) & ~192 | 32 );
/* TCTL2: OM0=0,OL0=0 */
  output( TCTL2, input( TCTL2 ) & ~3 );
/* TCTL1: OM7=0,OL7=0 */
  output( TCTL1, input( TCTL1 ) & ~192 );
/* TIE: C0I=0 */
  output( TIE, input( TIE ) & ~1 );
/* TTOV: TOV0=0 */
  output( TTOV, input( TTOV ) & ~1 );
/* TSCR2: TOI=0,TCRE=1 */
  output( TSCR2, input( TSCR2 ) & ~128 | 8 );
/* TIOS: IOS7=1,IOS0=1 */
  output( TIOS, input( TIOS ) | 129 );
/* PWMCTL: PSWAI=0,PFRZ=0 */
  output( PWMCTL, input( PWMCTL ) & ~12 );
/* PWMSDN: PWMIF=0,PWMIE=0,PWMRSTRT=0,PWMLVL=0,??=0,PWM7IN=0,PWM7INL=0,PWM7ENA=0 */
  output( PWMSDN, 0 );
/* ICSYS: SH37=0,SH26=0,SH15=0,SH04=0,TFMOD=0,PACMX=0,BUFEN=0,LATQ=0 */
  output( ICSYS, 0 );
/* MCCTL: MODMC=1 */
  output( MCCTL, input( MCCTL ) | 64 );
  /* ### MC9S12DP256_112 "Cpu" init code ... */
  /* ### TimerInt "TickTimer" init code ... */
  TickTimer_Init();
  /* ### ByteIO "Byte1" init code ... */
  PORTB = 255;                         /* Prepare value for output */
  DDRB = 255;                          /* Set direction to output */
  /* ### Asynchro serial "COM0" init code ... */
  DDRS &= ~1;
  PTS |= 2;
  DDRS |= 2;
  COM0_Init();
 /* Common peripheral initialization - ENABLE */
/* TSCR1: TEN=1 */
  output( TSCR1, input( TSCR1 ) | 128 );
  INTCR_IRQEN = 0;                     /* Disable the IRQ interrupt. IRQ interrupt is enabled after CPU reset by default. */
  __DI();                              /* Disable interrupts */
}
示例#18
0
文件: Filter.c 项目: alex262/MB90F591
//---------------------------------------------------------------------------------------------------------
// Процедура подавление дребезга входов DIn
// Вызывается для каждого модуля НДД
//addr		- адрес модуля
//inputs	- считанное состояние НДД
//time		- Время подавления дребезга
void debounce_Din(unsigned char addr, unsigned char inputs, unsigned short time)
{
	unsigned char i;									// счетчик
	unsigned char ch_cnt;								// колличество входов у данного
	unsigned char pr,tmp,bit;							// временные переменные

__DI();

	pr=Ndd.pr_data[addr];
	
	tmp = inputs ^ pr;									// в tmp - изменения на входах
	if (time==0) time=1;
	for (i=0;i<8;i++)
	{
		bit = 1<<i;										// определение текущего входа
		if (tmp & bit)
		{												// состояние входа изменилось - сброс счетчика
			Ndd.counters[addr][i]=0;
			Ndd.counters_dr[addr][i]++;	
			if(Ndd.counters_dr[addr][i]>=time)			//Входной сигнал не устанавливается в устойчивое состояние
			{
				Ndd.counters_dr[addr][i]=time;
				Ndd.drebezg[addr]&=~bit;				//
				Ndd.drebezg[addr]|=bit;					//Запись сигнала у которого дребезг
			}
			else	Ndd.drebezg[addr]&=~bit;
		} 
		else
		 {												// состояние входа не изменилось - инкремент
			Ndd.counters_dr[addr][i]=0;
			Ndd.counters[addr][i]++;					// счетчика
			if (Ndd.counters[addr][i]>=time-1)
			{											// состояние входа установилось
				Ndd.state[addr]&=~bit;					// запись состояния входа
				Ndd.state[addr]|=(inputs & bit);
				Ndd.counters[addr][i]--;				// декремент счетчика
			}
		}
	}
	Ndd.pr_data[addr] = inputs;							// сохранение текущих значений как предыдущих
__EI();
}
示例#19
0
文件: DAC10.c 项目: alex262/MB90F591
void Operate_Max1329_RegMode_Mask(WORD Mask, BYTE Adr, BYTE Count)// только запись
{
	BYTE i;
	
	SelectMask_DAC(Mask);
	
	__DI();
	
	pak_spi_rm.data = 0;
	pak_spi_rm.bits.RW	= WRITE_MODE_SPI;;
	pak_spi_rm.bits.adr	= Adr;
	Send_SIO(pak_spi_rm.data);
		
		for(i=0;i<Count;i++)
			Send_SIO(Spi_Buf_Out[i]);
		stop_sio();
	
	__EI();
	UnSelectAll_DAC();
}
示例#20
0
/*
** ===================================================================
**     Method      :  PE_low_level_init (bean MC9S12C32_80)
**
**     Description :
**         This method is internal. It is used by Processor Expert
**         only.
** ===================================================================
*/
void PE_low_level_init(void)
{
  /* Common initialization of the CPU registers */
/* TSCR1: TEN=0,TSWAI=0,TSFRZ=1 */
  output( TSCR1, input( TSCR1 ) & ~192 | 32 );
/* TCTL2: OM0=0,OL0=0 */
  output( TCTL2, input( TCTL2 ) & ~3 );
/* TCTL1: OM7=0,OL7=0 */
  output( TCTL1, input( TCTL1 ) & ~192 );
/* TIE: C0I=0 */
  output( TIE, input( TIE ) & ~1 );
/* TTOV: TOV0=0 */
  output( TTOV, input( TTOV ) & ~1 );
/* TSCR2: TOI=0,TCRE=1 */
  output( TSCR2, input( TSCR2 ) & ~128 | 8 );
/* TIOS: IOS7=1,IOS0=1 */
  output( TIOS, input( TIOS ) | 129 );
/* PPSP: PPSP0=0 */
  output( PPSP, input( PPSP ) & ~1 );
/* PERP: PERP0=1 */
  output( PERP, input( PERP ) | 1 );
/* DDRP: DDRP0=0 */
  output( DDRP, input( DDRP ) & ~1 );
/* PWMCTL: PSWAI=0,PFRZ=0 */
  output( PWMCTL, input( PWMCTL ) & ~12 );
/* PWMSDN: PWMIF=0,PWMIE=0,PWMRSTRT=0,PWMLVL=0,??=0,PWM7IN=0,PWM7INL=0,PWM7ENA=0 */
  output( PWMSDN, 0 );
  /* ### MC9S12C32_80 "Cpu" init code ... */
  /* ### ByteIO "Byte1" init code ... */
  PORTB = 0;                           /* Prepare value for output */
  DDRB = 255;                          /* Set direction to output */
  /* ### TimerInt "TickTimer" init code ... */
  TickTimer_Init();
  /* ### External interrupt "ButtonInterrupt" init code ... */
  PIEP_PIEP0 = 0;                      /* Disable interrupt */
 /* Common peripheral initialization - ENABLE */
/* TSCR1: TEN=1 */
  output( TSCR1, input( TSCR1 ) | 128 );
  INTCR_IRQEN = 0;                     /* Disable the IRQ interrupt. IRQ interrupt is enabled after CPU reset by default. */
  __DI();                              /* Disable interrupts */
}
示例#21
0
文件: DAC10.c 项目: alex262/MB90F591
WORD Operate_Max1329_DAC_Read(BYTE Num, BYTE ch)
{
	WORD d;
	
	if(Num == 0xFF) SelectAll_DAC();
	else SelectSPI_DAC(Num);
	__DI();
	
	pak_spi_dac.bits.ch 	= ch;
	pak_spi_dac.bits.d1 	= 1;
	pak_spi_dac.bits.start	= 0;
	pak_spi_dac.bits.dac 	= 0;
	pak_spi_dac.bits.rw 	= READ_MODE_SPI;
	d=Send_SIO(pak_spi_dac.data[1]);
	d = (d&0xF)<<8;
	d |= Send_SIO(pak_spi_dac.data[0]);
	stop_sio();
	__EI();
	UnSelectAll_DAC();
	return d;
}
示例#22
0
文件: Timer.c 项目: alex262/MB90F591
//регистраци¤ пользовательского таймера в системе
//¬ход: указатель на таймер usrtmr
//
void add_timer(TYPE_DATA_TIMER * tmr)
{
	BYTE cnt;
	cnt = COUNT_USER_TIMERS;
	while (cnt--)
	{															//данный таймер уже зарегистрирован
	  if (SystemTimers.timers[cnt]==tmr) return;				//выход
	}
	  
	cnt = COUNT_USER_TIMERS;
	while (cnt--)
	{									
		if (SystemTimers.timers[cnt]==0) //место свободно
		{
			__DI();
			SystemTimers.timers[cnt] = tmr;
			SystemTimers.count++;  
			__EI();
			return;
	  	}
	}
}
示例#23
0
文件: FSU15C.c 项目: alex262/MB90F591
//================================================
void DriverFSU15_C()
{
	BYTE i;
	__DI();
	i=ADDR;	
	Fsu15.Info.bits.Addr	=i;
	if(i!=ADDR_NODE)
	{
		setState(Initialisation);
		ADDR_NODE			=ADDR;
	}
	Fsu15.Info.bits.Mode=MODE;
	Fsu15.Info.bits.F1=PG_F1;
	#ifdef PLATA_FSU15
		Fsu15.Info.bits.F2=PG_F2;
	#endif

	WriteOutput();
	ReadTest();
	__EI();
	
}
//********************************************************************************
//   local functions
//********************************************************************************
void init(void)
{
    /* --- MIE Disable --- */
    __DI();
	
	/* Set oscillation mode */
	clk_setLsclk( CLK_XTM_CRYSTAL );    /* crystal/ceramic oscillation */
	/* Wait stables crystal oscillation */
	while( (clk_getClkStatus() & FSTAT_LOSCS) != 0 ) {}
	
	clk_disHsclk();                             // stop HSCLK oscillation
	clk_setHsclk( (unsigned char)(CLK_SYSC_OSCLK | CLK_OSCM_RC | CLK_OUTC_OSCLK | CLK_LOSCON_DIS), CLK_LOSCON_DIS ); /* set HSCLK */		// BUG620Q504
	clk_enaHsclk();                             // start HSCLK oscillation

	clk_setSysclk( CLK_SYSCLK_HSCLK );          // Choose HSCLK
	
	clk_block_ctrl_init();				/* Block Control            */
	
	// irq handler initialization
    irq_init();                         /* Interrupt                */
	
	// Watch dog timer
	irq_sethandler(IRQ_NO_WDTINT,watch_dog_isr);
	wdt_init( WDTMOD_WDT1 | WDTMOD_WDT0);
	wdt_disHaltCount();	
	
	// Initializing GPIO
	lazurite_gpio_init();
	
	// Initializing timer
	init_timer();
	
	/* MIE Enable */
	rst_interrupts();
	__EI();
	return;
}
示例#25
0
/*******************************************************************************
	Routine Name:	irq_di
	Form:			void irq_di( void )
	Parameters:		void
	Return value:	void
	Description:	DI.
******************************************************************************/
void irq_di( void )
{
	__DI();
}
示例#26
0
文件: pdo.c 项目: alex262/MB90F591
UNS8 buildPDO_CASH(UNS16 index)
{
	UNS16 	ind;
	UNS8    subInd,i;
	UNS8 *  pMappingCount = NULL;      	// count of mapped objects...
	void *  pMappedAppObject = NULL; 	// pointer to the var which is mapped to a pdo
	UNS32 * pMappingParameter = NULL;  	// pointer fo the var which holds the mapping parameter of an mapping entry  
	UNS8 *  pSize;
	UNS8    size;
	UNS8 	offset;
	UNS8 	status;
	UNS32   objDict;	

	pSize = &size;
	status = state1;
	subInd=(UNS8)0x00;
	offset = 0x00;
	ind = index - 0x1800;


	if( nodeState != Operational ) return 0xFF;
	
	while (1) 
	{
		if(status == state1)
		{
				status = state2;
		}
		if(status == state2)
		{
			objDict = getODentry( (UNS16)0x1A00 + ind, (UNS8)0,(void * *)&pMappingCount, pSize, 0 );
			if( objDict == (UNS32)OD_SUCCESSFUL )
			{
				status = state3;
				if(*pMappingCount==0)
					return 0xFF;
			}
			else 
				return 0xFF;
        }
		if(status == state3)
		{
			objDict = getODentry( (UNS16)0x1A00 + ind, subInd + 1,(void * *)&pMappingParameter, pSize, 0 );
			if( objDict == OD_SUCCESSFUL )
			{
				status = state4;
			}
			else 
				return 0xFF;
        }
        if(status == state4)
		{
			objDict = getODentry((UNS16)((*pMappingParameter) >> 16),
								(UNS8)(((*pMappingParameter) >> 8 ) & 0x000000FF),
								(void * *)&pMappedAppObject, pSize, 0 ); 
			if( objDict == OD_SUCCESSFUL )
			{
				size = (*pMappingParameter & (UNS32)0x000000FF) >> 3 ; // in bytes
	  			__DI();
				for(i=0;i<size;i++)	
	  				process_PDO_CASH.msg[offset+i]=((UNS8 *)pMappedAppObject)[i];
				__EI();
				offset += size;
				process_PDO_CASH.count = offset;
				subInd++;
				status = state5;
			}
			else 
				return 0xFF;
示例#27
0
/*
** ===================================================================
**     Method      :  PE_low_level_init (component MKE06Z128LK4)
**
**     Description :
**         Initializes components and provides common register 
**         initialization. The method is called automatically as a part 
**         of the application initialization code.
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
void PE_low_level_init(void)
{
  /* RTOS initialization */

  #ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  
  /* Debug pins port clock gate enable */
  
  #if CPU_SWD_DIO_PIN | CPU_SWD_CLK_PIN
  SIM_SCGC |= (uint32_t)SIM_SCGC_SWD_MASK; /* SWD pins clock gate enable */
  #endif /* CPU_SWD_DIO_PIN | CPU_SWD_CLK_PIN */

  /* NMI pin initialization */
    
  #if CPU_NMI_PIN
  SIM_SOPT0 |= (uint32_t)SIM_SOPT0_NMIE_MASK; /* Enable NMI pin */
  #else
  SIM_SOPT0 &= (uint32_t)~(uint32_t)SIM_SOPT0_NMIE_MASK; /* Disable NMI pin */
  #endif /* CPU_NMI_PIN */

  /* Reset pin initialization */
    
  #if CPU_RESET_PIN
  SIM_SOPT0 |= (uint32_t)SIM_SOPT0_RSTPE_MASK; /* Enable Reset pin */
  #else
  SIM_SOPT0 &= (uint32_t)~(uint32_t)SIM_SOPT0_RSTPE_MASK; /* Disable Reset pin */
  #endif /* CPU_RESET_PIN */

  /* SWD pins initialization */
    
  #if CPU_SWD_DIO_PIN | CPU_SWD_CLK_PIN
  SIM_SOPT0 |= (uint32_t)SIM_SOPT0_SWDE_MASK; /* Enable SWD pins */
  #else
  SIM_SOPT0 &= (uint32_t)~(uint32_t)SIM_SOPT0_SWDE_MASK; /* Disable SWD pins */
  #endif /* CPU_SWD_DIO_PIN | CPU_SWD_CLK_PIN */
  
  /* Common initialization */
  
  #if CPU_COMMON_INIT
  Common_Init();
  #endif /* CPU_COMMON_INIT */
  
  /* Peripheral initialization components initialization */

  #if CPU_PERIPHERALS_INIT
  Peripherals_Init();
  #endif /* CPU_PERIPHERALS_INIT */
  
  /* OnReset event */
  
  #ifdef CPU_ON_RESET_EVENT_NAME
  CPU_ON_RESET_EVENT_NAME((uint16_t)SIM_SRSID); /* Invoke an user event */
  #endif /* CPU_ON_RESET_EVENT_NAME */
  
  /* Rest of components initialization */
  
  #if CPU_COMPONENTS_INIT
  Components_Init();
  #endif /* CPU_COMPONENTS_INIT */

  /* Interrupts priority level initialization */
  
  #if CPU_INT_PRIORITY == 0
  __DI();                              /* Disable interrupts */
  #elif CPU_INT_PRIORITY == 1
  __EI();                              /* Enable interrupts */
  #else
    #error Unsupported interrupt priority level
  #endif 
}
示例#28
0
void CPU_DisableInt(void)
{
 __DI();
}
示例#29
0
/***********************************************************************
	This is the main controller loop.
	sequences of operations:
		- reads from CAN bus or serial port 1.
		- reads encoders (or ADC).
		- computes the control value (a PID in this version).
		- checks limits and other errors.
		- sets PWM
		- does extra functions (e.g. communicate with neighboring cards).
 ***********************************************************************/
void main(void)
{

	Int32 PWMoutput [JN];
	Int32 PWMoutput_old [JN];
	byte i=0;
	byte wi=0;
	byte k=0;
	UInt16 *value=0;
	Int32 t1val=0;
	Int32 PID_R= 2;
	Int32 kpp=1;
	Int16 current_turn=0;
	Int16 print_number=0;
	Int16 real_pos=0;
	byte first_step=0;

#if (VERSION == 0x0351)
	#define winSizeMax 32
	#define initialWindowSize 4
#else
	#define winSizeMax 32
	#define initialWindowSize 30
#endif

	byte divJntPos[JN]=INIT_ARRAY(initialWindowSize-1);
	byte divJntVel[JN]=INIT_ARRAY(initialWindowSize-1);
	byte divMotPos[JN]=INIT_ARRAY(initialWindowSize-1);
	byte divMotVel[JN]=INIT_ARRAY(initialWindowSize-1);
	byte headJntPos[JN]=INIT_ARRAY(0);  //current joint pos
	byte tailJntPos[JN]=INIT_ARRAY(0); 
	byte headJntVel[JN]=INIT_ARRAY(0);  //current joint vel
	byte tailJntVel[JN]=INIT_ARRAY(0); 
	byte headMotPos[JN]=INIT_ARRAY(0);  //current motor pos
	byte tailMotPos[JN]=INIT_ARRAY(0); 
	byte headMotVel[JN]=INIT_ARRAY(0);  //current motor vel
	byte tailMotVel[JN]=INIT_ARRAY(0); 
	Int32 jntPosWindow[winSizeMax][JN]; //max window size = winSizeMax
	Int32 jntVelWindow[winSizeMax][JN]; //max window size = winSizeMax
	Int32 motPosWindow[winSizeMax][JN]; //max window size = winSizeMax
	Int32 motVelWindow[winSizeMax][JN]; //max window size = winSizeMax
	Int16 _safeband[JN];	//it is a value for reducing the JOINT limit of 2*_safeband [tick encoder]
#ifdef TEMPERATURE_SENSOR
	byte   TempSensCount1 = 0;
	UInt32 TempSensCount2 = 0;
	byte   temp_sens_status=0;
	overtemp[0]=0;
	overtemp[1]=0;
	errortemp[0]=0;
	errortemp[1]=0;

#endif
	
	/* gets the address of flash memory from the linker */
	_flash_addr = get_flash_addr();
		
	/* enable interrupts */
	setReg(SYS_CNTL, 0);
	
	// IPL channels from 0 to 6 enabled
	// external interrupts IRQA and IRQB disabled
	setRegBits(IPR, 0xFE00); 

	// enable FAULT
	__ENIGROUP (61, 3); 
	#if (VERSION == 0x0254)
	#else
	__ENIGROUP (60, 3);
	#endif	
	// enable SCI
	__ENIGROUP (52, 4);
	__ENIGROUP (53, 4);
	__ENIGROUP (50, 4);
	__ENIGROUP (51, 4);
	
    // enable data flash
	__ENIGROUP (13, 4);
	
	// enable CAN	
	__ENIGROUP (14, 6);
	__ENIGROUP (15, 6);
	__ENIGROUP (16, 6);
	__ENIGROUP (17, 6);
	
	// enable ADCA/ADCB
	__ENIGROUP (55, 6);
	__ENIGROUP (54, 6);
	
	//enable PWM reload 
	__ENIGROUP (59, 7); // PMWA
	
	#if (VERSION == 0x0254)
	#else	
	__ENIGROUP (58, 7); // PWMB
	#endif
	// enable timers
	// TIMER_A
	__ENIGROUP (45, 7); //Timer for the encoder commutation if used
    __ENIGROUP (44, 7); //
	__ENIGROUP (43, 7); //
	__ENIGROUP (42, 4); //TI1 1ms delay main loop
	// TIMER_B

	__ENIGROUP (41, 7); //
	__ENIGROUP (40, 7); //
	__ENIGROUP (39, 7); //
	__ENIGROUP (38, 7);

	// TIMER_C
	__ENIGROUP (37, 1); 
	__ENIGROUP (36, 1);
	__ENIGROUP (35, 1);
	__ENIGROUP (34, 1);
	// TIMER_D
	__ENIGROUP (33, 7); //1ms delay duty cycle
	__ENIGROUP (32, 1);
	__ENIGROUP (31, 1);
	__ENIGROUP (30, 1);

	__EI();
	
	flash_interface_init  (JN);			
	readFromFlash (_flash_addr);  
	if (_version==_flash_version)
	{
		
	}
	else
	{
		writeToFlash(_flash_addr);
	}
	__DI();
	
	#warning "debug"//   ;
	
	__EI();

	init_leds  			  ();
	
	#if (VERSION == 0x0254)
	
	Init_Brushless_Comm	  (1,HALL); 
  	
  	#else 

	Init_Brushless_Comm	  (JN,HALL); 
  	
  	#endif
	can_interface_init    (JN);	 
    init_strain ();


    init_position_abs_ssi ();
#if VERSION ==0x0257 
    init_relative_position_abs_ssi();
#endif 
 
    init_faults           (true,true,true);	 
    
    init_position_encoder ();


	TI1_init 			  ();

//variable init	
	mainLoopOVF=0;
	_count=0;
	
	for(i=0;i<JN;i++)
	{
	_received_pid[i].rec_pid=0;
	}
	
	BUS_OFF=false;
 	#warning "debug"//   ;
	
	//__EI();

	  
//	print_version ();
	
	/* initialization */
	for (i=0; i<JN; i++) _calibrated[i] = false;
	
	/* reset trajectory generation */
	for (i=0; i<JN; i++) abort_trajectory (i, 0);
	
	
	///////////////////////////////////////
	// reset of the ABS_SSI
	// this is needed because the AS5045 gives the first value wrong !!!
    for (i=0; i<JN; i++)	_position[i]=(Int32) Filter_Bit(get_position_abs_ssi(i));
    for (i=0; i<JN; i++)    _max_real_position[i]=Filter_Bit(4095);
 	
	//////////////////////////////////////
	
	/* initialize speed and acceleration to zero (useful later on) */
	for (i=0; i<JN; i++) _position_old[i] = 0;
	for (i=0; i<JN; i++) _speed[i] = 0;
	for (i=0; i<JN; i++) _accel[i] = 0;
	for (i=0; i<JN; i++) _safeband[i] =5; //5 ticks => 1 grado di AEA.
	for (i=0; i<JN; i++) PWMoutput [i] = PWMoutput_old[i] = 0;
	
	/* reset the recursive windows for storage of position and velocity data */
	/* (for velocity and position estimates) */
	for(i=0;i<JN;i++)
	{
		for(wi=0;wi<winSizeMax;wi++)
		{
			jntPosWindow[wi][i]=_position[i];	
			jntVelWindow[wi][i]=0;
			motPosWindow[wi][i]=0;	
			motVelWindow[wi][i]=0;
		}
	}
	
	//set_relative_position_abs_ssi(1,get_absolute_real_position_abs_ssi(1));
	/* main control loop */
	for(_counter = 0;; _counter ++) 
	{
		if (_counter >= CAN_SYNCHRO_STEPS) _counter = 0;
		led3_on
		while (_wait);
		_count=0;
		led3_off
		
// BUS_OFF check
		if (getCanBusOffstatus() )
		{
			#ifdef DEBUG_CAN_MSG
				can_printf("DISABLE BUS OFF");
			#endif	
			for (i=0; i<JN; i++) put_motor_in_fault(i);
			led1_off
		}
		else
			led1_on

// READING CAN MESSAGES
		can_interface();

		for (i=0; i<JN; i++)
		if (_pad_enabled[i]==false && _control_mode[i]!=MODE_HW_FAULT) _control_mode[i]=MODE_IDLE;		
	
	
	    //Position calculation
	    // This is used to have a shift of the zero-cross out of the 
	    // joint workspace
	    //
	    // max_real_position is the limit of the joint starting from 
	    // 4095 and going to decrease this number without zero-cross
	    // untill the joint limit is reached
#if    VERSION == 0x0257 
		_position_old[0]=_position[0]; 
		if(get_error_abs_ssi(0)==ERR_OK)
			_position[0]=Filter_Bit (get_position_abs_ssi(0));
    	_position_old[1]=_position[1];
		if(get_error_abs_ssi(1)==ERR_OK) 
			_position[1]=Filter_Bit (get_position_abs_ssi(1));		 
#else
	 	for (i=0; i<JN; i++) 
		{
		_position_old[i]=_position[i];
		if(get_error_abs_ssi(i)==ERR_OK)
		_position[i]=Filter_Bit (get_position_abs_ssi(i));
		
		}
#endif 

		// get_commutations() is used to read the incremental encoder of the motors.
		// the variable _motor_position is then used to estimate the rotor speed and
		// compensate the back-EMF of the motor.
		for (i=0; i<JN; i++) _motor_position[i]=get_position_encoder(i);//get_commutations(i);


///////////////////////////////////////////DEBUG////////////
#if (VERSION !=0x0254)
	    for (i=0; i<JN; i++) 
		{		
		   if (get_error_abs_ssi(i)==ERR_ABS_SSI)
		   {
				put_motor_in_fault(i);	
				#ifdef DEBUG_CAN_MSG
		    	can_printf("ABS error %d",i);	
				#endif
		   }				
		}  
#endif
	
#if (VERSION ==0x0254)
		   if (get_error_abs_ssi(0)==ERR_ABS_SSI)
		   {
				put_motor_in_fault(0);
				#ifdef DEBUG_CAN_MSG
		    	can_printf("ABS error %d",0);	
				#endif
		   }	
					 
#endif	


 //DO NOTHING


		// decoupling the position	 	
		decouple_positions();
		

				/* velocity and acceleration estimators */
		{	
			for (i=0; i<JN; i++)
			{	
				//joint velocity estimator
				tailJntPos[i]=headJntPos[i]+(winSizeMax-divJntPos[i]); if(tailJntPos[i]>=winSizeMax) tailJntPos[i]=tailJntPos[i]%winSizeMax;			
				_speed_old[i] = _speed[i];
				jntPosWindow[headJntPos[i]][i]=_position[i];
				_speed[i] = (Int32) (((jntPosWindow[headJntPos[i]][i] - jntPosWindow[tailJntPos[i]][i] ))<<_jntVel_est_shift[i]);
			//	_speed[i] <<= _jntVel_est_shift[i];
				_speed[i] = (Int32)(_speed[i]) / divJntPos[i];
				headJntPos[i]=headJntPos[i]+1; if(headJntPos[i]>=winSizeMax) headJntPos[i]=0;
/*
				//joint acceleration estimator
				tailJntVel[i]=headJntVel[i]+(winSizeMax-divJntVel[i]); if(tailJntVel[i]>=winSizeMax) tailJntVel[i]=tailJntVel[i]%winSizeMax;			
				_accel_old[i] = _accel[i];
				jntVelWindow[headJntVel[i]][i]=_speed[i];
				_accel[i] = ((jntVelWindow[headJntVel[i]][i] - jntVelWindow[tailJntVel[i]][i] ));
				_accel[i] << _jntAcc_est_shift[i];
				_accel[i] = (Int32)(_accel[i]) / divJntVel[i];
				headJntVel[i]=headJntVel[i]+1; if(headJntVel[i]>=winSizeMax) headJntVel[i]=0;
*/				
				//motor velocity estimator
				tailMotPos[i]=headMotPos[i]+(winSizeMax-divMotPos[i]); if(tailMotPos[i]>=winSizeMax) tailMotPos[i]=tailMotPos[i]%winSizeMax;			
				_motor_speed_old[i] = _motor_speed[i];
				motPosWindow[headMotPos[i]][i]=_motor_position[i];
				_motor_speed[i] = ((motPosWindow[headMotPos[i]][i] - motPosWindow[tailMotPos[i]][i] ));
				_motor_speed[i] <<= _motVel_est_shift[i];
				_motor_speed[i] = (_motor_speed[i]) / divMotPos[i];
				headMotPos[i]=headMotPos[i]+1; if(headMotPos[i]>=winSizeMax) headMotPos[i]=0;				
			}
		}
		


					
		/* in position? */
#if (VERSION != 0x0254)
		for (i=0; i<JN; i++) _in_position[i] = check_in_position(i); 
#else
		_in_position[0] = check_in_position(0);
#endif
				
		/* in reference configuration for calibration? */
		//for (i=0; i<JN; i++) check_in_position_calib(i); 

	
//******************************************* POSITION LIMIT CHECK ***************************/
		for (i=0; i<JN; i++)  check_range(i, _safeband[i], PWMoutput);

//******************************************* COMPUTES CONTROLS *****************************/

		//FT sensor watchdog update 
		for (i=0; i<STRAIN_MAX; i++) 
			if (_strain_wtd[i]>0) _strain_wtd[i]--;
			
		for (i=0; i<JN; i++) 
		{
			//computing the PWM value (PID)
			PWMoutput[i] = compute_pwm(i);

			// PWM filtering in torque control if there is no bemf compensation
			#if (VERSION != 0x0351)
			if (_control_mode[i] == MODE_TORQUE ||
			 	_control_mode[i] == MODE_IMPEDANCE_POS ||
			 	_control_mode[i] == MODE_IMPEDANCE_VEL)
				{
					if (_useFilter[i] == 3) PWMoutput[i] = lpf_ord1_3hz (PWMoutput[i], i);
				}	
			// saving the PWM value before the decoupling					
			_bfc_PWMoutput[i] = PWMoutput_old[i] = PWMoutput[i];

			// applying the saturation to the PWM
			if      (_bfc_PWMoutput[i] < -MAX_DUTY) _bfc_PWMoutput[i]=-MAX_DUTY;
			else if (_bfc_PWMoutput[i] > MAX_DUTY)  _bfc_PWMoutput[i]= MAX_DUTY;
			#endif //(VERSION != 0x0351)			
		}

        //decouple PWM	
		decouple_dutycycle(PWMoutput);
		
//******************************************* SATURATES CONTROLS ***************************/                
		/* back emf compensation + controls saturation (if necessary) */
		for (i=0; i<JN; i++)
		{
			if (_control_mode[i] == MODE_TORQUE ||
				_control_mode[i] == MODE_IMPEDANCE_POS ||
				_control_mode[i] == MODE_IMPEDANCE_VEL)
			{
				#if (VERSION != 0x0351)
				// Back emf compensation			
			
				//PWMoutput[i]+=compensate_bemf(i, _comm_speed[i]); //use the motor speed
				PWMoutput[i]+=compensate_bemf(i, _speed[i]); //use the joint speed
				
				//add the coulomb friction compensation term
				if (_kstp_torque[i] != 0 ||
				    _kstn_torque[i] != 0)
				//PWMoutput[i]+=compensate_friction(i, _comm_speed[i]); //use the motor speed
				PWMoutput[i]+=compensate_friction(i, _speed[i]); //use the joint speed
				
				// Protection for joints out of the admissible range during force control
				check_range_torque(i, _safeband[i], PWMoutput);
				// PWM saturation
				ENFORCE_LIMITS	(i,PWMoutput[i], _pid_limit_torque[i] );
				#else  //(VERSION != 0x0351)
				ENFORCE_LIMITS	(i,PWMoutput[i], _pid_limit[i] );
				#endif //(VERSION != 0x0351)
			}
			else
			{
				ENFORCE_LIMITS	(i,PWMoutput[i], _pid_limit[i] );
			}			
			if      (_pid[i] < -MAX_DUTY) _pid[i]=-MAX_DUTY;
			else if (_pid[i] > MAX_DUTY)  _pid[i]= MAX_DUTY;
		}
				
		/* generate PWM */		
		for (i=0; i<JN; i++)
		{
			if (!mode_is_idle(i)) {PWM_generate(i,_pid[i]);}			
		}
	
		/* Check Current done in T1 */

		/* do extra functions, communicate, etc. */
		//send broadcast data	
		can_send_broadcast();

		//send additional debug information
		//can_send_broadcast_debug(1,1);
	 
/***********************************************************************
// Check Current is made here
/***********************************************************************/

#if (VERSION != 0x0254)
		for (i=0; i<JN; i++)
#else
		for (i=0; i<1; i++)
#endif  
		{
			if ((get_current(i)>=25000) || (get_current(i)<=-25000))
			{
				put_motor_in_fault(i);	
				highcurrent[i]=true;
				#ifdef DEBUG_CAN_MSG
				can_printf("j%d curr %f",i,get_current(i));
				#endif
			}
			check_current(i, (_pid[i] > 0));		
			compute_i2t(i);
			if (_filt_current[i] > MAX_I2T_CURRENT)
			{
				put_motor_in_fault(i);	
				highcurrent[i]=true;
				#ifdef DEBUG_CAN_MSG
				can_printf("j%d filtcurr %f",i,_filt_current[i]);
				#endif	
			}			
		}

//	Check for the MAIN LOOP duration
 
			
//		t1val= (UInt16) TI1_getCounter(); 	
		if (	_count>0)
		{	
			mainLoopOVF=1;
			_count=0;
		}


		
		/* tells that the control cycle is completed */
		
		_wait = true;		
		
	} /* end for(;;) */
示例#30
0
文件: DAC10.c 项目: alex262/MB90F591
void DriverDAC10(void)
{
	BYTE	i, bData;
	WORD	wData;//, tmp;
	//int		iData;
	float	fData;
	//-------------------------------------
	#ifdef READ_TEMP
	if(Dac10.TimerTem>=TIME_TEM)
	{
		Dac10.TimerTem=0;
	}
	#endif
	//-------------------------------------
	ControlKoeff();
	//-------------------------------------
	#ifndef CASH_PDO_DATA
	__DI();
	#endif
	Dac10.Info.bits.ErrSet = Dac10.ErrorSet;
	i=ADDR;	
	Dac10.Info.bits.Addr	=i;
	if(i!=ADDR_NODE)
	{
		setState(Initialisation);
		ADDR_NODE			=ADDR;
	}
	Dac10.Info.bits.Mode	=MODE;
	Dac10.Info.bits.F1	=0;
	Dac10.Info.bits.F2	=0;
	#ifndef CASH_PDO_DATA
	__EI();
	#endif
	
	Dac10.AddData = DAC_STATUS_NEIGHBOUR|(DAC_ADD_ADDR<<8);

	//----------------------------------------------
	if(Dac10.TarrStatus==true)
		SelectMasterDAC();
	//--------------------------------------------------
	// Проверка записанного значения в ЦАП с помощью АЦП
	#ifndef CASH_PDO_DATA
	__DI();
	#endif
	
	/*if(Dac10.TimerErrDac>=80)
	{
		Dac10.TimerErrDac=80;
		for(i=0;i<COUNT_DAC_CH;i++)
		{
			if((Dac10.fDAC_Set[i]>(Dac10.fADC[i]+dERR_DAC_mA)) || 
				(Dac10.fDAC_Set[i]<(Dac10.fADC[i]-dERR_DAC_mA)))
			{
				Dac10.wError|=1<<i;
			}else
			{
				Dac10.wError&=(WORD)(~(1<<i));
			}
		}	
	}*/
	//----------------------------------------------
	if(Dac10.TimerDout >= PeriodDout)
	{
		Dac10.TimerDout = 0;
		Dac10.HiLoDec = true;
		Dac10.HiLo = ~Dac10.HiLo;
	}
	//=======================================================================================
	// Запись дискретных выходов
	// выбор режима работы цап по току или напряжению
	// коммутация на выход
	// коммутируем только если мы мастер
	//=======================================================================================
	
	//if(Dac10.wError != 0)
	if(Dac10.wOldError != Dac10.wError)
	{
		Dac10.TimerMasterError = 0;
		Dac10.ErrorSet = true;
	}
	wData = Dac10.EnOutDac&(~Dac10.wError);
	if((Dac10.Master == true)||(Dac10.TarrStatus==false))
	{
		if((wData/*Dac10.EnOutDac*/ != 0)&&(Dac10.HiLoDec == true))
		{
			if(Dac10.HiLo == 0)
				Spi_Buf_Out[0]=7;
			else
				Spi_Buf_Out[0]=3;
				
			Operate_Max1329_RegMode_Mask(wData/*Dac10.EnOutDac*/, 0x13,1);
		}
	}
	Dac10.HiLoDec = false;

	//Operate_Max1329_DAC_Write_Mask((~Dac10.EnOutDac), 1, (MAX_COD_DAC/2));

	//----------------------------------------------
	for(i=0;i<COUNT_MAX1329;i++)
	{
		//=============================
		// Запись в ЦАП по изменениям
		//=============================
		if(Dac10.fDAC_New[i] != Dac10.fDAC_Set[i])
		{
			
			if(Dac10.TarrStatus == false)
			{
				Dac10.fDAC_Set[i] = Dac10.fDAC_New[i];
				WriteNormalDataDac(i, Dac10.fDAC_Set[i]);
			}else
			{
				//if((Dac10.EnOutDac&(((WORD)1)<<i)) != 0)
				{
					fData = Dac10.fDAC_New[i];
						
					if(fData>MaxValueDac[i])	fData = MaxValueDac[i];
					if(fData<MinValueDac[i])	fData = MinValueDac[i];
					if(fData != Dac10.fDAC_Set[i])
					{
						Dac10.fDAC_Set[i] = fData;
						WriteNormalDataDac(i, fData);
					}
				}	
			}
		}else
		{
			//if(((Dac10.EnOutDac^Dac10.setEnOutDac)&(((WORD)1)<<i)) != 0)
			//{
			//	WriteNormalDataDac(i, Dac10.fDAC_Set[i]);
			//}	
		}
		//=============================================================================================
		// Опрашиваем дискретные входы
		//=============================================================================================
		if(Dac10.TimerDin >= PeriodOprosDin)
		{
			Operate_Max1329_RegMode(i, READ_MODE_SPI, 0x11,1);
			bData = Spi_Buf_In[0]&0x0F;
			Dac10.DIN[i] = bData;
			
			if((bData&8) == 0) SETBIT(Dac10.DiagRele,i);
			else CLEARBIT(Dac10.DiagRele,i);
			
			//if((bData&5) == 5) CLEARBIT(Dac10.wError,i);
			//else SETBIT(Dac10.wError,i);
			if((bData&5) != 5) SETBIT(Dac10.wError,i);
			
			
			
			if(i == (COUNT_MAX1329-1))
				Dac10.TimerDin = 0;
		}
		//===================================================
		// Опрашиваем АЦП 
		//===================================================
		/*Operate_Max1329_RegMode(i, READ_MODE_SPI, 2,2);
		tmp		= Spi_Buf_In[0];
		wData	= (tmp<<4)&0x0FF0;
		wData	|= (Spi_Buf_In[1]>>4)&0xF;
			
		iData = wData&0xFFF;
		
		Dac10.fADC[i] = TarrRAM_ADC[i].k*(float)iData + TarrRAM_ADC[i].ofs;
				
		Operate_Max1329_ADC_Convert(i, 0, 0, 0);*/
		//===================================================
		// Опрашиваем температурные датчики
		/*if(Dac10.TimerTemp >= PeriodOprosTemp)
		{
			
			Operate_Max1329_RegMode(i,READ_MODE_SPI, 2,2);
			
			tmp		= Spi_Buf_In[0];
			wData	= (tmp<<4)&0x0FF0;
			wData	|= (Spi_Buf_In[1]>>4)&0xF;
			
			iData = ConvertADCtoINT(wData);
			
			Dac10.Temperature[i] = iData*0.125;
			
			//Operate_Max1329_ADC_Convert(i,0x8, 0, 0);
			
			if(i == (COUNT_MAX1329-1))
				Dac10.TimerTemp = 0;
		}*/
	}
	
	
	// -------------------------------------------------------------------------
	GetPak_Uart(0);
	if(Dac10.SendFlagUart==1)
	{
		Dac10.SendFlagUart=0;

		
		for(i=0;i<COUNT_DIN_CH;i++)
		{
			SendPak1.DIN[i]	=Dac10.DIN[i];
		}
		for(i=0;i<COUNT_DOUT_CH;i++)
		{
			SendPak1.DOUT[i]	=Dac10.DOUT_Set[i];
		}
		for(i=0;i<COUNT_DAC_CH;i++)
		{
			SendPak1.fStateDAC[i]   = Dac10.fDAC_Set[i];	
			//SendPak1.fStateDAC[i]   = Dac10.wDAC_Set[i];
		}
		for(i=0;i<COUNT_ADC_CH;i++)
		{
			SendPak1.fStateADC[i]   = Dac10.fADC[i];	
		}
		for(i=0;i<COUNT_MAX1329;i++)
			SendPak1.Temperature[i]   = Dac10.Temperature[i];
		
		for(i=0;i<10;i++)
			SendPak1.Temp[i] = Dac10.Temp[i];
		
		Send_Pkt(0,(BYTE *)(&SendPak1),sizeof(TSendPak1),1,1);
	}
	if(Dac10.SendFlagUart==2)
	{
		Dac10.SendFlagUart=0;
		for(i=0;i<COUNT_DAC_CH;i++)
		{
			SendPak2.tTarDAC[i].k   = TarrRAM_DAC[i].k;
			SendPak2.tTarDAC[i].ofs = TarrRAM_DAC[i].ofs;
		}
		for(i=0;i<COUNT_ADC_CH;i++)
		{
			SendPak2.tTarADC[i].k   = 1;//TarrRAM_ADC[i].k;
			SendPak2.tTarADC[i].ofs = 0;//TarrRAM_ADC[i].ofs;
		}
		Send_Pkt(0,(BYTE *)(&SendPak2),sizeof(TSendPak2),1,2);
	}
}