Hallo zusammen,
ich möchte gerne meinen Stromzähler per serieller optischer
Schnittstelle auslesen. Ich verwende dazu einen SFH309 Fototransisor,
eine LED (zum Anzeigen ob gesendet wird) und einen 10kOhm Widerstand.
Das Auslesen klappt ohne Atmega direkt per HTERM und RS232-TTL- Wandler
einwandfrei (Anschluss vom Stromzähler an RXD vom RS232-TTL Wandler).
Ich bekomme alle zwei Sekunden ein sauberes Protokoll zugeschickt.
Wenn ich nun allerdings meinen ATmega 8 benutze (Anschluss vom
Stromzähler an Atmega RXD, TXD vom Atmega zum RXD vom RS232-TTL Wandler)
habe ich folgende Probleme:
1) es werden ständig Werte empfangen. In der Sendepause z.B. ständig HEX
1D,71 oder FC.
2) Alle Werte empfange ich doppelt. Das Protokoll fängt z.B. immer mit
4x 1B an, ich empfange nun 8x1B.
Was ich bisher versucht habe: Parity verändert, Sensor verschoben.
Leider ohne Erfolg.
Hoffe es kann mir jemand einen Tip geben.
Gruß
Holgie
1 | #include <avr/io.h>
|
2 | #include <string.h> // Fuer "strcmp"
|
3 | #include <stdlib.h> // Fuer "itoa"
|
4 |
|
5 |
|
6 | void check_v24(void) {
|
7 | unsigned char data;
|
8 |
|
9 | // warten bis ein byte empfangen
|
10 | // while(!(UCSRA&(1<<RXC)))
|
11 | // ;
|
12 |
|
13 | // data=UDR;
|
14 |
|
15 | if (bit_is_set(UCSRA, RXC))
|
16 | data = UDR;
|
17 |
|
18 |
|
19 | // ein byte senden
|
20 | while(!(UCSRA&(1<<UDRE)))
|
21 | ;
|
22 |
|
23 | UDR=data;
|
24 |
|
25 | }
|
26 |
|
27 |
|
28 | int main(void) {
|
29 |
|
30 |
|
31 | // FOSZ=3,6MHz, BAUD=9600
|
32 | UBRRH=0;
|
33 | UBRRL=23;
|
34 |
|
35 | UCSRB = (1<<RXEN) | (1<<TXEN);
|
36 |
|
37 | UCSRC = (1<<URSEL) | (3<<UCSZ0);
|
38 |
|
39 |
|
40 | while(1) {
|
41 |
|
42 | check_v24();
|
43 |
|
44 | }
|
45 |
|
46 | return(0);
|
47 | }
|