Atmega8 Usart RX Problem

Gast #3169090
Lesenswert?

Guten Tag, ich benötigte ein wenig Hilfe bei dem USART des Atmega8.

Ich habe es hier schon einmal versucht, aber da konnte mir leider 
niemand helfen.

FuseBits habe ich auf: LOW = 0xEF
                       HIGH = 0xD9

(Sollte eigentlich stimmen)

Frequenz ist 16MHz.
Das ganze läuft auf dem Pollin-Entwicklungsboard.

Nun zum Code
1
#define F_CPU       16000000
2
#define BAUD        9600
3
#define UBRR_BAUD   ((F_CPU)/(BAUD*16UL))-1
4

5

6
#include <avr/io.h>
7
#include <util/delay.h>
8
#include <stdlib.h>
9
#include <avr/interrupt.h>
10

11

12
void init_uart(void)
13
{
14
  UBRRH = (uint8_t) (UBRR_BAUD>>8);
15
  UBRRL = (uint8_t) (UBRR_BAUD);
16
  UCSRB = (1<<RXEN)|(1<<TXEN);
17
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
18
}
19

20

21

22

23
int uart_putc(unsigned char c)
24
{
25
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
26
  {
27
  }
28
  
29
  UDR = c;                      /* sende Zeichen */
30

31
  return 0;
32
}
33

34

35

36

37

38
uint8_t uart_getc(void)
39
{
40
  while (!(UCSRA & (1<<RXC)))   
41
  {
42
        }
43
  return UDR;                
44
}
45

46

47

48

49
void main( void )
50
{
51

52

53
  init_uart();
54
  uart_putc('t');
55
  uint8_t c = uart_getc();
56
  uart_putc(c);
57

58
}

Das Empfangen ist kein Problem.
Das 't' empfange ich direkt.
Jedoch empfängt der Mikrocontroller nichts, denn egal was ich eingebe 
ich bekomme kein Zeichen Zurück.

wenn ich jedoch folgende Funktion:
1
uint8_t uart_getc(void)
2
{
3
  while (!(UCSRA & (1<<RXC)))   
4
  {
5
  }
6
  return UDR;                
7
}

so abändere:
1
uint8_t uart_getc(void)
2
{
3
  while (!(UCSRA & (1<<RXC)))   
4
  {
5
      UDR=0;
6
  }
7
  return UDR;                
8
}

wird zumindest in ca. 45% der Fälle etwas korrektes zurückgegeben.

Vielen Dank im Vorraus!
#3169128
Lesenswert?

Anonym schrieb:
> wenn ich jedoch folgende Funktion:
> ...
> so abändere:
> ...
> wird zumindest in ca. 45% der Fälle etwas korrektes zurückgegeben.

Also etwas anders ausgedrückt: der Empfang funktioniert sporadisch und 
ist irgendwie abhängig vom Pegel auf der Gegenrichtung.

Ich würde auf Hardware-Problem tippen.
Vielleicht die Masseverbindung zwischen PC und µC vergessen?
Gast #3169163
Lesenswert?

Also den Pegelwandler (MAX232) habe ich gerade ausgetauscht,aber das 
Problem besteht immer noch.

Ich verwende einen Usb-Serial Adapter, von daher brauche ich mir wohl um 
die Masseverbindung keine Sorgen machen.

Den Mikrocontroller habe ich auch bereits ausgetauscht.
Gast #3169178
Lesenswert?

Stefan Ernst schrieb:
> Wie kommst du darauf? Natürlich brauchst du auch dann eine
> Masseverbindung (zwischen dem Adapter und deiner Schaltung).

Ja natürlich aber man kann ja nicht viel falsch machen.
Adapter in USB-Buchse und RS232-Buchse und fertig.(Oder nicht?)
Ausserdem das Senden von mC nach PC geht ja einwandfrei.

Ich kann also mit einem Hardware-Defekt rechnen?
#3169193
Lesenswert?

Anonym schrieb:
> Ja natürlich aber man kann ja nicht viel falsch machen.
> Adapter in USB-Buchse und RS232-Buchse und fertig.(Oder nicht?)

