1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 | #include <stdlib.h>
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 | #define F_CPU 4000000UL
|
7 |
|
8 |
|
9 | volatile char pump=0;
|
10 |
|
11 | ISR(TIMER1_COMP1_vect)
|
12 | {
|
13 | pump=1;
|
14 | }
|
15 |
|
16 | int main(void)
|
17 | {
|
18 | DDRD=0x01; //Ausgang
|
19 | DDRB=0x00; //Eingang
|
20 | PORTB=0b00011111; //Pull Ups aktivieren
|
21 | PORTD=0b00100000;
|
22 | TIMSK|=(1<<OCIE1A); //Timer compare Interrupt enable
|
23 | TCCR1B=(1<<CTC1)|(1<<CS12)|(1<<CS11)|(1<<CS10); //Timer1 automatisch rücksetzten, CLK extern (T1, PD5) steigende Flanke
|
24 |
|
25 | unsigned int vorwahl, neuewahl, i;
|
26 |
|
27 | vorwahl=PINB; //Vorgewählte Stufe
|
28 | neuewahl=vorwahl;
|
29 | while(1)
|
30 | {
|
31 | cli();
|
32 | if(vorwahl==0)
|
33 | {
|
34 | OCR1A=2000; //2000 Umdrehungen = ca.4000m
|
35 |
|
36 | }
|
37 | else if(vorwahl==1)
|
38 | {
|
39 | OCR1A=2250; //2250 Umdrehungen = ca.4500m
|
40 |
|
41 | }
|
42 | else if(vorwahl==2)
|
43 | {
|
44 | OCR1A=2500; //2500 Umdrehungen = ca.5000m
|
45 |
|
46 | }
|
47 | else if(vorwahl==3)
|
48 | {
|
49 | OCR1A=2750; //2750 Umdrehungen = ca.5500m
|
50 |
|
51 | }
|
52 | else if(vorwahl==4)
|
53 | {
|
54 | OCR1A=3000; //3000 Umdrehungen = ca.6000m
|
55 |
|
56 | }
|
57 | else if(vorwahl==5)
|
58 | {
|
59 | OCR1A=3250; //3250 Umdrehungen = ca.6500m
|
60 |
|
61 | }
|
62 | else if(vorwahl==6)
|
63 | {
|
64 | OCR1A=3500; //3500 Umdrehungen = ca.7000m
|
65 |
|
66 | }
|
67 | else if(vorwahl==7)
|
68 | {
|
69 | OCR1A=3750; //3750 Umdrehungen = ca.7500m
|
70 |
|
71 | }
|
72 | else if(vorwahl==8)
|
73 | {
|
74 | PORTD|=(1<<PD0); //diehnt als überprüfung ob die else If Anweisungen durchlaufen werden
|
75 | OCR1A=30; //4000 Umdrehungen = ca.8000m
|
76 |
|
77 | }
|
78 | else if(vorwahl==9)
|
79 | {
|
80 | OCR1A=20;
|
81 | }
|
82 | TCNT1=0; //Timer auf Null setzen
|
83 | sei();
|
84 |
|
85 | while(neuewahl==vorwahl) //Abbruch wenn Vorwahl verändert wird
|
86 | {
|
87 |
|
88 | if(pump==1||(!(PINB & (1<<PINB4)))) //Pumpen wenn INterrupt oder Taster
|
89 | {
|
90 | cli();
|
91 | PORTD|=(1<<PD0);
|
92 | for (i = 0; i < 20; i++)
|
93 | _delay_ms(10);
|
94 | PORTD &=~(1<<PD0);
|
95 | pump=0;
|
96 | sei();
|
97 | }
|
98 | neuewahl=PINB; //neue vorwahl vom Schalter speichern
|
99 | }
|
100 | vorwahl=neuewahl; //vorwahl abgleichen
|
101 | }
|
102 | }
|