1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <inttypes.h>
|
4 |
|
5 |
|
6 | // Abfragemakro
|
7 | //#define BLUETOOTH_STATUS_AKTIV() (!(PIND & _BV(PD2))) // Abfrage Bluetooth-Signal
|
8 | #define SCHALTER_LS() (!(PIND & _BV(PD7))) // Abfrage Schalter Lautsprecher eingeschaltet
|
9 |
|
10 | // Aktionsmakro
|
11 | #define ROTE_LED_AN() { PORTC |= _BV(PC3); } // rote LED ein -> 3.3V
|
12 | #define ROTE_LED_AUS() { PORTC &= ~_BV(PC3); } // rote LED aus -> 0V
|
13 |
|
14 | #define GELBE_LED_AN() { PORTC |= _BV(PC1); } // gelbe LED ein -> 3.3V
|
15 | #define GELBE_LED_AUS() { PORTC &= ~_BV(PC1); } // gelbe LED aus -> 0V
|
16 |
|
17 | #define GRUENE_LED_AN() { PORTC |= _BV(PC2); } // grüne LED ein -> 3.3V
|
18 | #define GRUENE_LED_AUS() { PORTC &= ~_BV(PC2); } // grüne LED aus -> 0V
|
19 |
|
20 | #define BLAUE_LED_AN() { PORTC |= _BV(PC0); } // blaue LED ein -> 0V
|
21 | #define BLAUE_LED_AUS() { PORTC &= ~_BV(PC0); } // blaue LED aus -> 5V
|
22 |
|
23 | #define LS_AN() { PORTB |= _BV(PB1); } // grüne LED ein -> 3.3V
|
24 | #define LS_AUS() { PORTB &= ~_BV(PB1); } // grüne LED aus -> 0V
|
25 |
|
26 | #define LED_LS_AN() { PORTB |= _BV(PB0); } // LED Lautsprecher an -->5V
|
27 | #define LED_LS_AUS() { PORTB &= ~_BV(PB0); } // LED Lautsprecher aus --> 0V
|
28 |
|
29 | #define RELAIS_AN() { PORTD |= _BV(PD4); } // Relais an -->5V
|
30 | #define RELAIS_AUS() { PORTD &= ~_BV(PD4); } // Relais aus --> 0V
|
31 |
|
32 | #define LEUCHT_ROT_AN() { PORTD |= _BV(PD5); } // Leuchtmodul "rot" an -->5V
|
33 | #define LEUCHT_ROT_AUS() { PORTD &= ~_BV(PD5); } // Leuchtmodul "rot" aus --> 0V
|
34 |
|
35 | #define LEUCHT_GRUEN_AN() { PORTD |= _BV(PD6); } // Leuchtmodul "grün" an -->5V
|
36 | #define LEUCHT_GRUEN_AUS() { PORTD &= ~_BV(PD6); } // Leuchtmodul "grün" aus --> 0V
|
37 |
|
38 | #define LEUCHT_BLAU_AN() { PORTC |= _BV(PC4); } // Leuchtmodul "blau" an -->5V
|
39 | #define LEUCHT_BLAU_AUS() { PORTC &= ~_BV(PC4); } // Leuchtmodul "blau" aus --> 0V
|
40 |
|
41 |
|
42 | //Variablen Deklaration
|
43 | volatile uint8_t u8_blau = 0; // Variable für die blaues Signal
|
44 | volatile uint8_t u8_rot = 0; // Variable für die rotes Signal
|
45 | volatile uint8_t u8_gelb = 0; // Variable für die gelbe LED
|
46 | volatile uint8_t u8_gruen = 0; // Variable für die grünes Signal
|
47 | volatile uint8_t u8_Lautsprecher = 0; // Variable für den Lautsprecher
|
48 | volatile uint8_t u8_Empfang = 0; // Empfangsdaten
|
49 | volatile uint8_t u8_timer = 0; // Taktzähler
|
50 | volatile uint16_t u16_timer2 = 0; // Tondauer "frei"
|
51 | volatile uint16_t u16_timer1 = 0; // Tondauer "Störung"
|
52 | //volatile uint32_t u32_timer_bluetooth = 0; // Timer für Bluetoothstatus
|
53 | // Variable für die Tonausgabe "frei"
|
54 | volatile uint16_t u8_Tonausgabe1 = 0;
|
55 | // Variable für die Tonausgabe "belegt"
|
56 | volatile uint16_t u8_Tonausgabe2 = 0;
|
57 | // Variable, die den letzten Zustand von "gelb" speichert
|
58 | volatile uint8_t u8_letztes_gelb = 0;
|
59 | // Variable, welche angibt ob Bluetoothmodule verbunden
|
60 | volatile uint8_t u8_b_aktiv = 0;
|
61 |
|
62 | // Initialisierung USART
|
63 | //#define F_CPU 16000000ULL // Frequenz vom Mikrocontroller 16MHz
|
64 | #define BAUD 9600UL // Baudrate
|
65 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
66 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
67 | #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
|
68 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
69 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
70 | #endif
|
71 |
|
72 | // Funktionprototypen
|
73 | void USART_Init( unsigned int ubrr); // Prototyp initialisierung
|
74 |
|
75 | // Hauptprogramm
|
76 | int main(void)
|
77 | {
|
78 | TCCR0B |= _BV(CS01) | _BV(WGM01); // prescaler 1600000/64 = 15625
|
79 | OCR0A = 99; // 124 Schritte für 1ms
|
80 | TIMSK0 |= _BV(OCIE0B); // Freischaltung
|
81 |
|
82 | TCCR0A = _BV(WGM00); // PWM phase correct mode
|
83 | TCCR0B = _BV(CS10) | _BV(CS11); // clock select clk/64
|
84 | ICR1 = 0xFF; // Endwert Counter
|
85 |
|
86 | // OC0A als PWM-Port setzen
|
87 | TCCR1A |= _BV(COM0A1);
|
88 | OCR0A = 0;
|
89 |
|
90 | // OC0B als PWM-Port setzen
|
91 | TCCR1B |= _BV(COM0B1);
|
92 | OCR0B = 0;
|
93 |
|
94 | // Ausgänge
|
95 | DDRC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3); // Alle Signallampen als Ausgänge deklariert
|
96 | PORTC &= ~(_BV(PC0) & _BV(PC1) & _BV(PC2) & _BV(PC3)); // Signallampen ausschalten -> definierter Zustand zu Beginn -> 0V
|
97 |
|
98 | DDRD |= _BV(PD5) | _BV(PD6) ; // Alle LEDs des Leuchtmoduls als Ausgänge deklariert
|
99 | DDRC |= _BV(PC4);
|
100 | PORTD &= ~(_BV(PD5) & _BV(PD6)); // Alle LEDs des Leuchtmoduls -> definierter Zustand zu Beginn -> 0V
|
101 | PORTC &= ~(_BV(PC4));
|
102 |
|
103 | DDRB |= _BV(PB0) | _BV(PB1); // Lautsprecher und Lautsprecher-LED als Ausgang deklariert
|
104 | PORTB &= ~(_BV(PB0)| _BV(PB1)); // definierter Zustand zu Beginn
|
105 |
|
106 | DDRD |= _BV(PD4); // Relais als Ausgang deklariert
|
107 | PORTD &= ~_BV(PD4); // definierter Zustand zu Beginn
|
108 |
|
109 | // Eingänge
|
110 | DDRD &= ~(_BV(PD7)); // Schalter Lautsprecher als Eingang
|
111 | PORTD |= _BV(PD2) | _BV(PD7); // Pull up aktiviert
|
112 |
|
113 |
|
114 | // Funktionsaufruf Initialisierung Bluetooth
|
115 | USART_Init(UBRR_VAL );
|
116 |
|
117 | sei();
|
118 | //Endlosschleife
|
119 | while(1)
|
120 | {
|
121 |
|
122 | // Funkmodule verbunden
|
123 | if ( u8_Empfang == 0b00001000 ) // Abfrage sind die Funkmodule verbunden
|
124 | {
|
125 | u8_blau = 1; // wenn "ja", schalte blaue LED an
|
126 | }
|
127 | else // wenn "nein"
|
128 | {
|
129 | u8_blau = 0; // schalte blaue LED aus
|
130 | }
|
131 |
|
132 | // Rot empfangen
|
133 | if(u8_Empfang == 0b00000001) // Abfrage "Störung" empfangen?
|
134 | {
|
135 | u8_rot = 1; // wenn "ja" steuer rote LED an
|
136 | }
|
137 | else // wenn "nein"
|
138 | {
|
139 | u8_rot = 0; // steuere rote LED nicht an
|
140 | }
|
141 |
|
142 | // Gelb empfangen
|
143 | if(u8_Empfang == 0b00000010) // Abfrage "Fräse in Betrieb" empfangen?
|
144 | {
|
145 | u8_gelb = 1; // wenn "ja" steuer gelbe LED an
|
146 | }
|
147 | else // wenn "nein"
|
148 | {
|
149 | u8_gelb = 0; // steuere grüne LED nicht an
|
150 | }
|
151 |
|
152 | // Grün empfangen
|
153 | if(u8_Empfang == 0b00000100) // Abfrage "Fräse frei" empfangen?
|
154 | {
|
155 | u8_gruen = 1; // wenn "ja" steuer grüne LED an
|
156 | }
|
157 | else // wenn "nein"
|
158 | {
|
159 | u8_gruen = 0; // steuere grüne LED nicht an
|
160 | }
|
161 |
|
162 | if ( u8_blau == 1 )
|
163 | {
|
164 | BLAUE_LED_AN(); // Blaue LED an
|
165 | RELAIS_AN(); // Selbsthaltung ein
|
166 | }
|
167 | else
|
168 | {
|
169 | BLAUE_LED_AUS(); // Blaue LED aus
|
170 | RELAIS_AUS(); // Selbsthaltung aus
|
171 | }
|
172 |
|
173 | if(u8_rot == 1)
|
174 | {
|
175 | ROTE_LED_AN(); // Rote LED an
|
176 | }
|
177 | else
|
178 | {
|
179 | ROTE_LED_AUS(); // Rote LED aus
|
180 | }
|
181 |
|
182 | if(u8_gelb == 1)
|
183 | {
|
184 | GELBE_LED_AN(); // Gelbe LED an
|
185 | }
|
186 | else
|
187 | {
|
188 | GELBE_LED_AUS(); // Gelbe LED aus
|
189 | }
|
190 |
|
191 | if(u8_gruen == 1)
|
192 | {
|
193 | GRUENE_LED_AN(); // Grüne LED an
|
194 | }
|
195 | else
|
196 | {
|
197 | GRUENE_LED_AUS(); // Grüne LED aus
|
198 | }
|
199 |
|
200 | }
|
201 | }
|
202 |
|
203 | // Funktion USART Initialisierung
|
204 | void USART_Init( unsigned int ubrr)
|
205 | {
|
206 | //Set baud rate
|
207 | UBRR0 = ubrr;
|
208 |
|
209 | //Enable receiver and transmitter
|
210 | UCSR0B = _BV(RXEN0)| _BV(TXEN0) | _BV(RXCIE0); // Sender, Empfänger und Empfangsinterrupt
|
211 | UCSR0C = _BV(UCSZ00)| _BV(UCSZ01); // Format bestimmen 8 Datenbits 2 Stoppbits
|
212 | }
|
213 |
|
214 |
|
215 | //Empfangsinterrupt
|
216 | ISR(USART_RX_vect) // wird ausgelöst, wenn Daten empfangen wurden
|
217 | {
|
218 | // if (u8_b_aktiv == 1) // Abfrage, besteht Verbindung?
|
219 | // {
|
220 | u8_Empfang = UDR0; // empfangene Daten werden in "u8_Empfang" gespeichert
|
221 | GRUENE_LED_AN();
|
222 | // }
|
223 | // else // wenn keine Verbindung besteht schalte alle LEDs aus
|
224 | // {
|
225 | // u8_Empfang = 0b00000000;
|
226 | // }
|
227 | }
|