1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "LCD-Routines.h" // geaendert auf PORT-C
|
4 | #include <stdlib.h>
|
5 |
|
6 | #define F_CPU 100000L // interner Takt 1 MHz
|
7 | volatile uint16_t internalTime = 0; // fuer Sekunde
|
8 | // dcf Zeit
|
9 | volatile uint16_t dcfTime = 0; // Signaldauer INT0 DCF
|
10 | volatile uint16_t dcfAnz =0;
|
11 | volatile uint8_t dcfFlag =0;
|
12 |
|
13 |
|
14 | /**********************************************
|
15 | * Interrupt Routinen
|
16 | **********************************************/
|
17 | ISR (TIMER2_COMP_vect) {
|
18 | internalTime++; // 1ms
|
19 | if (internalTime == 1000) { // 1000ms (0-999) = 1 Sek
|
20 | internalSek++; // Sekunden hoch
|
21 | internalTime = 0;
|
22 | PORTB ^= (1 << PB2); // Kontrolle LED PB2
|
23 | }
|
24 |
|
25 | // INT0 abfragen
|
26 | if (PIND &(1 << DDD2)) {
|
27 | PORTB |= (1 << PB1); // Kontrolle LED PB1 an
|
28 | dcfTime++;
|
29 | dcfFlag=1;
|
30 | } else if (!(PIND &(1 << DDD2))) {
|
31 | PORTB &= ~(1 << PB1); // Kontrolle LED PB1 aus
|
32 | if (dcfFlag == 1) {
|
33 | dcfAnz=dcfTime;
|
34 | dcfTime = 0;
|
35 | dcfFlag = 0;
|
36 | }
|
37 | }
|
38 |
|
39 | }
|
40 |
|
41 |
|
42 | // Ueberwachung INT0 - DCF77-Eingang
|
43 | ISR (INT0_vect) {
|
44 | // foo
|
45 | }
|
46 |
|
47 |
|
48 | // ****************************** MAIN *********************
|
49 | int main(void) {
|
50 | internalTime = 0; // Start interner Zeitzaehler
|
51 | dcfAnz = 0;
|
52 | dcfTime = 0;
|
53 | dcfFlag =0;
|
54 |
|
55 | // PORT B als Ausgänge
|
56 | DDRB |= (1 << DDB1) | (1 << DDB2); // PB1 und PB2 als LED OUT
|
57 | PORTB &= ~(1 << PB1); // PB1 aus
|
58 | PORTB &= ~(1 << PB2); // PB2 aus
|
59 |
|
60 | // PORT D als Eingang fuer INT0
|
61 | DDRD &= ~(1 << DDD2); // INT0 als Eingang
|
62 | MCUCR = (1 << ISC00) | (1 << ISC01); // steigende Flanke INT0
|
63 | GICR = (1 << INT0); // IRQ an INT0 zulassen
|
64 |
|
65 | // Timer2 als Millisekundencounter
|
66 | TIMSK |= (1 << TOIE2) | (1 << OCIE2);
|
67 | OCR2 = 125 - 1; // Compare gegen 125 für 1 ms
|
68 | TCCR2 |= (1 << CS21); // Prescaler Timer2 = 8
|
69 | TCCR2 |= (1 << WGM21); // Compare Mode CTC zulassen
|
70 | sei(); // Interrupts global zulassen
|
71 |
|
72 | // **** LCD ****
|
73 | lcd_init();
|
74 |
|
75 |
|
76 | while(1)
|
77 | {
|
78 | // DCF Signal = AUS
|
79 | if (dcfAnz >=60 && dcfAnz <= 140) {
|
80 | lcd_setcursor(0,1);
|
81 | lcd_string("DCF: NULL ");
|
82 | // DCF Signal = EIN
|
83 | } else if (dcfAnz >=150 && dcfAnz <=260) {
|
84 | lcd_setcursor(0,1);
|
85 | lcd_string("DCF: EINS ");
|
86 | // DCF Signal = SYNC
|
87 | } else if (dcfAnz >=1700 && dcfAnz <=2200) {
|
88 | lcd_setcursor(0,1);
|
89 | lcd_string("DCF: SYNC ");
|
90 | }
|
91 |
|
92 | }
|
93 | }
|