Ejemplo n.º 1
0
void changeChargeMode(volatile uint8_t *array8){
	
	if(array8[numDischargeCharge]!=0){
		//Если кол-во итераций разрядки - зарядки не достигло 0
		if(array8[charge]) {
			//Если режим зарядки
			safeTimeCharge[indDisCharge][indChargeTime]=chargeTime;
			chargeTime=0;
			array8[numDischargeCharge]--;			
			
			USART_SendChar('N');
			sendDigitalUsart(indDisCharge+1);
			USART_SendChar('C');
			sendDigitalUsart(safeTimeCharge[indDisCharge][indChargeTime]);
			USART_SendChar('D');
			sendDigitalUsart(safeTimeCharge[indDisCharge][indDischargeTime]);
			indDisCharge++;
			
			if(array8[numDischargeCharge]==0){
				setPwm(0);
			}
			
		} else {
			safeTimeCharge[indDisCharge][indDischargeTime]=dischargeTime;
			dischargeTime=0;
		}
		
		array8[charge]^=1;
		initCharge(array8);
	}
}
int main(void){

	//mem_init();
	//Parameter List
	//
	ParameterFrame PF = newParamFrame();
	int SLength = 20;
	PFset_Len(PF,SLength);
	int SWidth = 20;
	PFset_Wid(PF,SWidth);
	int SHeight = 20;
	PFset_Hei(PF,SHeight);
	
	double RelativePerm = 3.9;
	PFset_RelativePerm(PF,RelativePerm);
	double electricEnergyX = 0;
	double electricEnergyY = 0;
	double electricEnergyZ = 0;
	double KT = 1;
	double reOrgEnergy = 1;
	PFset_reOrg(PF,reOrgEnergy);
	double SiteDistance = 1E-9;
	PFset_SiteDist(PF,SiteDistance);
	int CutOff = 5;
	PFset_CutOff(PF,CutOff);
	double lambda = 1E-9;
	PFset_lambda(PF,lambda);
	int SeedProt = 1;
	PFset_SeedProt(PF,SeedProt);
	int PeriodicX = 0;
	PFset_Px(PF,PeriodicX);
	int PeriodicY = 0;
	PFset_Py(PF,PeriodicY);
	int PeriodicZ = 0;
	PFset_Pz(PF,PeriodicZ);
	
	int XElecOn = 1;
	PFset_XElecOn(PF,XElecOn);
	int YElecOn = 0;
	PFset_YElecOn(PF,YElecOn);
	int ZElecOn = 0;
	PFset_ZElecOn(PF,ZElecOn);
	
	int EndX = 1;
	PFset_EndX(PF,EndX);
	int EndY = 1;
	PFset_EndY(PF,EndY);
	int EndZ = 1;
	PFset_EndZ(PF,EndZ);
	
	double E0 = -5.2;
	PFset_E0(PF,E0);
	double Etrap = -4.9;
	PFset_Etrap(PF,Etrap);
	//double q = 1.602E-19;
	double fracSeed = 0.01;
	PFset_FracSeed(PF,fracSeed);
	double fraction = 0.005;
	PFset_FracTrap(PF,fraction);
	double Tsigma = 0.07;
	PFset_Tsigma(PF,Tsigma);
	double sigma = 0.07;
	PFset_sigma(PF,sigma);
	double gamma = 2;
	PFset_gamma(PF,gamma);
	double AttemptToHop = 10E13;
	PFset_AttemptToHop(PF,AttemptToHop);
	
	double vX = 10E13;
	PFset_vX(PF,vX);
	double vY = 10E13;
	PFset_vY(PF,vY);
	double vZ = 10E13;
	PFset_vZ(PF,vZ);
	double MarcusCoeff = 10E13;
	
	double FermiExb = -2;
	PFset_XFermiB(PF,FermiExb);
	double FermiEyl = -2;
	PFset_YFermiL(PF,FermiEyl);
	double FermiEzb = -2;
	PFset_ZFermiB(PF,FermiEzb);
	double FermiExf = -2;
	PFset_XFermiF(PF,FermiExf);
	double FermiEyr = -2;
	PFset_YFermiR(PF,FermiEyr);
	double FermiEza = -2;
	PFset_ZFermiA(PF,FermiEza);

	double alphaxb = 2;
	PFset_alphaxb(PF,alphaxb);
	double alphayl = 2;
	PFset_alphayl(PF,alphayl);
	double alphazb = 2;
	PFset_alphazb(PF,alphazb);
	double alphaxf = 2;
	PFset_alphaxf(PF,alphaxf);
	double alphayr = 2;
	PFset_alphayr(PF,alphayr);
	double alphaza = 2;
	PFset_alphaza(PF,alphaza);

	Electrode elXb = NULL;
	Electrode elXf = NULL;
	Electrode elYl = NULL;
	Electrode elYr = NULL;
	Electrode elZb = NULL;
	Electrode elZa = NULL;

	const double D = 20E14; 
	PFset_D(PF,D);

	SNarray snA = newSNarray(SLength,SWidth,SHeight);

/*	initJumPossibility(electricEnergy, KT, reOrgEnergy, snA,\
				PeriodicX, PeriodicY, PeriodicZ,\
				XElecOn, YElecOn, ZElecOn);
*/

	//Non - periodic 
	int rv = initSite(electricEnergyX,electricEnergyY,\
			  electricEnergyZ, KT, snA, PF);
	

	printSNarray_Detailed( snA);
	
	char File1[] = "Test1\0";

	printVisitFreq(snA, &File1[0]);

	int Ntot = 100;
	PFset_Ntot(PF,Ntot);	
	int NCh = 20;
	PFset_NCh(PF,NCh);
	int i;
	//Create an array the size of all the charges
	//label the charges starting from 0 to Ntot-1
	matrix sequence = newMatrix(Ntot,1);
	for(i = 0; i<Ntot; i++){
		setE(sequence,i+1,1,i);
	}
	ChargeArray chA = initCharget0( sequence, snA, Ntot, NCh,\
																	D, XElecOn, YElecOn, ZElecOn,\
																	EndX, EndY, EndZ);
	printChargeA(chA);

	rv = initCharge( 20, 2, &chA, sequence, snA,\
					Ntot, NCh, D, XElecOn, YElecOn, ZElecOn,\
					EndX, EndY, EndZ);

	printChargeA(chA);


	printf("Testing initElec\n");

	rv = initElec(electricEnergyX, electricEnergyY, electricEnergyZ,\
		      MarcusCoeff, KT, snA,\
		      &elXb, &elXf, &elYl, &elYr,&elZb,&elZa,\
		      PF);
	
	
	deleteSNarray(snA);
	deleteChargeA(chA);
	deleteMatrix(sequence);
	
	SNarray snAmini;
	matrix mtxmini;

	if (elXb!=NULL){
		snAmini = (SNarray) getElectrode_AdjacentSites(elXb);
		deleteSNarray(snAmini);
		mtxmini = (matrix) getElectrode_HopRates(elXb);
		deleteMatrix(mtxmini);
		deleteElectrode(&elXb);	
	
	}
	if (elXf!=NULL){
		snAmini = (SNarray) getElectrode_AdjacentSites(elXf);
		deleteSNarray(snAmini);
		mtxmini = (matrix) getElectrode_HopRates(elXf);
		deleteMatrix(mtxmini);
		deleteElectrode(&elXf);	
	}

	if (elYl!=NULL){
		snAmini = (SNarray) getElectrode_AdjacentSites(elYl);
		deleteSNarray(snAmini);
		mtxmini = (matrix) getElectrode_HopRates(elYl);
		deleteMatrix(mtxmini);
		deleteElectrode(&elYl);	
	}
	if (elYr!=NULL){
		snAmini = (SNarray) getElectrode_AdjacentSites(elYr);
		deleteSNarray(snAmini);
		mtxmini = (matrix) getElectrode_HopRates(elYr);
		deleteMatrix(mtxmini);
		deleteElectrode(&elYr);	
	}
	if (elZb!=NULL){
		snAmini = (SNarray) getElectrode_AdjacentSites(elZb);
		deleteSNarray(snAmini);
		mtxmini = (matrix) getElectrode_HopRates(elZb);
		deleteMatrix(mtxmini);
		deleteElectrode(&elZb);	
	}

	if (elZa!=NULL){
		snAmini = (SNarray) getElectrode_AdjacentSites(elZa);
		deleteSNarray(snAmini);
		mtxmini = (matrix) getElectrode_HopRates(elZa);
		deleteMatrix(mtxmini);
		deleteElectrode(&elZa);	
	}
	//atexit(mem_term);
	
	
	/*
	//Fully Periodic
	SNarray snA2 = newSNarray(SLength,SWidth,SHeight);
	
	rv = initSite(electricEnergy, KT, reOrgEnergy,\
							lambda, CutOff,\
							fracSeed, fraction, SiteDistance,\
							Etrap, Tsigma, E0, sigma,\
							SeedProt, 1, 1, 1,\
							XElecOn, YElecOn, ZElecOn, snA2);
	
	char File2[] = "Test2\0";

	printVisitFreq(snA2, &File2[0]);

	//Periodic Only in the x
	SNarray snA3 = newSNarray(SLength, SWidth, SHeight);

	rv = initSite(electricEnergy, KT, reOrgEnergy,\
							lambda, CutOff,\
							fracSeed, fraction, SiteDistance,\
							Etrap, Tsigma, E0, sigma,\
							SeedProt, 1, 0, 0,\
							XElecOn, YElecOn, ZElecOn, snA3);
	
	
	char File3[] = "Test3\0";

	printVisitFreq(snA3, &File3[0]);
*/
	
	deleteParamFrame(&PF);

	return 0;
}
Ejemplo n.º 3
0
int main( void )
{	
	/*	
	DDRB=1;
	while(1){
		BM_SetBit(PORTB,0);
		_delay_ms(10);
		BM_ClearBit(PORTB,0);
		_delay_ms(10);
	}
	*/
	volatile uint8_t stateButtons=STATE_NO_BUTTONS;
	volatile uint8_t  switchMeasuring = MEASURING_VOLTAGE;
	
	
	volatile uint8_t arrVal8[oldAutomatic+1];
	pCharge=& arrVal8[charge];
	arrVal8[charge]=0;	
	arrVal8[automatic]=1;	
	arrVal8[numDischargeCharge]=2;
	
	
	volatile uint16_t arrVal[oldWindowsSettings+1];
	arrVal[normalAmperage]=120;	
	arrVal[normalVoltage]=15;
	arrVal[dischargeVoltage]=10;	
	arrVal[dischargeAmperage]=100;	
	arrVal[currentPWM]=250;
	arrVal[currentVoltage]=0;
	arrVal[currentAmperage]=0;
	arrVal[windowsSettings]=1;
	
	
	volatile uint8_t currentDisplay=DISPLAY_START;
	volatile uint8_t oldCurrentDisplay=1;
	volatile uint16_t timeResetDisplay=100;
	
	
	USART_Init();	
	
	
	//инициализируем дисплей
	DDRD|=(1<<PD6);
	initCharge(arrVal8);
	
	LCD_Init();	
	ADC_Init();
	TIMER0_Init();
	initButtons();
	initPWM();
	setPwm(arrVal[currentPWM]);		
	
	setZeroOldValue(arrVal,arrVal8);
	
	
	

	
	StartConvAdc();
	sei();
	
	
	
	
	
	while(1){	
		
		
			volatile uint8_t codeButton=PINX_BUTTON & MASK_BUTTONS;
			
			if(stateButtons!=STATE_ENTER_5SEC && codeButton!=NO_BUTTONS  ){
				stateButtons=getStateButton(codeButton);
				timeResetDisplay=currentTime+5;
				_delay_ms(250);	
				
				switch(stateButtons){
				case STATE_ENTER:
					switch(currentDisplay){
						case DISPLAY_START:currentDisplay=DISPLAY_FAST_CHANGE;break;
						case DISPLAY_FAST_CHANGE:currentDisplay=DISPLAY_START;break;
						case DISPLAY_PROGR:currentDisplay=DISPLAY_PROGR+arrVal[windowsSettings];break;
						default:currentDisplay=DISPLAY_PROGR;
					}	
					break;				
				case STATE_ENTER_5SEC:
					if(currentDisplay>DISPLAY_P0){
						currentDisplay=DISPLAY_START;						
						}else{
						currentDisplay=DISPLAY_PROGR;
					}
					break;
				default:					
					switch(currentDisplay){
					case DISPLAY_FAST_CHANGE:
						arrVal8[charge]^=1;	
						setPwm(512);//Установка в 50 % при смене режима 		
						break;
					case DISPLAY_PROGR:						
						arrVal[windowsSettings]=changeVauleFromButtons(arrVal[windowsSettings],LAST_DISPLAY,stateButtons);
						if(arrVal[windowsSettings]==(LAST_DISPLAY+1)){
							arrVal[windowsSettings]=1;
						}else if(arrVal[windowsSettings]==0){
							arrVal[windowsSettings]=1;
						}
						break;
					case DISPLAY_P0:
						arrVal[normalVoltage]=changeVauleFromButtons(arrVal[normalVoltage],240,stateButtons);
						break;
					case DISPLAY_P1:
						arrVal[dischargeVoltage]=changeVauleFromButtons(arrVal[dischargeVoltage],240,stateButtons);
						break;
					case DISPLAY_P2:
						arrVal[dischargeAmperage]=changeVauleFromButtons(arrVal[dischargeAmperage],1000,stateButtons);
						break;
					case DISPLAY_P3:
						arrVal[normalAmperage]=changeVauleFromButtons(arrVal[normalAmperage],1022,stateButtons);
						break;
					case DISPLAY_P4:
						arrVal8[automatic]^=1;
						break;
					case DISPLAY_P5:
						arrVal8[numDischargeCharge]=changeVauleFromButtons(arrVal8[numDischargeCharge],10,stateButtons);
						if(arrVal8[numDischargeCharge]==11){
							arrVal8[numDischargeCharge]=1;
						}
						break;
					}
					
				}				
				
				} else if(codeButton==NO_BUTTONS) {
					if(currentDisplay!=DISPLAY_START){
						if(currentTime>timeResetDisplay){
							currentDisplay=DISPLAY_START;
						}						
					}
					
					if(stateButtons==STATE_ENTER_5SEC){
						stateButtons=STATE_NO_BUTTONS;
					}				
				}
		
		
		if(numberMeasure>=NUMBER_OF_MEASURING){
			
			adcResult=getNormalADC(adcResult);
			
			switch (switchMeasuring)
			{				
				case MEASURING_VOLTAGE:					
					switchMeasuring=MEASURING_CURRENT;
					arrVal[currentVoltage]=adcResult;
					//Отключаем если автомат режим 
					if(arrVal8[automatic] &&						
						(arrVal[currentVoltage]<=arrVal[dischargeVoltage] || arrVal[currentVoltage]>=arrVal[normalVoltage])){
							changeChargeMode(arrVal8);																		
					}			
				break;
				
				case MEASURING_CURRENT:				
					arrVal[currentAmperage]=adcResult;				
					volatile uint8_t normal;
					if(arrVal8[automatic]){
						normal=(arrVal8[charge])?normalAmperage:dischargeAmperage;
						//Изменяем наше текущее значение ШИМ если оно не в норме
						if(arrVal[currentAmperage]!=arrVal[normal]){
							arrVal[currentPWM]=changePWM(arrVal[currentAmperage],arrVal[normal]);
						}
					}
					switchMeasuring=MEASURING_VOLTAGE;								
				break;
			}
			//Смена первым идет измерение напряжение ADC0 - напряжения
			//Потом меняем  на измерение   ADC2 -ток
			SWITCH_ADC_CHANNEL(ADMUX,CHANNEL_CURRENT);
			
			
			_delay_us(250);
			adcResult=0;
			numberMeasure=0;
			StartConvAdc();
		}
		
		
		if(oldCurrentDisplay!=currentDisplay){
			oldCurrentDisplay=currentDisplay;
			setZeroOldValue(arrVal,arrVal8);			
			showCurrentDisplay(currentDisplay);			
		}	
		
		showAndSetValue(currentDisplay,arrVal,arrVal8);
	}
	
	return 0;
}