Hallo zusammen,
das Alarmsignal soll zuerst sehr leise ertönen und dann, wenn nicht quittiert wird, schon lauter.
Ich habe jetzt alles, was nicht zum Thema gehört, aus dem Code entfernt und ihn hoffentlich so weit wie möglich reduziert. Selbst das Quittieren/Ausschalten steht jetzt nicht im Code. Die beigefügte selbsterklärende Audiodatei soll die spärlichen Annotationen kompensieren.
Allerdings würde ich gerne jemanden bitten, den Code kostenlos zu überprüfen, vielleicht kann er noch kompakter gemacht werden.
Es ist nicht dringend, es kann warten.
1 |
#include <avr/io.h>
|
2 |
|
3 |
int main(void)
|
4 |
{
|
5 |
uint8_t i = 0; // timer (0, 50ms, 100ms, 150ms...)
|
6 |
uint8_t j = 0; // counter (0...6: signal, 6...18: pause)
|
7 |
uint8_t k = 0; // signal counter
|
8 |
const uint16_t p1 = 253; // TCD value 1 (tone 1)
|
9 |
const uint16_t p2 = 235; // TCD value 2 (tone 2)
|
10 |
uint16_t s1 = p1 - 10; // pulse start value (tone 1)
|
11 |
uint16_t s2 = p2 - 10; // pulse start value (tone 2)
|
12 |
|
13 |
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, CLKCTRL_PDIV_10X_gc | CLKCTRL_PEN_bm); // 2 MHz main clock
|
14 |
|
15 |
_PROTECTED_WRITE(TCD0.FAULTCTRL, TCD_CMPAEN_bm | TCD_CMPBEN_bm);
|
16 |
TCD0.CTRLB = TCD_WGMODE_TWORAMP_gc; // two ramp mode
|
17 |
TCD0.CTRLC = TCD_FIFTY_bm | TCD_AUPDATE_bm; // symmetrical, automatically update
|
18 |
TCD0.CMPBSET = s1; // pulse start value (tone 1)
|
19 |
TCD0.CMPBCLR = p1; // tone 1
|
20 |
while(!(TCD0.STATUS & TCD_ENRDY_bm)){} // ensure ENRDY bit is set
|
21 |
TCD0.CTRLA = TCD_CLKSEL_SYSCLK_gc | TCD_ENABLE_bm; // select clock, enable TCD
|
22 |
|
23 |
TCB0.CCMP = 0xC34F; // timeout value (50ms @ 1MHz TCB clock)
|
24 |
TCB0.CTRLA = TCB_CLKSEL_CLKDIV2_gc | TCB_ENABLE_bm; // 1MHz TCB clock, enable TCB
|
25 |
|
26 |
while(1)
|
27 |
{
|
28 |
if(TCB0.INTFLAGS)
|
29 |
{
|
30 |
TCB0.INTFLAGS = TCB_CAPT_bm; // clear the interrupt flag
|
31 |
i++;
|
32 |
if(i == 2) // 100ms
|
33 |
{
|
34 |
TCD0.CMPBSET = s2; // pulse start 2
|
35 |
TCD0.CMPBCLR = p2; // tone 2
|
36 |
}
|
37 |
else if(i == 4) // 200ms
|
38 |
{
|
39 |
TCD0.CMPBSET = s1; // pulse start 1
|
40 |
TCD0.CMPBCLR = p1; // tone 1
|
41 |
i = 0;
|
42 |
j++;
|
43 |
if(j == 6) // after 6*(100ms tone 1 + 100ms tone 2)
|
44 |
{
|
45 |
TCD0.CTRLE = TCD_DISEOC_bm; // pause
|
46 |
k++;
|
47 |
if(k == 4) // after 4 times "quiet"
|
48 |
{
|
49 |
s1 = 0; // switch to "loud"
|
50 |
s2 = 0; // switch to "loud"
|
51 |
}
|
52 |
else if(k == 10) // after 6 times "loud"
|
53 |
{
|
54 |
TCB0.CTRLA = 0; // stop
|
55 |
}
|
56 |
}
|
57 |
else if(j == 18) // end of pause
|
58 |
{
|
59 |
while(!(TCD0.STATUS & TCD_ENRDY_bm)){} // ensure ENRDY bit is set
|
60 |
TCD0.CTRLA = TCD_CLKSEL_SYSCLK_gc | TCD_ENABLE_bm; // enable again
|
61 |
j = 0;
|
62 |
}
|
63 |
}
|
64 |
}
|
65 |
}
|
66 |
}
|