Wie soll ich das beantworten? Ich weiß ja nicht, was "RS232-Buchse" bei 
dir überhaupt konkret bedeutet. Ist da noch ein Adapter am Werk, oder 
ist die ganze µC-Schaltung was Fertiges mit RS232-Interface, oder was 
selbst gebautes, oder was?

Anonym schrieb:
> Ausserdem das Senden von mC nach PC geht ja einwandfrei.

Was bezüglich einer möglicherweise fehlenden Masseverbindung überhaupt 
nichts zu sagen hat.
#3169195
Lesenswert?

1
void main( void )
2
{
3
  init_uart();
4
  uart_putc('t');
5
  uint8_t c = uart_getc();
6
  uart_putc(c);
7
}
Was ist das denn?
Die main wird nach putc beendet und der Controller geht in eine 
Warteschleife, bis er einen Reset bekommt.

Anonym schrieb:
> Ja natürlich aber man kann ja nicht viel falsch machen.
> Adapter in USB-Buchse und RS232-Buchse und fertig.(Oder nicht?)
> Ausserdem das Senden von mC nach PC geht ja einwandfrei.
>
> Ich kann also mit einem Hardware-Defekt rechnen?
Vielleicht.

Zieh den Controller aus dem Sockel und verbinde am Sockel Rx und Tx.
Müssten Pin 2 und 3 sein. Öffne auf dem PC ein Terminalprogramm deines 
Vetrauens und sende ein paar Zeichen. Werden diese Zeichen vom PC wieder 
empfangen, ist deine Hardware bis zu den Controllerpins in Ordnung.

mfg.
Gast #3169211
Lesenswert?

Stefan Ernst schrieb:
> Wie soll ich das beantworten? Ich weiß ja nicht, was "RS232-Buchse" bei
> dir überhaupt konkret bedeutet. Ist da noch ein Adapter am Werk, oder
> ist die ganze µC-Schaltung was Fertiges mit RS232-Interface, oder was
> selbst gebautes, oder was?


Was fertiges mit RS232-Interface.
http://www.pollin.de/shop/dt/MTY5OTgxOTk-/Bausaetze_Module/Bausaetze/ATMEL_Evaluations_Board_Version_2_0_1_Bausatz.html
Gast #3169272
Lesenswert?

Thomas Eckmann schrieb:
> Was ist das denn?
> Die main wird nach putc beendet und der Controller geht in eine
> Warteschleife, bis er einen Reset bekommt.
>

Ist ja erstmal nur zum Testen.

> Zieh den Controller aus dem Sockel und verbinde am Sockel Rx und Tx.
> Müssten Pin 2 und 3 sein. Öffne auf dem PC ein Terminalprogramm deines
> Vetrauens und sende ein paar Zeichen. Werden diese Zeichen vom PC wieder
> empfangen, ist deine Hardware bis zu den Controllerpins in Ordnung.
>
> mfg.


So hab ich gemacht...kommt zwar etwas an aber nicht das was gesendet 
wurde.
Verbinde ich Tx und Rx allerdings direkt am RS232 Stecker dann erhalte 
ich wieder genau den Buchstaben, den ich gesendet  habe.
Der Pegelwandler ist aber funktionstüchtig, hab ihn gerade bei nem 
anderen Board ausprobiert.
#3169556
Lesenswert?

Anonym schrieb:
> Glaub ich eher nicht, da der Test mit der Brücke von Tx nach Rx ja
> geklappt hat.
Auch wenn es jetzt funktioniert und es an etwas anderem lag: Mit "glaube 
ich nicht" und "kann nicht sein" stellt man Verschwörungstheorien auf 
aber damit sucht man keine Fehler in der Elektronik.

Die Frage nach dem USB-RS232 hatte schon seinen konkreten Grund. Denn 
wenn die Massverbindung fehlerhaft ist, funktioniert zwar das Brücken 
direkt am Stecker aber nicht die Verbindung zum nachfolgenden Treiber. 
Und somit das Brücken dahinter.

mfg.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren