fork

Dependencies:   mbed

Fork of LG by igor Apu

main.c

Committer:
Diletant
Date:
2016-02-10
Revision:
46:2670fa0fcebc
Parent:
45:cbc955aecebe
Child:
47:d902ef6f7564

File content as of revision 46:2670fa0fcebc:

//ssdfwewedfsfds
/****************************************Copyright (c)****************************************************
**--------------File Info---------------------------------------------------------------------------------
** File name:           main.c
** Last modified Date:  2011-10-24
** Last Version:        V1.00
** Descriptions:        The main() function
**
**--------------------------------------------------------------------------------------------------------
** Created by:          Electrooptica Incorp.
** Created date:        2011-08-22
** Version:             V1.00
** Descriptions:
**--------------------------------------------------------------------------------------------------------
последнии изменения
//2016_02_03_17_47
//2016_02_06 igor
//2016_06 Dima
//2016_02_06 21:20 Kovalev_D
*********************************************************************************************************/


#include "Global.h"
//#include <math.h>



/******************************************************************************
**   Main Function  main()
******************************************************************************/
extern uint32_t CMD_Mode;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
int i1 =0;
volatile unsigned int 	IRQ_Counter=0;
volatile uint32_t 		timer1_counter = 0;
int temp111=0,temp=0;
int y = 0;
int CuruAngleOld=0;
unsigned int  secPuls,CountBI,CmmandIn,tt,th;

unsigned int paramV;
void Led_init()
{
    LPC_PINCON->PINSEL0 = (0x00<<28);
    LPC_GPIO1->FIODIR   = (0x1<<30);
    LPC_PINCON->PINMODE0 = (0x3<<28);
    // LPC_GPIO1->FIOSET = (0x0<<30);
    // LPC_GPIO0->FIOSET = (1<<4);
}

int flag=0,  TIME=0,t=0, Sec=0,tmpSec=0,SEC=0, mSec=0;
int tempsec=0;
float DACF, K_DAC;

void Led_Blink()
{
    if (flag == 0) {
        LPC_GPIO1->FIOSET = (0x1<<30);
        flag=1;
    } else {
        flag =0;
        LPC_GPIO1->FIOCLR = (0x01<<30);
    }
}


