Forum: Mikrocontroller und Digitale Elektronik Atmega8 Usart RX Problem


von Anonym (Gast)


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!

von Alternativer (Gast)


Lesenswert?

ich würde den rx Interrupt verwenden und die Zeichen in einen Buffer 
schreiben, ansonsten mußt du immer auf der Uart "Lauschen".

von Stefan E. (sternst)


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?

von Anonym (Gast)


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.

von Stefan E. (sternst)


Lesenswert?

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

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

von Anonym (Gast)


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?

von Stefan E. (sternst)


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.

von Thomas E. (thomase)


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.

von Anonym (Gast)


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

von Anonym (Gast)


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.

von Thomas E. (thomase)


Lesenswert?

Anonym schrieb:
> 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.
Hast du den USB-RS232 schon getauscht? Der kann ja auch 'ne Macke haben.

mfg.

von Anonym (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Hast du den USB-RS232 schon getauscht? Der kann ja auch 'ne Macke haben.
>
> mfg.

Glaub ich eher nicht, da der Test mit der Brücke von Tx nach Rx ja 
geklappt hat.
Aber vielleicht finde ich ja noch einen PC mit einer direkten 
RS232-Schnittstelle

von Uwe (de0508)


Lesenswert?

Hallo,

eine anderes Problem ist manchmal, RX-TX und TX-RX sind nicht verbunden.

von Anonym (Gast)


Lesenswert?

Okay Problem hat sich erledigt,
hab mal den Spannungsregler ausgewechselt.
Anscheinend war der defekt.

Vielen Dank trotzdem!

von Thomas E. (thomase)


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.

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.