Hi, ich versuche gerade das DCF77-Modul von Conrad mit meinen ATmega8 zum Laufen zu bekommen. Um das empfangene Signal vom DCF77-Modul zu dekodieren, wollte ich mit Hilfe vom ICP1-Pin und einen Timer die Biterekennung(100ms low = '0'; 200ms low = '1') realisieren. Um jetzt erstmal "einzusteigen" habe ich mir unten stehende Funktion geschrieben. Wenn ich die Decodierung vom DCF77 richtig verstanden habe, sollte jetzt die Ausgabe 'TIMER1_CAPT_vect' 59Mal pro Minute ausgegeben werden, oder?. Aber die Ausgabe kommt wesentlich öfters(Zeitmessung alle 8Sekunden: Da kommt die Ausgabe zwischen 0x - 40x; Eigentlich erwartet: 8x). Habe ich einen Fehler im Programm, in der Denkweiße oder bekomme ich so viele Störsignale, dass ich das Programm so nicht realisieren kann? Bin für jede Hilfe dankbar. clock.c
1 | ISR(TIMER1_CAPT_vect) |
2 | {
|
3 | usart_write("TIMER1_CAPT_vect\n"); |
4 | |
5 | }
|
6 | |
7 | void startClock(void) { |
8 | TCNT1 |= (1 << ICES1); //0 = 'falling edge', '1'=rising edge |
9 | |
10 | //timer
|
11 | TIMSK |= (1 << TOIE1); //enable interrupt timer |
12 | TIMSK |= (1 << TICIE1); //enable interupt capter Register(ICP) |
13 | TCCR1B |= (1 << CS10 | 0 << CS11 | 1 << CS12); //prescaler 1024 |
14 | TCCR1B |= (1 << ICNC1); //noise filter enable |
15 | |
16 | TCNT1 = 65535 - (SYSCLK / 1024); //sysclk = 8000000, define in uart.h |
17 | }
|
main.c
1 | int main(void) { |
2 | |
3 | //using usart for debugging
|
4 | usart_init(9600); |
5 | |
6 | DDRC = _BV(LED); //LED as Output |
7 | PORTC = _BV(LED); |
8 | |
9 | PORTB = (1 << PD0); //pullup widerstand ICP |
10 | |
11 | |
12 | //Enable global interrupt
|
13 | sei(); |
14 | |
15 | //start clock
|
16 | startClock(); |
17 | |
18 | usart_write("\nDCF 77 Debugger123\n\n"); |
19 | |
20 | while (1) |
21 | {
|
22 | LED_ON
|
23 | _delay_ms(1000); |
24 | LED_OFF
|
25 | _delay_ms(1000); |
26 | }
|
27 | }
|