int main (void)
{
    Gyro.SOC_Out=0xDD;		
    Gyro.Firmware_Version	=0x15; //версия программы
    Gyro.GLD_Serial 		= 0x20; //серийный номер
    Gyro.My_Addres			= 0; //адрес глд
    
    
    
    K_DAC=65535.0/(65535.0+(deltaDAC+deltaDAC/2));
    K_DAC=0.8;



    Gyro.Discharg = 0x7;  // инициализация время поджига    3 сек  (в событии 1HZ)
    Gyro.BackLight=0x3ff;// инициализация время подсветки 10 сек  (в событии 1HZ)
    secPuls =0;
    Pulse_midl = 0;
    PulseHalf = 0;
    CuruAngle = 0;
    Spi.DAC_A = 0x7fff;
    Spi.DAC_B = 0x7fff;
    //инициализация
    SystemInit1();  // Инициализация контроллера: установка тактовых частот
    Led_init();

    ///*
    //Конфигурирование сигнала поджига
    LPC_PINCON->PINSEL0 &= ~(3<<8);		//e. P0.4 is GPIO pin (запись ( 00 ) в 9:8 бит PISEL0    выбор P0.4 как GPIO)
    LPC_PINCON->PINMODE0 |= (3<<8);		//e. P0.4 is GPIO pin (запись ( 11 ) в 9:8 бит PINMODE0  "для включения подтягивающего резистора")
    LPC_GPIO0->FIODIR   |= (1<<4);		//e. P0.4 is output   (запись ( 1 ) в  5  бит FIODIR    выбор P0.4 как выход)
    LightUpON		//e. P0.4 is output   (запись ( 1 ) в  5  бит CLR       устанавливаем на P0.4 низкий уровень сигнала)
    /*
    LPC_PINCON->PINSEL0 &= ~(3<<10);		//e. P0.4 is GPIO pin (запись ( 00 ) в 9:8 бит PISEL0    выбор P0.4 как GPIO)
    LPC_PINCON->PINMODE0 |= (3<<10);		//e. P0.4 is GPIO pin (запись ( 11 ) в 9:8 бит PINMODE0  "для включения подтягивающего резистора")
    LPC_GPIO0->FIODIR   |= (1<<5);		//e. P0.4 is output   (запись ( 1 ) в  5  бит FIODIR    выбор P0.4 как выход)
    LPC_GPIO0->FIOCLR   |= (1<<5);		//e. P0.4 is output   (запись ( 1 ) в  5  бит CLR       устанавливаем на P0.4 низкий уровень сигнала)*/

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    LPC_PINCON->PINSEL3   = (0x00<<18);		//e. P1.25 is GPIO pin
    LPC_PINCON->PINMODE3 |= (3<<18);		//e. P1.25  (включениe подтягивающего резистора")
    LPC_GPIO1->FIODIR    |= (1<<25);		//e. P0.5 is output   (запись ( 1 ) в  5  бит FIODIR    выбор P0.5 как выход)
    LPC_GPIO1->FIOCLR    |= (1<<25);


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    LPC_PINCON->PINSEL3   = (0x00<<24);		//e. P1.28 is GPIO pin
    LPC_PINCON->PINMODE3 |= (3<<24);		//e. P1.28 is GPIO pin (запись ( 11 ) в бит PINMODE0  "для включения подтягивающего резистора")
    LPC_GPIO1->FIODIR    |= (1<<28);		//e. P1.28 is output   (запись ( 1 ) в  5  бит FIODIR    выбор P0.5 как выход)
    LPC_GPIO1->FIOCLR    |= (1<<28);
//  init_timer(TIME_INTERVAL ); // 10ms
// enable_timer1();
///иНИциализация подсветки
    LPC_PINCON->PINSEL2   = (0x00<<24);		//e. P2.12 is GPIO pin
    LPC_PINCON->PINMODE3 |= (3<<24);		//e. P1.28 is GPIO pin (запись ( 11 ) в бит PINMODE0  "для включения подтягивающего резистора")
    LPC_GPIO2->FIODIR    |= (1<<12);		//e. P1.28 is output   (запись ( 1 ) в  5  бит FIODIR    выбор P0.5 как выход)
    LPC_GPIO2->FIOCLR    |= (1<<12);

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /*
      //конфигурирование сигнала поджига оторваная нога (поджиг на 80 ноге вместо 81)
      LPC_PINCON->PINSEL0   = (0x00<<10);		//e. P0.5 is GPIO pin (запись ( 00 ) в 11:10 бит PISEL0    выбор P0.5 как GPIO)
      LPC_PINCON->PINMODE0 |= (3<<10);		//e. P0.5 is GPIO pin (запись ( 11 ) в 11:10 бит PINMODE0  "для включения подтягивающего резистора")
      LPC_GPIO0->FIODIR    |= (1<<5);		//e. P0.5 is output   (запись ( 1 ) в  5  бит FIODIR    выбор P0.5 как выход)
      LPC_GPIO0->FIOCLR    |= (1<<5);		//e. P0.5 is output   (запись ( 1 ) в  5  бит CLR       устанавливаем на P0.5 низкий уровень сигнала)
    	*/
    DMA_Init();               // Инициализация DMA
    FlashDMA_Init(); 		  // Загрузка параметров с флэш

    SystemCoreClockUpdate1(); // расчет тактовой частоты процессора перед инициализацией UART - 100MHz
    UARTInit();				  // инициализация  UART0 на скорость 38400.
    UART1_Init();             // инициализация  UART1 на скорость 38400.


    DAC_ADC_Exchange_Init();  // инициализация  обмена АЦП и ЦАП.
    DACInit();                // инициализация ЦАП.
    SOI_Init(); 			  // Инициализация квадратурного энкодера.

    IntLatch_Init();		  // инициализация внутренней защелки.
    ExtLatch_Init();		  // инициализация внешней защелки.

//----------------debug-------------------------
    //LPC_GPIO2->FIODIR = 0x5C;		// P2.0...P2.7 defined as Outputs
    //LPC_GPIO2->FIOCLR = 0x5C;		// turn off all the LEDs
//----------------debug-------------------------



    LoadFlashParam(FromFLASH); 	//загрузка параметров.
    UART_DMA_Init();			    	//инициализация DMA для UART.
    G_Photo_Init();				      //инициализация интерфейса I2C для фотодетектора.
    Out_G_photo(60, 60);        //запись в буфер мастера принятые от функции данные (60,60) и установка флага старта передачи и занятой шины.
//  WDTInit();


    open_all_loops();                          //#define open_all_loops()			RgConA   = 0	(Основной регистр управления устройства (0 - включить, 1 - отключить)).
    Output.Str.HF_reg = Device_blk.Str.HF_min; //HFO output voltage = максивальное напряжение на ГВЧ.
    init_PLC();                                //Инициализация СРП(регулировка периметра)
    init_Dither_reg();                         //инициализация вибропривода
    RgConB = RATE_VIBRO_1; // дополнительный регистр управления = разность вибросчетчиков после фильтра скольз.среднего(#define RATE_VIBRO_1	0x0001)

    init_Vibro();
    init_timer(TIME_INTERVAL ); //Timer 1: 7812 - 10ms
    enable_timer1();
    Init_TIM2();				//Timer 2: 250
    enable_timer2();
    close_all_loops();


    LPC_GPIO0->FIOCLR = (1<<5);


    Event1Hz	= 0;
    Event1K 	= 0;
    Event100K 	= 0;
    EventVibro 	= 0;
    Time1K 		= 0;
    Time100K	= 0;
    Time1Hz		= 0;
    Clock1Hz	= 0;
    Gyro.Discharg = StartDischarg;

    Pulse_8Point = 0;
    Pulse_16Point = 0;
    Pulse_32Point = 0;

    Temp_AMP=0;
    Temp_ADC_2=0;
    Temp_ADC_3=0;
    Temp_ADC_4=0;
    Temp_ADC_5=0;

    for (y = 0; y < 256; y++ ) {
        Buff_16Point[y] 	= 0xffff;
        Buff_8Point[y] 		= 0xffff;
        Buff_32Point[y] 	= 0xffff;
        Buff_ADC_1[y] 		= 0;	// ампл ацп.
        Buff_ADC_2[y] 		= 0;
        Buff_ADC_3[y] 		= 0;
        Buff_ADC_4[y] 		= 0;
        Buff_ADC_5[y] 		= 0;
    }
    WriteCon("\n\r ...GL start programm uart 0.... ");
    WriteCon1("\n\r ...GL start programm uart 1.... ");
    sprintf(Time,"\r\nCompiled: %s %s.",__DATE__,  __TIME__ );                 //Подготовка даты и времени компиляции
    WriteCon(Time);



    do { //основной цикл.
        Concol ();					// Проврка 0 консоли  (вход и выход)
        if (OutBufConCount)  OutBufConCount--;
        if (ReadCon (Time)) {
            if (Time[0] == 'h') { // если ввели буквц h то выдать подсказку. сделанно через принф ОЧЕНЬ плохо в работе не использовать
                sprintf(Time,"\r\nCompiled: %s %s.",__DATE__,  __TIME__ );                 //Подготовка даты и времени компиляции
                WriteCon(Time);
                sprintf(Time,"--%d.%3.d.%2.d.",Clock1Hz,Time1K,Time100K);                 //Временно выдачпа временни из трех чисел
                WriteCon(Time);
            }
        }
        Concol1 ();					// Проврка 0 консоли  (вход и выход)
        if (OutBufCon1Count)  OutBufCon1Count--;
        if (Event1Hz)	{// событие раз в 1 Гц
            Event1Hz --;
            Clock1Hz++;

//============================= блок управления поджигом, сделанно через сдвиг======================
            if (Gyro.Discharg) {	//Проверка поджига
                if (Gyro.Discharg & 0x01) Gyro.PinReg |= PinRegBitD;
                else Gyro.PinReg &= ~PinRegBitD;
                Gyro.Discharg = Gyro.Discharg >> 1;
            }
//============================= блок управления подсветкой, сделанно через сдвиг======================
            if (Gyro.BackLight) {	//Проверка подсветки
                if (Gyro.BackLight & 0x01) Gyro.PinReg |= PinRegBitL;
                else Gyro.PinReg &= ~PinRegBitL;
                Gyro.BackLight = Gyro.BackLight >> 1;
            }

            CMD_Rate();
            WriteCon(".");				//Так просто выдавать в секунду 1 байт ,что гирос жив

        }
        if (Event1K)	{// событие раз в 1 кГц
            Event1K --;
            Time1K++;
            if (Time1K == 1000) {
                Time1K = 0;
                Event1Hz ++;

            }

        }
        if (Event100K)	{			// событие раз в 100 кГц
            Event100K --;
            Time100K++;
      
            PinCheng();			// чтение регистра состояния выводов(вибро, полсветка, поджиг, LED) и управление выводами.
        	if (OutBufCon1Count)  OutBufCon1Count--;	// обратный отсчет для управления ногой и формирование задержки на выдачу
	        if (Time100K == 100) {
                Time100K = 0;
                Event1K ++;
            }
        }
        if (EventVibro)	{// событие от вибр
            EventVibro --;
        }
        Read_CMD();

//	VibroOut();

        if(Time_1kHz>100) {

            SEC++;
            if(Rate_Flag==1 && SEC>500) {
                SEC-=500;
//                CMD_Rate();
            }

            Time_1kHz-=100;




        }
        ButtonLightUP();
        //Device_blk.Str.
//       TakeFromBuff();

        //отключение поджига.

        // paramV=TakeParam(1);



        if (0)				// временно отключил олгоритм Сергея
            if (LPC_PWM1->IR & 0x0001) { // Если в регистре прерываний ШИМ1 (регистр PWM1IR) есть влаг прерывания совпадения счетчика с МАТСН (lim0 ?) то:

                /*	ResetCS(ADC);					  	//prepare ADC for sampling
                	SetDAC(DAC);
                    LPC_GPIO2->FIOSET |= 0x0000004;			// turn on the LED
                    LPC_GPIO2->FIOSET |= 0x0000004;			// turn on the LED
                    LPC_GPIO2->FIOSET |= 0x0000004;			// turn on the LED
                	SetCS(ADC);					    	//start ADC sampling
                	ResetDAC(DAC);  	    			//start DAC prepearing for writing
                */
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                secPuls++;
                tmpSec++;
                mSec++;

                i1++;
                if(i1>10000)
                    //if(CountV31>30)
                {
                    WriteCon(".");
                    i1=0;
                    /*
                    SendToBuffStr("\n\r");
                    //	if (Buff_ADC_1	[y] > 65535)SendToBuffStr(" 0 "); else SendToBuffStr(" 1 ");
                    sprintf (BuffTemp,"<%05d> <%05d> <%05d> <%05d> <%05d>", Temp_AMP>>5,Temp_ADC_2>>5,Temp_ADC_3>>5,Temp_ADC_4>>5,Temp_ADC_5>>5);
                    // sprintf (BuffTemp,"<%07d> <%07d> <%07d> <%07d> <%07d>", Spi.ADC1,Spi.ADC2,Spi.ADC3,Spi.ADC4,Spi.ADC5);
                    	SendToBuffStr(BuffTemp);
                    */
                    /*
                    WriteConByte (Gyro.T_Vib&0xff00);
                    WriteConByte (Gyro.T_Vib&0x00ff);
                    WriteConByte (Gyro.T_Vib);
                    */
                    /*

                    for (y = 0; y < 32; y++ )
                    			{

                    		  	 WriteCon(BuffTemp);
                    			}	WriteCon("\n\r");

                    */
                    /*
                    Gyro.T_Vib=((7680000*16/Gyro.Frq)*4096);
                             th=   Gyro.T_Vib&0xff00;
                             tt=   Gyro.T_Vib&0x00ff;
                                sprintf(BuffTemp,"<%07d  >",( (Gyro.T_Vib&0xff00)));
                    						SendToBuffStr(BuffTemp);

                    						sprintf(BuffTemp,"<%07d  >",( ( Gyro.T_Vib&0x00ff)));
                    						SendToBuffStr(BuffTemp);

                    						CuruAngleOld=CuruAngle;*/
                    // Spi.ADC1=Spi.ADC1*0.000061;




                    /*

                       	sprintf(BuffTemp,"\n\r<%05d><%05d><%05d><%05d><%05d>",Spi.ADC1,Spi.ADC2,Spi.ADC3,Spi.ADC4,Spi.ADC5);
                    SendToBuffStr(BuffTemp);

                    */

                    /*	sprintf(BuffTemp,"<%d>",(FrecTemp));
                    	SendToBuffStr(BuffTemp);
                    for (y = 0; y < 32; y++ )
                    {
                    sprintf(BuffTemp,"   <%07d>", (Buff_16PointD [y]-65535));
                    SendToBuffStr(BuffTemp);
                    }		*/

                }








//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




                LPC_GPIO2->FIOSET |= 0x0000004;		// turn on the LED


                Curr_Cnt_Vib = LPC_QEI->POS;		// записать в переменную	Curr_Cnt_Vib текущее положение Энкодера.	(текущее количество импульсов)
                Latch_Event(); //определение защелки

                clc_Pulses(); // счетчик импульсов. RATE_REPER_OR_REFMEANDR или RATE_VIBRO_1


                //ADC_Input();  // проверка флагов заполнения буфера и четение Thermo1, Thermo2, HF_out в масив  Input.ArrayIn[n].
                //DAC_ADC_Exchange();//  проверка флагов заполнения буфера и зпись в ЦАПы.
                ServiceTime();//секундный таймер.
                clc_ThermoSensors();//расчет средней температуры за секунду
                clc_HFO(); //расчет значения для передачи в контур ГВЧ(на цап).

                clc_PLC();
                //	clc_Dith_regulator();
                clc_OutFreq_regulator();
                Output.Str.WP_sin = clc_WP_sin();
                contrl_GLD();
                G_Photo_Exchange();
                //  Output.Str.T_Vibro = paramV*48;


                Line_1_Rcv();
                decode_CMD();
                transm_DAT();
                //îòêëþ÷åíèå ïîäæèãà.


//			data_Rdy &= ~RESET_PERIOD;


                LPC_PWM1->IR = 0x0001;				 //e. clear interrupt flag
                LPC_GPIO2->FIOCLR |= 0x0000004;		// turn off the LED
//		WDTFeed();
//SPI_Exchange();

            }

    }	while ( 1 );	    // main infinie loop
}

/******************************************************************************
**                            End Of File
******************************************************************************/