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