Forum: Mikrocontroller und Digitale Elektronik RS232 Atmega8 Probleme mit Empfang von Daten


von holgie (Gast)


Lesenswert?

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
}
von Karl H. (kbuchegg)


Lesenswert?

1
void check_v24(void) { 
2
  unsigned char data; 
3
4
  // warten bis ein byte empfangen 
5
 // while(!(UCSRA&(1<<RXC))) 
6
 //   ; 
7
8
 // data=UDR; 
9
10
if (bit_is_set(UCSRA, RXC)) 
11
data = UDR;
12
13
14
  // ein byte senden 
15
  while(!(UCSRA&(1<<UDRE))) 
16
    ;  
17
18
  UDR=data; 
19
20
}

Rück den COde mal vernünftig ein und überleg dir, welchen Wert wohl data 
hat, wenn du nichts empfangen hast. Du sendest auf Tx auch dann etwas 
raus, wenn du nichts über Rx empfangen hast.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.