1 | #include <avr/io.h>
|
2 | #include <inttypes.h>
|
3 | #include <util/twi.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <stdint.h>
|
6 |
|
7 | #include "twislave.h"
|
8 |
|
9 |
|
10 | #define SLAVE_ADRESSE 0x50 //Die Slave-Adresse
|
11 |
|
12 | // Variablen
|
13 |
|
14 | //Variablen für die Zeit
|
15 | volatile unsigned int millisekunden;
|
16 | volatile unsigned int sekunde;
|
17 | volatile unsigned int minute;
|
18 | volatile unsigned int stunde;
|
19 | volatile unsigned int alarmledinterval = 1500; // Zeit in ms
|
20 | volatile unsigned int alarmledtime = 20; // Zeit in ms
|
21 | volatile unsigned int alarmledtimer;
|
22 |
|
23 | // DDRC &= ~( 1 << DDC2 ); // Eingang
|
24 | // DDRC |= ( 1 << DDC2 ); // Ausgang
|
25 |
|
26 |
|
27 | // ###### ADC ######
|
28 | uint16_t readADC(uint8_t channel) {
|
29 | uint8_t i;
|
30 | uint16_t result = 0;
|
31 | ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);
|
32 | ADMUX = channel | (0<<REFS1) | (0<<REFS0);
|
33 | ADCSRA |= (1<<ADSC);
|
34 | while(ADCSRA & (1<<ADSC));
|
35 | for(i=0; i<3; i++) {
|
36 | ADCSRA |= (1<<ADSC);
|
37 | while(ADCSRA & (1<<ADSC));
|
38 | result += ADCW;
|
39 | }
|
40 | ADCSRA &= ~(1<<ADEN);
|
41 | result /= 3;
|
42 | return result;
|
43 | }
|
44 |
|
45 | // ###### Heberschalter Strom ######
|
46 |
|
47 | void heberschalterstrom_an(void) { PORTC |= (1<<PC2); }
|
48 | void heberschalterstrom_aus(void) { PORTC &= ~(1<<PC2); }
|
49 |
|
50 | // ###### Tür LEDs Strom ######
|
51 |
|
52 | void tuerled_an(void) { PORTB |= (1<< PB1); }
|
53 | void tuerled_aus(void) { PORTB &= ~(1<<PB1); }
|
54 |
|
55 | // ###### Fensterheber Hoch/Runter ######
|
56 |
|
57 | void motor_links_aus(void)
|
58 | {
|
59 | PORTD &= ~(1<<PD0 );
|
60 | PORTD &= ~(1<<PD1 );
|
61 | }
|
62 |
|
63 | void motor_links_runter(void) { PORTD |= (1<<PD0); }
|
64 | void motor_links_hoch(void) { PORTD |= (1<<PD1); }
|
65 | void motor_rechts_aus(void)
|
66 | {
|
67 | PORTD &= ~(1<<PD2);
|
68 | PORTD &= ~(1<<PD3);
|
69 | }
|
70 |
|
71 | void motor_rechts_runter(void) { PORTD |= (1<<PD2); }
|
72 | void motor_rechts_hoch(void) { PORTD |= (1<<PD2); }
|
73 |
|
74 | // ###### ######
|
75 |
|
76 | int main(void) {
|
77 |
|
78 | // Slave I2C Adresse setzen
|
79 | init_twi_slave(SLAVE_ADRESSE);
|
80 |
|
81 | for(uint8_t i = 0; i < I2C_BUFFER_SIZE; i++) { i2cdata[i] = 0; }
|
82 |
|
83 | // Ein / Ausgänge setzen
|
84 | DDRB |= (1<<PB1); // Tür LED AUSGANG
|
85 |
|
86 | DDRD |= (1<<PD0); // Heber Links Runter AUSGANG
|
87 | DDRD |= (1<<PD1); // Heber Links Hoch AUSGANG
|
88 | DDRD |= (1<<PD2); // Heber Rechts Runter AUSGANG
|
89 | DDRD |= (1<<PD3); // Heber Rechts Hoch AUSGANG
|
90 |
|
91 | DDRC |= (1<<PC2); // Heber Schalter Strom AUSGANG
|
92 |
|
93 | DDRC &= ~(1<<PC1); // Heberschalter Links Runter EINGANG
|
94 | DDRC &= ~(1<<PC0); // Heberschalter Links Hoch EINGANG
|
95 | DDRB &= ~(1<<PB4); // Heberschalter Rechts Runter EINGANG
|
96 | DDRB &= ~(1<<PB5); // Heberschalter Rechts Hoch EINGANG
|
97 |
|
98 | // I2C Data Standartwerte
|
99 |
|
100 | i2cdata[0] = 1; // Zündung
|
101 | i2cdata[4] = 1000; // Fotowiderstandswert
|
102 |
|
103 | // Timer konfigurieren
|
104 | OCR1A = 125-1;
|
105 | TCCR1B |= (1 << WGM12);
|
106 | TIMSK |= (1 << OCIE1A);
|
107 | TCCR1B |= (1 << CS01);
|
108 | sei();
|
109 |
|
110 | while(1)
|
111 | {
|
112 | // Zündung prüfen
|
113 |
|
114 | if (i2cdata[0] == 0)
|
115 | {
|
116 | // Fotowiderstand einlesen alle 15sek
|
117 | if (sekunde%15) { i2cdata[4] = readADC(3); }
|
118 |
|
119 | // Alarm LEDs aus
|
120 |
|
121 | // Fensterheberschalter einschalten
|
122 | tuerled_an();
|
123 | heberschalterstrom_an();
|
124 | }
|
125 | else
|
126 | {
|
127 | tuerled_aus();
|
128 | heberschalterstrom_aus();
|
129 | }
|
130 |
|
131 |
|
132 | }
|
133 |
|
134 | }
|
135 |
|
136 | ISR (TIMER1_COMPA_vect)
|
137 | {
|
138 | millisekunden++;
|
139 | if(millisekunden == 1000)
|
140 | {
|
141 | sekunde++;
|
142 | i2cdata[0] = 1;
|
143 | millisekunden = 0;
|
144 | if(sekunde == 60)
|
145 | {
|
146 | minute++;
|
147 | sekunde = 0;
|
148 | }
|
149 | if(minute == 60)
|
150 | {
|
151 | stunde++;
|
152 | minute = 0;
|
153 | }
|
154 | if(stunde == 24)
|
155 | {
|
156 | stunde = 0;
|
157 | }
|
158 | }
|
159 | }
|