Hallo zusammen,
ich versuche gerade das Funkuhrmodul von HKW ans laufen zu bekommen:
http://www.hkw-elektronik.de/deutsch/produkte/baugruppen/funkuhrmodule.php
Nach Aktivierung der Eingangsleitung des Moduls beginnt dieses auch
fleißig Daten zu senden, dummerweise erkennt mein AVR ständig nur Frame
Errors...
Hier mal eine Zusammenfassung, so wie ich die Dokumentation von HKW
verstanden habe: 300 Baud, 7 Daten- & 2 Stopbits, gerade Parität. In der
Software soll man aber 8 Datenbits und keine Parität einstellen, da man
das paritätsbit später von Hand auswerten kann.
Wieso bekomme ich dann bei diesem Code einen Frame Error gezeigt?
1 | #include "main.h"
|
2 | #include "fum.h"
|
3 |
|
4 | U8 fum_rx_buffer[FUM_RX_BYTES];
|
5 | U8 fum_rx_pointer;
|
6 | U8 fum_rx_state;
|
7 |
|
8 |
|
9 | void fum_init(void)
|
10 | {
|
11 | // UBBRn = [f_CPU / (16 x baud)] -1
|
12 | UBRR1 = 207;
|
13 | // enable receiver & interrupt
|
14 | UCSR1B = ((1<<RXEN1)|(1<<RXCIE1));
|
15 | // set frame format: 8 data bits, 2 stop bits, no parity
|
16 | UCSR1C = ((1<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10));
|
17 |
|
18 | // activate data transmission
|
19 | DDRD |= (1<<PORTD3);
|
20 | PORTD |= PORTD3;
|
21 |
|
22 | fum_rx_state |= FUM_RX_DATA_LOST;
|
23 | }
|
24 |
|
25 |
|
26 | // RX INTERRUPT
|
27 | #ifdef __GNUC__
|
28 | ISR (USART1_RX_vect)
|
29 | #elif __ICCAVR__
|
30 | #pragma vector = USART1_RX_vect
|
31 | __interrupt void rx_int(void)
|
32 | #else
|
33 | #error Compiler not supported
|
34 | #endif
|
35 | {
|
36 | U8 status = UCSR1A;
|
37 | U8 data = UDR1;
|
38 |
|
39 | if(status & RX_FRAME_ERROR)
|
40 | {
|
41 | fum_rx_state |= FUM_RX_DATA_LOST;
|
42 | fum_rx_state |= FUM_RX_FRAME_ERR;
|
43 | }
|
44 |
|
45 | if(fum_rx_state & FUM_RX_DATA_LOST)
|
46 | {
|
47 | if(data == FUM_RX_EOT)
|
48 | {
|
49 | fum_rx_state &= ~FUM_RX_DATA_LOST;
|
50 | fum_rx_state &= ~FUM_RX_FRAME_ERR;
|
51 | fum_rx_pointer = 0;
|
52 | }
|
53 | }
|
54 |
|
55 | else
|
56 | {
|
57 | if(fum_rx_pointer < FUM_RX_BYTES)
|
58 | {
|
59 | fum_rx_buffer[fum_rx_pointer] = data;
|
60 | fum_rx_pointer++;
|
61 | }
|
62 |
|
63 | else
|
64 | {
|
65 | if(data == FUM_RX_EOT)
|
66 | {
|
67 | fum_rx_state |= FUM_RX_DATA_READY;
|
68 | fum_rx_pointer = 0;
|
69 | UCSR1B &= ~((1<<RXEN1)|(1<<RXCIE1));
|
70 | }
|
71 | else
|
72 | fum_rx_state |= FUM_RX_DATA_LOST;
|
73 | }
|
74 | }
|
75 | }
|
Nachtrag: AVR läuft bei 1MHz
MfG,
robbse