Documente Academic
Documente Profesional
Documente Cultură
AVR Core Clock frequency: 8,000000 MHz Memory model External RAM size Data Stack size : Small :0 : 1024
*****************************************************/
#include <mega64.h> //biblioteca microcontrolerului #include <delay.h> //biblioteca pentru intrerupere #define ADC_VREF_TYPE 0x00 //tensiunea de referinta pentru adc
// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) {ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW;}
void masurare() {int i=0; while(i<9) //atita timp cit nu sau luat 9 masurari se face masurarea {adc_in=read_adc(0); //citim tensiunea de pe canalul 0 A[i]=adc_in*40; o adresa i++; delay_ms(10); };} //incrimentam adresa //facem intrerupere //convertam tensiunea in digitala si o salvam in masiv pe
void aranjare() {//aranjarea masivului prin metoda bulelor int j=0,i=0; float buff; for(i=0;i<9;i++) {for(j=i;j<9;j++) {if(A[i]>A[j]) //daca cifra din masiv ii mai mare ca cifra din alt masiv se face schimbarea lor {buff=A[i]; //schimbarea cifrelor cu ajutorul unei variabile adaugatoare A[i]=A[j]; A[j]=buff; }; }; }; }
void toarnaapa() {bit k=0; int n,i; while(PINA.5==0) //cit timp senzorul nu este actionat se toarna apa {PORTE=159; //se deschide clapanul delay_ms(2000); // turnam putina apa n=60; if(k==0) //efectuam 6 impulsuri pentru o rotatie {i=12; while(n<61) {PORTC=timpul/60+i; i=i*2; if(i==384) {i=12;n--;} delay_ms(50);} k=1;} if(k==1) //rotim in alta directie {i=192; while(n<61) {PORTC=timpul/60+i; i=i/2; if(i==6) {i=192;n--;} delay_ms(300);} k=0;}}timpul--;} //micsoram timpul
{i=12;n2=1201; while(n2>0) {PORTC=timpul/60+i; //afisam timpul si creem impuls i=i*2; if(i==384) {i=12;n2--;} delay_ms(t);} este mai mare timpul--; i=192;n2=1201; while(n2>0) //rotim in alta directie {PORTC=timpul/60+i; i=i/2; if(i==6) {i=192;n2--;} delay_ms(t);} timpul--; n1--;}} //de 5 ori se roteste intr-o directie si de 5 in alta //cu o anumita viteza, cu cit timpul este mai mic cu atit viteza
while(timpul1>0) //cit timpul este mai mare ca 0 au loc operatiile de mai jos
{masurare(); //masuram temperatura, 9 masurari aranjare(); // filtram datele masurarii if(temperatura==((A[3]+A[4]+A[5])/3)) //aflam media la 3 masurari, in caz ca temperatura este mai mica ca cea indicata PORTA=128; //pornim TEN else PORTA=192; //in alt caz oprim TEN
timp(); //Afisam timpul if(timpul1%5==0) //la fiecare 5 minute schimbam directia {if(flag==0) flag=1; else flag=0;}
n=1201;
if(flag==0) //rotim intr-o directie {i=12; while(n>0) {PORTC=timpul/60+i; i=i*2; if(i==384) {i=12;n--;} delay_ms(t);}}
void main(void) { // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x1F; DDRA=0xC0; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0xFF; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0xFF; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00;
DDRD=0xFF; // Port E initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTE=0x00; DDRE=0xFF; // Port F initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTF=0x00; DDRF=0x00; // Port G initialization // Func4=In Func3=In Func2=In Func1=In Func0=In // State4=T State3=T State2=T State1=T State0=T PORTG=0x00; DDRG=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected ASSR=0x00; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF
// OC1A output: Discon. // OC1B output: Discon. // OC1C output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; OCR1CH=0x00; OCR1CL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected TCCR2=0x00; TCNT2=0x00;
OCR2=0x00; // Timer/Counter 3 initialization // Clock source: System Clock // Clock value: Timer3 Stopped // Mode: Normal top=0xFFFF // OC3A output: Discon. // OC3B output: Discon. // OC3C output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer3 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off // Compare C Match Interrupt: Off TCCR3A=0x00; TCCR3B=0x00; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; OCR3CH=0x00; OCR3CL=0x00; // External Interrupt(s) initialization // INT0: Off
// INT1: Off // INT2: Off // INT3: Off // INT4: Off // INT5: Off // INT6: Off // INT7: Off EICRA=0x00; EICRB=0x00; EIMSK=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; ETIMSK=0x00; // USART0 initialization // USART0 disabled UCSR0B=0x00; // USART1 initialization // USART1 disabled UCSR1B=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 1000,000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83;
// SPI initialization // SPI disabled SPCR=0x00; // TWI initialization // TWI disabled TWCR=0x00;
while (1) {// Place your code here while(tipul==0||PINA.4==1) //selectam tipul spalarii si asteptam tastarea butonului start {PORTD=0; PORTE=31; delay_ms(2.5); if(PINA.0==0) //cu primul buton se alege tipul {delay_ms(250); tipul++; if(tipul==4) tipul=1;
{if(PINA.1==0)//daca se tasteaza butonul 2 se schimba temperatura {if(temperatura==95) temperatura=20; if(temperatura==60) temperatura=95; if(temperatura==40) temperatura=60; if(temperatura==30) temperatura=40; if(temperatura==20) temperatura=30;} if(PINA.2==0)//daca se tasteaza butonul 3 se schimba turatiile {if(turatii==1000) turatii=0; if(turatii==800) turatii=1000; if(turatii==400) turatii=800; if(turatii==1) turatii=400; if(turatii==0) turatii=1;}} if(tipul==2) {if(PINA.1==0) {if(temperatura==60) temperatura=20; if(temperatura==40) temperatura=60; if(temperatura==30)
temperatura=40; if(temperatura==20) temperatura=30;} if(PINA.2==0) {if(turatii==800) turatii=0; if(turatii==400) turatii=800; if(turatii==1) turatii=400; if(turatii==0) turatii=1;}} if(tipul==3&&PINA.2==0) {if(turatii==1000) turatii=0; if(turatii==800) turatii=1000; if(turatii==400) turatii=800; if(turatii==1) turatii=400; if(turatii==0) turatii=1;} if(tipul<4&&PINA.3==0)//se aleg functii suplimentare, spalare preventiva si "otjim-scurge apa" {if(suplimentar==3)//0 nu se face nimic, 1-este spalare preventiva, 2 scurge apa, 3 si spalare si scurgere {timpul=timpul-20;suplimentar=0;} if(suplimentar==2) {timpul=timpul+20;suplimentar=3;}
//aprindem ledurile in functie de tipul spalarii, temperatura, turatii, suplimentar PORTD=8; if(tipul==1) PORTE=30; if(tipul==2) PORTE=29; if(tipul==3) PORTE=27; delay_ms(2.5);
PORTD=4; if(temperatura==20) PORTE=30; if(temperatura==30) PORTE=29; if(temperatura==40) PORTE=27; if(temperatura==60) PORTE=23; if(temperatura==95) PORTE=15; delay_ms(2.5);
PORTD=2;
if(turatii==0) PORTE=30; if(turatii==1) PORTE=29; if(turatii==400) PORTE=27; if(turatii==800) PORTE=23; if(turatii==1000) PORTE=15; delay_ms(2.5);
toarnaapa(); timp();
if(turatii>1) //daca sa ales scurgere de apa pentru haine , se efecuiaza aceasta functie suplimentara {t=10000/turatii;fsuplimentar();} if(turatii==1) //daca dorim sa scoatem hainele si sa scurgem altele, se deschide zavorul si se asteapta tastarea butonului start {while(PINA.5==1) {PORTE=127; delay_ms(250);} PORTA=31; while(PINA.4==1) {} PORTA=128;}