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; }
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; }