1 | //############################################################################
|
2 | //DCF77 Modul empfängt Träger
|
3 | ISR (PORTA_INT0_vect)
|
4 | //############################################################################
|
5 | {
|
6 | //Auswertung der Pulseweite
|
7 | //if (INT0_CONTROL == INT0_RISING_EDGE)
|
8 |
|
9 | if (PORTA.PIN0CTRL == PORT_ISC_RISING_gc)
|
10 | {
|
11 | flags.dcf_rx ^= 1;
|
12 | PORTE.OUTTGL |= (1<<PIN1);
|
13 |
|
14 | //Secunden Hilfs Counter berechnen // SYSCLK defined in USART.H
|
15 | h_ss = h_ss + TCC0.CNT - DCF_CYCLE_1S; //(65535 - (SYSCLK / 1024));
|
16 | //Zurücksetzen des Timers
|
17 | //TCC0.CTRLFCLR = TC_CMD_RESTART_gc;
|
18 | //TCC0.PER = DCF_CYCLE_1S; //65535 - (SYSCLK / 1024);
|
19 |
|
20 | TimerReset();
|
21 | //ist eine Secunde verstrichen // SYSCLK defined in USART.H
|
22 | //if (h_ss > ( SYSCLK / 1024 / 100 * 90)) //90% von 1Sekunde
|
23 | if (h_ss > ( DCF_SYSCLOCK / 100 * 90)) //90% von 1Sekunde
|
24 |
|
25 | {
|
26 | //Addiere +1 zu Sekunden
|
27 | Add_one_Second();
|
28 | //Zurücksetzen des Hilfs Counters
|
29 | h_ss = 0;
|
30 | };
|
31 | ////Nächster Interrupt wird ausgelöst bei abfallender Flanke
|
32 | //INT0_CONTROL = INT0_FALLING_EDGE;
|
33 | PORTA.PIN0CTRL = PORT_ISC_FALLING_gc;
|
34 | }
|
35 | else
|
36 | {
|
37 | //Auslesen der Pulsweite von ansteigender Flanke zu abfallender Flanke
|
38 | unsigned int pulse_wide = TCC0.CNT;
|
39 |
|
40 | //Zurücksetzen des Timers
|
41 | //TCC0.CTRLFCLR = TC_CMD_RESTART_gc;
|
42 | //TCC0.PER = DCF_CYCLE_1S; //65535 - (SYSCLK / 1024);
|
43 | TimerReset();
|
44 | //Secunden Hilfs Counter berechnen
|
45 | h_ss = h_ss + pulse_wide - DCF_CYCLE_1S;
|
46 | //Parity speichern
|
47 | //beginn von Bereich P1/P2/P3
|
48 | if (rx_bit_counter == 21 || rx_bit_counter == 29 || rx_bit_counter == 36)
|
49 | {
|
50 | flags.parity_err = 0;
|
51 | };
|
52 | //Speichern von P1
|
53 | if (rx_bit_counter == 28) {flags.parity_P1 = flags.parity_err;};
|
54 | //Speichern von P2
|
55 | if (rx_bit_counter == 35) {flags.parity_P2 = flags.parity_err;};
|
56 | //Speichern von P3
|
57 | if (rx_bit_counter == 58) {flags.parity_P3 = flags.parity_err;};
|
58 | //Überprüfen ob eine 0 oder eine 1 empfangen wurde
|
59 | //0 = 100ms
|
60 | //1 = 200ms
|
61 | //Abfrage größer als 150ms (15% von 1Sekund also 150ms)
|
62 | if (pulse_wide > (DCF_CYCLE_1S /100*85))
|
63 | {
|
64 | //Schreiben einer 1 im dcf_rx_buffer an der Bitstelle rx_bit_counter
|
65 | dcf_rx_buffer = dcf_rx_buffer | ((unsigned long long) 1 << rx_bit_counter);
|
66 | //Toggel Hilfs Parity
|
67 | flags.parity_err = flags.parity_err ^ 1;
|
68 | }
|
69 | //Nächster Interrupt wird ausgelöst bei ansteigender Flanke
|
70 | // INT0_CONTROL = INT0_RISING_EDGE;
|
71 | PORTA.PIN0CTRL = PORT_ISC_RISING_gc;
|
72 | //RX Bit Counter wird um 1 incrementiert
|
73 | rx_bit_counter++;
|
74 | }
|
75 | };
|