Kette.c


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
}