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