1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 |
|
4 | int main(void) {
|
5 | DDRA = 0b00011100; // pin3,4,5 Ausgang (1<<DDA2)(1<<DDA3)(1<<DDA4)
|
6 | PORTA = 0b00000011; // pin1,2 eingang (Pull-up ein) (1<<PA0)(1<<PA1)
|
7 |
|
8 | /* INFO
|
9 | * Taster PA1
|
10 | * Mosfet PA3
|
11 | *
|
12 | * !(PINx & (1<<Pxx)) abfrage
|
13 | * PORTx |= (1<<Pxx) setzen
|
14 | * PORTx &= ~(!<<Pxx) löschen
|
15 | */
|
16 |
|
17 | unsigned int dauer_normal = 5; // Automatische abschaltung in Sekunden
|
18 | unsigned int dauer_lang = 1; // Lange einschaltdauer (taster >3s) in min
|
19 | unsigned int zeit_aus_normal = dauer_normal*1000; // sec umrechnung (Zeit f�r normales ausschalten)
|
20 | unsigned int zeit_aus_lang = dauer_lang * 60 * 1000; // umrechnung dauer lang in millisec
|
21 | unsigned int taster_dauer = 3; // druck dauer in sec
|
22 | unsigned int zeit_taster;
|
23 | unsigned int lange_aktiv = 0;
|
24 | unsigned int prell_dauer = 50; // in msec
|
25 |
|
26 | _delay_ms(500);
|
27 | PORTA |= (1 << PA2); // Lampe nach start an
|
28 |
|
29 | while (1)
|
30 | {
|
31 |
|
32 | if ((PINA & (1 << PINA2)) && !(PINA & (1 << PINA0))) // Lampe an && taster
|
33 | {
|
34 | PORTA &= ~(1 << PA2); // Lampe aus
|
35 | lange_aktiv = 0; // lange ausschaltdauer zuruecksetzen
|
36 | for (uint8_t i=0; i<=prell_dauer; i++) // dauer fuer taster Prellen
|
37 | {
|
38 | if (!(PINA & (1 << PINA0))) // Wenn taster noch Prellt neu warten
|
39 | {
|
40 | i=0; // Neu warten
|
41 | }
|
42 | _delay_ms(1); // Ohne Prellen zaehlen
|
43 | }
|
44 | }
|
45 | else if ((PINA & ~(1 << PINA2)) && !(PINA & (1 << PINA0))) // Lampe aus && taster
|
46 | {
|
47 | PORTA |= (1 << PA2); // Lampe an
|
48 | zeit_aus_normal = dauer_normal*1000; // dauer setzten / zuruecksetzen
|
49 | zeit_aus_lang = dauer_lang * 60 * 1000; // dauer setzten / zuruecksetzen
|
50 | zeit_taster = taster_dauer * 1000; // Dauer fuer langen tasterdruck
|
51 | lange_aktiv = 0; // lange dauer deaktivieren
|
52 | for (uint8_t i=0; i<=prell_dauer; i++) // Entprellen abwarten
|
53 | {
|
54 | // Wenn Taste noch gedrueckt oder prellt, warte laenger.
|
55 | if (!(PINA & (1 << PINA0))) // Prellen oder taster noch aktiv
|
56 | {
|
57 | i=0; // neu warten
|
58 | zeit_taster--; // Taster dauer runterzaehlen
|
59 | if (zeit_taster == 0) // Taster zeit runtergezaehlt
|
60 | {
|
61 | lange_aktiv = 1; // Langes ausschalten aktivieren
|
62 | }
|
63 | }
|
64 | _delay_ms(1); // Ohne Prellen oder tasten betaetigung
|
65 | }
|
66 | }
|
67 |
|
68 | else if (((zeit_aus_normal == 0) || (zeit_aus_lang == 0))
|
69 | && (PINA & (1 << PINA0))) // wenn Zeit abgelaufen && Licht an
|
70 | {
|
71 | PORTA &= ~(1 << PA2); // Lampe ausschalten nach zeitdauer
|
72 | }
|
73 |
|
74 | else // wenn nicht gedrueckt wird ausfuehren
|
75 | {
|
76 | if ((PINA & (1 << PINA2)) && !(lange_aktiv)) // wenn die lampe an ist Zeit runterzaehlen
|
77 | {
|
78 | zeit_aus_normal--;
|
79 | _delay_ms(1); // je 1ms runterzaehlen
|
80 | }
|
81 | else if ((PINA & (1 << PINA2)) && (lange_aktiv)) // wenn lampe an und lang aktiv
|
82 | {
|
83 | zeit_aus_lang--;
|
84 | _delay_ms(1);
|
85 | }
|
86 | }
|
87 | }
|
88 | }
|