USART löst Interrupt nicht aus

OP #4559777
Lesenswert?
• ▲
▼
Guten Morgen,

nach vergeblicher Fehlersuche wende ich mich nun erneut an euch...
Ich habe mir für den PC unter Windows ein Programm geschrieben, welches 
über einen USB-to-RS485 Konverter Daten an einen uC sendet...

Das Problem ist nun folgendes:

Wenn ich die Daten sende, tritt beim AVR leider kein Interrupt auf, dies 
ist für mich völlig unverständlich, habe auch schon mehrmals das 
Datenblatt durchgekaut und komme einfach nicht weiter....

Am RS485 liegt das Problem nicht, habe es mit einem Logic-Analyzer 
getestet ( mehrmals den Wert 200 gesendet ) Bild im Anhang.

Ich habe den C-Code auf ein Minimum reduziert, nur um den USART zu 
testen... Leider vergeblich....

Schnittstelle:

9600 8N1

Mit verzweifelten Grüßen und der Bitte um Hilfe

Christian
Angehängte Dateien:
#4559786
Lesenswert?
• ▲
▼
Du mißt auch nicht, ob es einen Int gibt, sonder ob seine Zeichen 
richtig empfangen werden.
Also Pin am Anfang der ISR setzen und am Ende löschen.

Ob die Baudrate stimmt (nur dann kann man Frames korrekt empfangen), 
läst sich durch Senden ermitteln, denn dabei wird ein messbares Signal 
erzeugt. Beim Empfang zwar auch, aber dann stammt das Signal nicht von 
Prüfling.
Gast #4559788
Lesenswert?
• ▲
▼
Die Baudrate stimmt, wurde in einem anderen Thread bereits diskutiert... 
Wie du siehst wird in der ISR ein Pin getoggelt! Ich kann am Oszi jedoch 
nichts messen! Alle Versuche führten nicht zum Ergebnis.
Gast #4559792
Lesenswert?
• ▲
▼
Nein, der Pin wird nicht getoggelt, wenn ich einen Pin in der ISR 
toggle...

Den Hersteller des Transreceivers kenne ich leider nicht... Das 
Protokoll, das rauskommt scheint jedoch aufgrund der Messung mit dem 
Logic Analyzer zu stimmen und keine Timing Probleme zu haben...
Gast #4559794
Lesenswert?
• ▲
▼
Ich verstehe manchmal nicht, wieso solche Kommentare nötig sind... Ich 
gebe auch keine unqualifizierten Kommentare ab. Ich kann nur sagen, dass 
ich Messungen durchgeführt habe, sie bereits mit anderen 
Forenmitgliedern besprochen habe und sie korrekt erscheinen!

Falls du keinen qualifizierten Beitrag zur Problemlösung bietest, so 
unterlasse bitte diese Kommentare!
Gast #4559802
Lesenswert?
• ▲
▼
Hallo Holger :)

Ich habe das bereits schon getan, am Anfang der ISR nen Pin auf High und 
am Ende auf Low. zwischen dem getoggel habe ich auch nur einen readout 
von UDR gemacht, damit das Interfuptflag zurückgesetzt wird... Leider 
ohne Erfolg...
Gast #4559843
Lesenswert?
• ▲
▼
Hast du mal probiert, den Empfang ohne Interrupt zu machen? Einfach in 
der Dauerschleife das Bit für den Empfang im UART-Statusregister 
abfragen und wenn gesetzt das Datenregister auslesen. Ganz toll wäre es 
natürlich, die Daten dann auf einem 8 Bit Port auszugeben und abzulesen, 
ob wirklich das gewünschte Byte angekommen ist. (Im einfachsten Fall 
Binär mit 8 LED.) Solange das nicht passt, brauchst du mit Interrupt 
nicht weiter versuchen.

Noch davor, könntest du den UART Pin RxD als normalen Eingang schalten 
und ebenfalls in Dauerschleife gleich auf einem anderen Pin wieder 
ausgeben. Hier messen (LED), ob die Impulse auch ankommen, der ATMEGA 
diese überhaupt erkennt (Pegel und so).

Solder
#4559930
Lesenswert?
• ▲
▼
Moin,
die initialisierung sollte stimmen 
(http://www.atmel.com/images/doc2466.pdf).

1)Wie sieht es mit einem Schaltplan aus? Oder einem Foto der Schaltung.
2)Funktioniert die Schaltung? Ggf. mal ne LED blinken lassen oder einen 
Pin toggeln (passt die gemessene Frequenz zu der gewählten?)
1
#include <util/delay.h>
2
...
3

4
while(1){ //Ohne Gewähr
5
_delay_ms(1);
6
PORTB ^= ( 1 << PB1 );
7
}
-->  Jetzt sollte an B1 eine frequenz von 0,5kHz liegen.
Wenn alles OK, dann ggf. mal ein Zeichen senden. Und das mit dem LA 
aufnehmen.
3) Du scheibst, dass die FUSE Bits richtig gesetzt sind? Das kann ich 
von hier aus nicht überprüfen. Auf welchen Wert hast du sie gesetzt?

Da der Code richtig zu sein scheint, vermute ich den Fehler bei 1 oder 3

Grüße
#4560580
Lesenswert?
• ▲
▼
Jan S. schrieb:
> Du meinst:
>
1
> UCSRC |= ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); //8N1
2
>
> Nein, das sollte egal sein. Alle anderen Bits in dem Register sind schon
> null.
> Eigentlich könnte man sich die Zeile ganz sparen. Es ist der
> Init-Zustand des Avr
Diese Schreibweise währe sogar falsch, die "veroderung" führt erst zu 
einem Read des Registers, und wie es das Datenblatt schreibt wird dabei 
UBRRH gelesen. Erst ein darauffolgenes Read würde den Wert von UCSRC 
liefern.
Somit landet in UCSRC der Wert von UBRRH zuzüglich der gewünschten Bits.

Währe in dem Beispiel hier zwar egal da UBRRH = 0 ist, aber auch eine 
schöne Stoplerstelle..

Sascha
#4560876
Lesenswert?
• ▲
▼
Sascha W. schrieb:
> Diese Schreibweise währe sogar falsch,
> [...]
> Währe in dem Beispiel hier zwar egal da UBRRH = 0 ist, aber auch eine
> schöne Stoplerstelle..
Stimmt, das hatte ich ganz übersehen. Wirklich eine Stoplerstelle!

Bastian W. schrieb:
> Hier läufts ohne Probleme.

Das passt doch zu meiner Vermutung, dass etwas an der HW nicht stimmt... 
Abwarten, wann der TO weitere Infos nachlegt:
Jan S. schrieb:
> 1)[...]Schaltplan
> 3)[...] FUSE Bits
> 2)Funktioniert die Schaltung?
Punkt 2): wohl eher nein.

Grüße

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