Klingel.c


1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
volatile uint8_t sekunden;
7
8
9
ISR(EXT_INT0_vect)
10
{
11
   sekunden = 0x00; 
12
}
13
14
15
int main(void)
16
{
17
18
  //Ein - Ausgänge Definieren
19
  DDRB |= (1 << DDB1)|(1 << DDB0); //Pin B1 als Ausgang definieren (Klingel Lager),Pin B0 als Ausgang definieren (Klingel oben)
20
  PORTB |= (1<<PB2); //Pin B2 (Schalter innen) Pull-Up Wiederstand aktivieren
21
  PORTA |= (1<<PA0) | (1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7); //Dippschalter für die Zeiteinstellung Pull-Up Wiederstand; A7 (Taster außen); aktivieren  
22
23
//Externer Interupt
24
25
//GIMSK |= (1<<INT0);
26
//sei(); //Interrupt starten  
27
28
29
30
  while (1)
31
  {
32
33
  sekunden = ~PINA & 0b01111111;   //Lese Pins an Port A in Variable ein
34
  
35
    if ( !(PINA & (1<<PINA7)) )  //Schalter außen gedrückt?
36
    {
37
      _delay_ms(10);
38
      
39
      if ( !(PINA & (1<<PINA7)) )  //Schalter außen gedrückt?
40
      {
41
        GIMSK |= (1<<INT0);  
42
        sei(); //Interrupt starten  
43
        PORTB |= (1<<PB1);    //Klingel unten an
44
        _delay_ms(200);
45
        PORTB &= ~(1<<PB1);    //Klingel unten aus
46
        _delay_ms(790);
47
        uint8_t i;
48
        for (i = 0; i < sekunden; i++)
49
        {
50
          if ((i==10)|(i==20)|(i==30)|(i==40)|(i==50)|(i==60)|(i==70)|(i==80)|(i==90)|(i==100)|(i==120))  //alle 10 Sekunden unten Klingeln
51
          {
52
            PORTB |= (1<<PB1);  //Klingel unten an
53
            _delay_ms(200);
54
            PORTB &= ~(1<<PB1);  //Klingel unten aus
55
            _delay_ms(800);
56
            i++;            
57
          }
58
          if(i==(sekunden-1))    //Zeit um?
59
          {
60
            PORTB |= (1<<PB0);  //Klingel oben an
61
            _delay_ms(200);
62
            PORTB &= ~(1<<PB0);  //Klingel oben aus
63
            _delay_ms(400);
64
            PORTB |= (1<<PB0);  //Klingel oben an
65
            _delay_ms(200);
66
            PORTB &= ~(1<<PB0);  //Klingel oben aus
67
            _delay_ms(500);
68
          }    
69
70
        _delay_ms(500);
71
        _delay_ms(500);
72
        }
73
      cli();             // Interrupts global deaktivieren
74
      GIMSK &= ~(1<<INT0);  
75
      }
76
    }
77
    
78
    if ( !(PINB & (1<<PINB2)) )  //Schalter außen gedrückt?
79
    {
80
      _delay_ms(50);
81
      if ( !(PINB & (1<<PINB2)) )  //Schalter außen gedrückt?
82
      {
83
        PORTB |= (1<<PB0);  //Klingel oben an
84
        _delay_ms(150);
85
        PORTB &= ~(1<<PB0);  //Klingel oben aus
86
        _delay_ms(400);
87
        PORTB |= (1<<PB0);  //Klingel oben an
88
        _delay_ms(250);
89
        PORTB &= ~(1<<PB0);  //Klingel oben aus
90
        _delay_ms(500);
91
        _delay_ms(500);
92
      }
93
    }
94
  }
95
}