1 | //für Atmega2560 INT2:
|
2 | //Interrupt an dem das DCF77 Modul hängt hier INT2(PD2)
|
3 | #define DCF77_INT_ENABLE() EIMSK |= (1<<INT2);
|
4 | #define DCF77_INT SIG_INTERRUPT2
|
5 | #define INT2_CONTROL EICRA
|
6 | #define INT2_FALLING_EDGE 0x32
|
7 | #define INT2_RISING_EDGE 0x48
|
8 |
|
9 | //############################################################################
|
10 | //DCF77 Modul empfängt Träger
|
11 | SIGNAL (DCF77_INT)
|
12 | //############################################################################
|
13 | {
|
14 | //Auswertung der Pulseweite
|
15 | if (INT2_CONTROL == INT2_RISING_EDGE)
|
16 | {
|
17 | flags.dcf_rx ^= 1;
|
18 | //Secunden Hilfs Counter berechnen // SYSCLK defined in USART.H
|
19 | h_ss = h_ss + TCNT1 - (65535 - (F_CPU / 1024));
|
20 | //Zurücksetzen des Timers
|
21 | TCNT1 = 65535 - (F_CPU / 1024);
|
22 | //ist eine Secunde verstrichen // SYSCLK defined in USART.H
|
23 | if (h_ss > (F_CPU / 1024 / 100 * 90)) //90% von 1Sekunde
|
24 | {
|
25 | //Addiere +1 zu Sekunden
|
26 | Add_one_Second();
|
27 | //Zurücksetzen des Hilfs Counters
|
28 | h_ss = 0;
|
29 | };
|
30 | //Nächster Interrupt wird ausgelöst bei abfallender Flanke
|
31 | INT2_CONTROL = INT2_FALLING_EDGE;
|
32 | }
|
33 | else
|
34 | {
|
35 | //Auslesen der Pulsweite von ansteigender Flanke zu abfallender Flanke
|
36 | unsigned int pulse_wide = TCNT1;
|
37 | //Zurücksetzen des Timers
|
38 | TCNT1 = 65535 - (F_CPU / 1024);
|
39 | //Secunden Hilfs Counter berechnen
|
40 | h_ss = h_ss + pulse_wide - (65535 - (F_CPU / 1024));
|
41 | //Parity speichern
|
42 | //beginn von Bereich P1/P2/P3
|
43 | if (rx_bit_counter == 21 || rx_bit_counter == 29 || rx_bit_counter == 36)
|
44 | {
|
45 | flags.parity_err = 0;
|
46 | };
|
47 | //Speichern von P1
|
48 | if (rx_bit_counter == 28) {flags.parity_P1 = flags.parity_err;};
|
49 | //Speichern von P2
|
50 | if (rx_bit_counter == 35) {flags.parity_P2 = flags.parity_err;};
|
51 | //Speichern von P3
|
52 | if (rx_bit_counter == 58) {flags.parity_P3 = flags.parity_err;};
|
53 | //Überprüfen ob eine 0 oder eine 1 empfangen wurde
|
54 | //0 = 100ms
|
55 | //1 = 200ms
|
56 | //Abfrage größer als 150ms (15% von 1Sekund also 150ms)
|
57 | if (pulse_wide > (65535 - (F_CPU / 1024)/100*85))
|
58 | {
|
59 | //Schreiben einer 1 im dcf_rx_buffer an der Bitstelle rx_bit_counter
|
60 | dcf_rx_buffer = dcf_rx_buffer | ((unsigned long long) 1 << rx_bit_counter);
|
61 | //Toggel Hilfs Parity
|
62 | flags.parity_err = flags.parity_err ^ 1;
|
63 | }
|
64 | //Nächster Interrupt wird ausgelöst bei ansteigender Flanke
|
65 | INT2_CONTROL = INT2_RISING_EDGE;
|
66 | //RX Bit Counter wird um 1 incrementiert
|
67 | rx_bit_counter++;
|
68 | }
|
69 | };
|