#include <avr/io.h> #include <avr/interrupt.h> #include <avr/eeprom.h> unsigned char display_on, registr, butt1,butt2,butt3, butt3s, zamer,rezhim,mode,param,params, edit, redit, blink, wait2, wait3, wait5, wait6, wait7, rdisp, encoder_r, encoder_l, right, left, prewmode; unsigned char ind[4],tempvar, tempmem; float measureint, voltage_ADC,tmp; unsigned int stop_h, stop_m, pwm_d, measure, pmeasure; int pwm,tempch; //unsigned int voltage_ADC; unsigned char param1[10]; unsigned char param1eeprom[10] EEMEM; uint16_t tempset,measure; uint16_t tem EEMEM; unsigned char pwm_m[455] EEMEM; ISR (TIMER0_OVF_vect) { if(display_on==1) { PORTB |= (1 << PB6); PORTD |= (1 << PD7); PORTD |= (1 << PD3); PORTC |= (1 << PC2); PORTB &=~ (1 << PB0); //1 PORTC &=~ (1 << PC1); //2 PORTD &=~ (1 << PD4); //3 PORTD &=~ (1 << PD2); //4 PORTD &=~ (1 << PD5); //5 PORTB &=~ (1 << PB7); //6 PORTD &=~ (1 << PD6); //7 } if(display_on==37) { if(ind[registr]==0 || ind[registr]==6 || ind[registr]==9) {display_on=display_on+20;} //6 if(ind[registr]==2 || ind[registr]==3 || ind[registr]==5 || ind[registr]=='P') {display_on=display_on+25;} //5 if(ind[registr]==4 || ind[registr]=='g') {display_on=display_on+35;} //4 if(ind[registr]==7) {display_on=display_on+40;} // 3 if(ind[registr]==1) {display_on=display_on+45;} //2 if(ind[registr]=='-') {display_on=display_on+50;} //2 if(registr==0) { PORTB &=~ (1 << PB6);} if(registr==1) { PORTD &=~ (1 << PD3);} if(registr==2) { PORTC &=~ (1 << PC2);} if(registr==3) { PORTD &=~ (1 << PD7);} if (ind[registr]==0) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7);}//0 if (ind[registr]==1) {PORTD |= (1 << PD2);PORTD |= (1 << PD5);}//1 if (ind[registr]==2) {PORTB |= (1 << PB0);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//2 if (ind[registr]==3) {PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//3 if (ind[registr]==4) {PORTC |= (1 << PC1);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTD |= (1 << PD6);}//4 if (ind[registr]==5) {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//5 if (ind[registr]==6) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//6 if (ind[registr]==7) {PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);}//7 if (ind[registr]==8) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//8 if (ind[registr]==9) {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}//9 if (ind[registr]=='P') {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD6);}//P if (ind[registr]=='g') {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2); PORTD |= (1 << PD6);}//g if (ind[registr]=='-') {PORTD |= (1 << PD6);}//- if (ind[registr]=='F') {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4); PORTD |= (1 << PD6);}//F if (ind[registr]=='n') {PORTB |= (1 << PB0);PORTD |= (1 << PD5); PORTD |= (1 << PD6);}//n registr++; if (registr>3){registr=0;} } display_on++; if (display_on>100){display_on=1;blink++; if(blink>250){blink=0;} ADCSR |= (1<<ADSC);} if(blink==250){wait2++; if(wait2>250){wait2=0;}} if(wait2==250){wait3++; if(wait3>250){wait3=251;}; butt3s++; if(butt3s>250){butt3s=251;}; wait5++;wait6++;} if(wait3==3 && mode==1){mode=0;} if(wait5==20){wait5=0;} if(wait5==51){wait5=0;} if(wait5==50){wait6++; if(wait6==250){wait6=0;};if(wait6==param1[3]){rezhim=0;}} } void init_pwm (void) { TCCR1A|=(1<<COM1A0); TCCR1A|=(1<<COM1A1); TCCR1B|=(1<<CS10); //TCCR1A|=(1<<WGM10); TCCR1A|=(1<<WGM11); //TCCR1B|=(1<<WGM12); TCCR1B|=(1<<WGM13); // OCR1A=27000; //OCR1B=10000; // 0 200/170 250/215 ICR1=27000; } ISR (ADC_vect)// { voltage_ADC = voltage_ADC+ADCW;// if (zamer==100) { measureint=voltage_ADC/zamer; measure=measureint*param1[2]/100; if(rezhim==1) { if(mode==0) { if(param1[0]>0) {ind[0]=measure/100;ind[1]=measure%100/10;ind[2]=measure%10;ind[3]='g';} if(param1[0]==0) { if(tempset<100){ind[0]=-1;} else {ind[0]=tempset/100;} if(tempset<10) {ind[1]=-1;} else {ind[1]=tempset%100/10;} ind[2]=tempset%10;ind[3]='g'; } } if(mode==1) { if(blink<170) {if(tempset<100){ind[0]=-1;} else {ind[0]=tempset/100;} if(tempset<10) {ind[1]=-1;} else {ind[1]=tempset%100/10;} ind[2]=tempset%10;ind[3]='g'; } if(blink>170){ind[0]=-1;ind[1]=-1;ind[2]=-1;ind[3]=-1;} } } if(tempmem==0) { if(wait5==10)//5=10 { if(tempch==0 && tempset==measure && eeprom_read_byte(&pwm_m[tempset])!=pwm) {eeprom_write_byte(&pwm_m[tempset],pwm); tempmem=1; ind[0]='g';ind[1]='g';ind[2]='g';} if(tempset!=measure) { pwm_d=tempset-measure; pwm=pwm+pwm_d; } wait5=0;tempch=0; } if(pmeasure<measure && tempset<measure) // { pwm_d=measure-tempset; tempch++; pwm=pwm-pwm_d; pmeasure=measure; } if(pmeasure>measure && tempset>measure) // { pwm_d=tempset-measure; tempch++; pwm=pwm+pwm_d*measure/100; pmeasure=measure; } } if(wait5==10 && tempmem==1)//5=10 { if(tempset<measure){pwm=pwm-1;} if(tempset>measure){pwm=pwm+1;} if(tempset==measure && eeprom_read_byte(&pwm_m[tempset])>pwm && eeprom_read_byte(&pwm_m[tempset])-pwm>5){eeprom_write_byte(&pwm_m[tempset],pwm);} if(tempset==measure && eeprom_read_byte(&pwm_m[tempset])>pwm && eeprom_read_byte(&pwm_m[tempset])-pwm>5){eeprom_write_byte(&pwm_m[tempset],pwm);} wait5=0; if(tempset==measure && tempmem==1 && (int)(voltage_ADC*param1[2]/100)%zamer<50){tmp=tmp-10;} if(tempset==measure && tempmem==1 && (int)(voltage_ADC*param1[2]/100)%zamer>50){tmp=tmp+10;} } if(pwm>250){pwm=250;} if(pwm<0){pwm=0;} if(tempset-10>measure && tempmem==1){OCR1A=0;wait5=0;wait6=0;} else {OCR1A=27000+tmp-pwm*108;} voltage_ADC=0;zamer=0; } zamer++; if (rezhim!=1) {OCR1A=27000;} if (measure>480) {OCR1A=27000;rezhim=0;OCR1A=27000;} //ADCSR |= (1<<ADSC);// } // int main(void) { TIMSK |= (1 << TOIE0); // 2 TCCR0|=(0<<CS02)|(1<<CS00); init_pwm(); // //ads ADMUX|= (1<<REFS0); // ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); sei(); // PORTB=0b00000000; PORTC=0b00101000; PORTD=0b00000001;// DDRB=0b11111111; DDRC=0b11010110; DDRD=0b11111110; butt1=0;butt2=0;butt3=0;rezhim=0;mode=0;params=0;edit=0;redit=0;blink=0;tempmem=0;tempch=0; encoder_l=40; encoder_r=0; right=0; left=0;butt3s=0;wait3=0;wait2=0;mode=0;prewmode=0;pwm_d=0; tempset = eeprom_read_word(&tem); if(tempset>500){tempset=100;} param1[0] = eeprom_read_byte(¶m1eeprom[0]); if(param1[0]>1){param1[1]=1;} param1[1] = eeprom_read_byte(¶m1eeprom[1]); if(param1[1]>10){param1[1]=5;} param1[2] = eeprom_read_byte(¶m1eeprom[2]); if(param1[2]>250){param1[2]=75;} param1[3] = eeprom_read_byte(¶m1eeprom[3]); if(param1[3]>250){param1[3]=10;} pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;} while (1) // { if(tempset<100){tempset=100;} if(tempset>450){tempset=450;} // if ((PINC&(1<<PC5))==0x00){butt1++; if(butt1>200){butt1=201;}} else {butt1=0;} if(butt1==200 && rezhim==0){butt3s=0; rezhim=1; butt1=201;} if(butt1==200 && rezhim==1){butt3s=0; rezhim=0; butt1=201;} if(butt1==200) {butt3s=0;} if (butt1==201 && butt3s==2 && rezhim!=2){rezhim=2;butt3s=10;} if (butt1==201 && butt3s==2 && rezhim==2){rezhim=0;butt3s=10;} // if ((PIND&(1<<PD0))==0x00){butt2++; if(butt2>encoder_l){butt2=encoder_l+1;}} else {butt2=0;} if ((PINC&(1<<PC3))==0x00){butt3++; if(butt3>encoder_l){butt3=encoder_l+1;}} else {butt3=0;} if(right==1 || left==1){right=0; left=0;} if(encoder_r==0) { if(butt2==encoder_l+1 && butt3==encoder_l) {encoder_r=encoder_l*5;mode=1;wait3=0;right=1;} if(butt3==encoder_l+1 && butt2==encoder_l) {encoder_r=encoder_l*5;mode=1;wait3=0;left=1;} } if(encoder_r==0){encoder_r=1;} encoder_r--; if(mode!=prewmode){prewmode=mode; eeprom_write_word(&tem, tempset);} if(rezhim==0) { if(blink<170){ind[0]=-1; ind[1]=-1; ind[2]=-1; ind[3]=-1;} if(blink>170){ind[0]='-'; ind[1]='-'; ind[2]='-'; ind[3]='-';} } if(rezhim==1) { if(right==1) {tempset=tempset+param1[1];pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;tmp=0;}else{tempmem=0;pwm=1;tmp=0;} } if(left==1){tempset=tempset-param1[1];pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;tmp=0;}else{tempmem=0;pwm=1;tmp=0;} } } if(rezhim==2) { if(butt1==200){if(edit==0){edit=1;tempvar=-1;} else {edit=0; eeprom_write_byte(¶m1eeprom[params], param1[params]);} } if(edit==0) { ind[0]='P'; ind[1]=params; ind[2]=-1; ind[3]=-1; if(right==1){params++;}; if(left==1){params--;} if(params<0){params=0;}; if(params>3){params=3;} } if(edit==1) { if(blink==1 || tempvar!=param1[params]) { if(param1[params]<100){ind[0]=-1;} else {ind[0]=param1[params]/100;} if(param1[params]<10) {ind[1]=-1;} else {ind[1]=param1[params]%100/10;} ind[2]=param1[params]%10; } if(blink>170){ind[0]=-1;ind[1]=-1;ind[2]=-1;ind[3]=-1;} tempvar=param1[params]; if(right==1){param1[params]++;};if(left==1){param1[params]--;} if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=1;} if(params==0) {if(param1[params]<0){param1[params]=0;} if(param1[params]>1){param1[params]=1;}} if(params==1) {if(param1[params]<1){param1[params]=1;} if(param1[params]>50){param1[params]=50;}} if(params==2) {if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=250;}} if(params==3) {if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=250;}} } } } //loop } //main
Source: https://habr.com/ru/post/392507/
All Articles