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
volatileuint8_tmsg,msg_vorhanden=0;
11
12
intmain(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
voidusart_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
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...
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.
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.
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?
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
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.
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?
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.
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?
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.
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.
Ü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
> Ü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?
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.