Sunteți pe pagina 1din 17

Anexe

Anexa 2 Chip type Program type : ATmega64 : Application

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

// Declare your global variables here float adc_in,A[10]; int tipul=0,temperatura=0,turatii=3,suplimentar=0,timpul=0,t;

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 timp() {PORTC=timpul/60; //pe primu indicator se afiseaza 1 cifra

PORTB=((timpul%60)/10)+(((timpul%60)%10)*16);}//pe urmatoarele indicatoare se afiseaza inca 2 cifre

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

void fsuplimentar() {int n1=5,n2,i; while(n1>0) //rotim intr-0 directie

{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

void spala() {int timpul1=0,flag=0,n,i,t=50; timpul1=timpul; if(suplimentar==2||suplimentar==3) timpul1=timpul-10;

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

if(flag==1) //sau in alta directie {i=192; while(n>0) {PORTC=timpul/60+i; i=i/2;

if(i==6) {i=192;n--;} delay_ms(t);}}

timpul--; //micsoram timpul global timpul1--;}} //micsoram timpul pe spalare

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(tipul==1) {temperatura=60;turatii=1000;timpul=155;} if(tipul==2) {temperatura=40;turatii=800;timpul=85;} if(tipul==3) {temperatura=30;turatii=400;timpul=30;}}

//caracteristicile spalarii pentru toate tipurile if(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;}

if(suplimentar==1) {timpul=timpul+10;suplimentar=2;} if(suplimentar==0) {timpul=timpul+10;suplimentar=1;}}

//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);

PORTD=1; if(suplimentar==1) PORTE=30; if(suplimentar==2) PORTE=29; if(suplimentar==3) PORTE=28; delay_ms(2.5);

timp();}//afisam timpul pe indicatoare

PORTA=128;//inchidem zavorul delay_ms(250);

toarnaapa(); timp();

if(suplimentar==1||suplimentar==3) //daca sa ales 1 functie suplimentara atunci se spala preventiv {t=50;fsuplimentar();}

spala(); //functia de spalare haine

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

if(suplimentar==2||suplimentar==3) //functia suplimentara de scurgere {t=10000/turatii;fsuplimentar();}

while(PINA.5==1) //pompam apa din masina de spalat {PORTE=127; delay_ms(250);}

PORTA=16;}} //deschidem zavorul si pornim butoanele

S-ar putea să vă placă și