Forum: Mikrocontroller und Digitale Elektronik USART TX geht, RX nicht


von Max M. (maxx2k15)


Lesenswert?

Guten Morgen,

mein Versuchsaufbau ist simpel und das Programm auch. Und dennoch 
funktioniert es nicht.
Am PC hängt über RS232 ein Atmega128RFA1 (auf STK600). Kommuniziert wird 
über das Hyperterminal.
Das Senden vom Controller zum Computer funktioniert perfekt, das Senden 
vom Computer zum Controller dafür nicht. Und daher verzweifel ich hier 
langsam.
Geschwindigkeit sind 19,2 kbit, Datenformat 8N1
Takt 16 MHz, das ist Software und Controller auch bekannt ;)
Ich habe jetzt mal alles hier hineinkopiert, da mir jetzt nicht klar 
ist, wo der Fehler liegen könnte.

Aus dem Programm wurde alles - für den RS232 Test- unnötige entfernt und 
Funktionen aus verschiedenen C Dateien zusammengefügt.

Was ich bereits getestet habe:
Verschiedene Terminal Programme, Verschiedene Baudraten, Verschiedene 
Taktquellen (Generator auf STK600 (8MHz, 16MHz), TRXOSC (16MHz)), 
Verschiedene Serielle Adapter (USB<->RS232)

Und jetzt hoffe ich auf Hilfe, denn mir fällt nichts mehr ein.
1
#include "usart.h"
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <asf.h>
5
#include <avr/interrupt.h>
6
7
#define F_CPU 16000000UL
8
#define BAUD 19200
9
10
volatile uint8_t msg, msg_vorhanden = 0;
11
12
int main(void)
13
{
14
  //Interrupts global sperren
15
  cli();
16
  
17
  //USART einrichten
18
  usart_init();
19
  
20
  usart_puts("\n\rTest OK  ");
21
22
  //Interrupts global freigeben
23
  sei();
24
25
    while(1)
26
    {
27
      if (msg_vorhanden == 1)
28
      {
29
        usart_puts("IF wurde aufgerufen");
30
        msg_vorhanden = 0;
31
      }
32
    }
33
}
34
35
ISR(USART1_RX_vect)
36
{
37
  msg = UDR1;
38
  usart_putc('a'); //soll signalisieren, dass ISR aufgerufen wurde
39
  msg_vorhanden = 1;
40
}
41
42
void usart_init(void)
43
{
44
  // USART 1 initialisieren
45
    
46
  UCSR1B |= ((1<<RXEN1) | (1<<TXEN1) | (1<<RXCIE1));  //Aktivieren Receiver und Transmitter, aktiviere RX Interrupt
47
48
  UBRR1H = UBRRH_VALUE;          //Diese beiden Werte werden automatisch generiert. Dafür wird die #include <util/setbaud.h> benötigt
49
  UBRR1L = UBRRL_VALUE;          //Außerdem muss BAUD definiert sein
50
  
51
  UCSR1C &= ~(1<<UMSEL11) | (1<<UMSEL10);  //Asynchrone Operation
52
53
  UCSR1C |= (3<<UCSZ10);          //Frame Format einstellen: 8data, 1 stop bit, no Parity
54
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:
> Was ich bereits getestet habe: ...
Du hast auch gemessen und mit eigenen Augen gesehen, dass das Signal 
am RX-Pin des µC ankommt?

> Das Senden vom Controller zum Computer funktioniert perfekt, das Senden
> vom Computer zum Controller dafür nicht.
Probier doch einfach mal, das RX-Flag des UART-Registers zu Pollen.

> UCSR1C &= ~(1<<UMSEL11) | (1<<UMSEL10);  //Asynchrone Operation
Kontrollier doch mal, ob diese Zeile genau das bewirkt, was du willst...

: Bearbeitet durch Moderator
von Max M. (maxx2k15)


Lesenswert?

Lothar M. schrieb:
>> Was ich bereits getestet habe: ...
> Du hast auch gemessen und mit eigenen Augen gesehen, dass das Signal
> am RX-Pin des µC ankommt?

Ich habe es gerade mit dem Oszi angeschaut, am RX Pin kommen keine 
wirklichen Daten an. Der Pin wird zwar für einige µs auf 0 V gezogen, 
geht dann aber sofort auf 3V3 und bleibt dann da. Also kommen keine 
Daten an wie es scheint.
Dies ist übrigens bei beiden STK600 so. Habe gerade nochmal in die 
Anleitung geschaut, ob ich evtl einen Jumper vergessen habe oder 
ähnliches. Dem ist aber leider nicht so.

Messe jetzt mal direkt am RS232 Kabel und melde mich dann wieder.

Edit:
Am Kabel kommen Daten an. Diese erscheinen auf dem Oszi auch plausibel.
Allerdings meine ich im Kopf zu haben: 1 = -3 bis -15 V (das passt, IDLE 
-5V)
0 = +3 V bis 15 V, hier geht es nur auf knapp unter 2 V. Erkennt es der 
Pegelwandler auf dem STK600 nicht als 0 sondern denkt, es ist rauschen 
oder was auch immer? (Offset am Oszi 0, nur damit das klar ist :D )

Lothar M. schrieb:
>> UCSR1C &= ~(1<<UMSEL11) | (1<<UMSEL10);  //Asynchrone Operation
> Kontrollier doch mal, ob diese Zeile genau das bewirkt, was du willst...

Vergessene Klammer ist nun drinnen, hat aber nach den vorherigen 
Ergebnissen logischerweise nix geändert.

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?

Max M. schrieb:
> 0 = +3 V bis 15 V, hier geht es nur auf knapp unter 2 V.

Hast Du auch ohne angeschlossenen STK600 mal gemessen?
Und dann mit Lastwiderststand, z.B. 2,7kΩ?
Wenn dabei die Spannung zu klein ist (nach Norm sollte der Sender bei 
min. Lastwiderstand von 3kΩ mindestens +5V liefern), dann ist die Quelle 
morsch, andernfalls der STK600.

von Max M. (maxx2k15)


Lesenswert?

Dietrich L. schrieb:
> Hast Du auch ohne angeschlossenen STK600 mal gemessen?
Ja, gleiches Verhalten

Dietrich L. schrieb:
> Wenn dabei die Spannung zu klein ist (nach Norm sollte der Sender bei
> min. Lastwiderstand von 3kΩ mindestens +5V liefern), dann ist die Quelle
> morsch, andernfalls der STK600.

Du meinst RS232 über 3,7K OHM auf GND?
Nein, habe ich noch nicht gemacht. Dann werde ich das jetzt testen.

Ist echt komisch, weil ich vor ca. 1 Jahr den selben Aufbau erfolgreich 
verwendet habe.
Weiterhin habe ich 2 identische USB - Seriell Wandler, die beide das 
selber Verhalten aufweisen.
Auch habe ich hier 2x STK600, und auch da das gleiche Verhalten.
Kommt mir komisch vor. Wäre doch ein komischer Zufall, wenn beide den 
exakt gleichen Defekt haben?

von Dietrich L. (dietrichl)


Lesenswert?

Max M. schrieb:
> Ist echt komisch, weil ich vor ca. 1 Jahr den selben Aufbau erfolgreich
> verwendet habe.

Bei 2V ist der Pegel vielleicht so knapp, das es mal geht und mal nicht.

> Weiterhin habe ich 2 identische USB - Seriell Wandler, die beide das
> selber Verhalten aufweisen.

Billigteile, die die Norm nicht einhalten? Hierzu siehe
https://de.wikipedia.org/wiki/RS-232#Definition

von Max M. (maxx2k15)


Lesenswert?

Dietrich L. schrieb:
>> Weiterhin habe ich 2 identische USB - Seriell Wandler, die beide das
>> selber Verhalten aufweisen.
>
> Billigteile, die die Norm nicht einhalten? Hierzu siehe
> https://de.wikipedia.org/wiki/RS-232#Definition

Ne, leider keine billigen

https://de.moxa.com/product/UPort_1150_1150I.htm

Hab jetzt hier leider auch keine anderen zum Testen zur Verfügung.


Max M. schrieb:
> Dietrich L. schrieb:
>> Wenn dabei die Spannung zu klein ist (nach Norm sollte der Sender bei
>> min. Lastwiderstand von 3kΩ mindestens +5V liefern), dann ist die Quelle
>> morsch, andernfalls der STK600.
>
> Du meinst RS232 über 3,7K OHM auf GND?
> Nein, habe ich noch nicht gemacht. Dann werde ich das jetzt testen.

Das Verhalten ist Ähnlich. Bei IDLE -4V, Daten gehen auf 1,5 - 2 V hoch.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Womit misst Du das? Mit einem Oszilloskop oder einem Voltmeter?

von Max M. (maxx2k15)


Lesenswert?

Rufus Τ. F. schrieb:
> Womit misst Du das? Mit einem Oszilloskop oder einem Voltmeter?

Oszilloskop (Tektronix MSO 4054)

von m.n. (Gast)


Lesenswert?

Max M. schrieb:
> Das Verhalten ist Ähnlich. Bei IDLE -4V, Daten gehen auf 1,5 - 2 V hoch.

Das kann passieren, wenn zwei Ausgänge gegeneinander arbeiten. 
Kurzschluß irgendwo?

von Max M. (maxx2k15)


Lesenswert?

m.n. schrieb:
> Max M. schrieb:
>> Das Verhalten ist Ähnlich. Bei IDLE -4V, Daten gehen auf 1,5 - 2 V hoch.
>
> Das kann passieren, wenn zwei Ausgänge gegeneinander arbeiten.
> Kurzschluß irgendwo?

Warum 2 Ausgänge?
Ich habe TX -> 2k7 OHM -> GND und dann Signal über den Widerstand 
angeschaut in dem Fall.
Jetzt gerade noch zum Testen TX -> 2k7 -> RX, schaut identisch aus.

KS ist auszuschließen, da ich gerade mit dem STK600 teste und nicht mit 
meiner eigenen Platine.

von Rainer U. (r-u)


Lesenswert?

Max M. schrieb:
> Das Senden vom Controller zum Computer funktioniert perfekt, das Senden
> vom Computer zum Controller dafür nicht. Und daher verzweifel ich hier
> langsam.

Verbinde mal zum Testen RX direkt mit TX auf einer Seite (direkt am AVR, 
ohne den Rest der Schaltung), dann auf der anderen Seite (direkt an den 
Pins des Usb-seriell-Wandlers) und sende jeweils 1 Zeichen. Du müsstest 
Dein gesendetes Zeichen im Hyperterminal als Echo und am AVR im 
Empfangsregister zurückbekommen.

Geht das?

: Bearbeitet durch User
von Max M. (maxx2k15)


Lesenswert?

So, die IT-Kollegen haben mich jetzt gerettet.

Es sind wohl tatsächlich BEIDE!!! Wandler defekt.
Ein Kollege hatte noch einen privaten im Rucksack, welcher jetzt auf 
Anhieb funktioniert.

Ich danke sehr für die super Hilfe, auf das Forum kann man sich einfach 
verlassen!

Dass beide den selben Defekt haben kann ich noch nicht ganz 
nachvollziehen, werde ich mal genauer untersuchen, wenn ich etwas Zeit 
über habe.

von Stefan F. (Gast)


Lesenswert?

Eventuell wurden die Adapter überlastet, weil sie an einen µC ohne 
Spannungsversorgung angeschlossen waren. Oder die Adapter waren für 3,3V 
ausgelegt und mit 5V konfrontiert.

Ich schalte zum Schutz immer 1k Ohm Widerstände in Reihe zu den Signal 
Leitungen. Dadurch kann ich zwar die ganz hohen Baudraten (über 115200) 
nicht mehr nutzen, aber das stört mich nur selten.

von Max M. (maxx2k15)


Lesenswert?

Überlastet?
Warum? Weil der µC dann einen Kurzschluss zu GND darstellt?
Es hängt ja eh nicht der Adapter direkt am µC, sondern dazwischen ist 
noch ein TI (MAX3232), der die Wandlung von 0 - 3V3 auf die +- (3-15) V 
vornimmt.
Hab jetzt im Datenblatt allerdings nicht zum Verhalten gesehen, wenn der 
nicht aktiv ist und dennoch ein aktiver RS232 Wandler dran hängt.

Aber dann schreibe ich das mal auf die Liste für V2 :)
Bei dem STK600 ist das dann halt eher nicht möglich.
Oder weißt du zufällig, ob da Serielle Rs verbaut sind?

Edit:
Ich Blindfisch:
Kap. 8.4.2:
When MAX3232 is unpowered, it can be safely connected to an active 
remote RS232 device. http://www.ti.com/lit/ds/symlink/max3232.pdf

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Überlastet?
> Weil der µC dann einen Kurzschluss zu GND darstellt?

Ja. Wenn der µC keine Spannungsversorgung hat und du dann von außen 
Spannung an irgendwelche I/O Pins legst, dann fließt viel Strom in den 
µC hinein.

Deswegen steht im Datenblatt, dass die Spannung an allen I/O Pins nicht 
höher sein darf, als ungefähr VCC + 0,5V.

> When MAX3232 is unpowered, it can be safely connected to an active
> remote RS232 device.

Damit ist dein CP gemeint.

Ich dachte an die umgekehrte Situation: Der PC und der MAX3232 haben 
Power, aber der AVR µC nicht.

Denkbar wäre noch ein dritter Fall: Der PC hat Power, der MAX3232 und 
der µC nicht. Liefert er dann eine Spannung an den µC?

von Max M. (maxx2k15)


Lesenswert?

Antwort gelesen und vergessen zu antworten....

Also wenn mein AVR Power hat, hat es der MAX3232 auch, die werden vom 
gleichen Regler versorgt.

Dein letzter genannter Fall fand oft statt. Meine Platine (bzw. STK600) 
aus sind, der RS232 Adapter hängt aber dennoch am USB. Werde mal messen, 
ob ich da was rausfinde.

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.