Forum: Mikrocontroller und Digitale Elektronik USART löst Interrupt nicht aus


von Christian K. (christiankarle)


Angehängte Dateien:

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

von Christian K. (christiankarle)


Lesenswert?

ATmega16 @ 8MHz

von Carl D. (jcw2)


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.

: Bearbeitet durch User
von Christian Karle (Gast)


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.

von Bastian W. (jackfrost)


Lesenswert?

Was für einen Transreciever hast du dran ?
Poste mal den Schaltplan.

Funktioniert es wenn du in der ISR einen Pin toggelst ?

Gruß JackFrost

von Christian Karle (Gast)


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...

von Carl D. (jcw2)


Lesenswert?

Christian Karle schrieb:
> 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.

Also du machst alles richtig, aber es geht trotzdem nicht.

Schade, dann kann ich dir leider nicht weiterhelfen ;-(

von Christian Karle (Gast)


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!

von Christian Karle (Gast)


Lesenswert?


von holger (Gast)


Lesenswert?

Toggle einen Pin egal ob test>100 ist oder nicht.
Wenn test immer <=100 ist wird auch nichts getoggelt.

von Christian Karle (Gast)


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...

von Bastian W. (jackfrost)


Lesenswert?

Prüf in Main das FE Flag in UCSRA und gib dir das auf einen Pin.

Deine Fuses sind richtig gesetzt oder ?

Mit welcher Spannung läuft der Mega16 ? Ist der Hi-Pegel von dem 
Transreciever nur 2 V. Oder meintest du mit den 2 V dem Bild 2 V / diff

Gruß JackFrost

von Christian Karle (Gast)


Lesenswert?

Es handelt sich um 2V/diff.

Ja, das FE Flag werde ich noch testen, sobald ich Zuhause bin.

von Christian Karle (Gast)


Lesenswert?

Mega läuft bei 8MHz bei 5V. Füße sin korrekt.

von Christian Karle (Gast)


Lesenswert?

Mega läuft bei 8MHz bei 5V. Fuses sin korrekt.

von Christian Karle (Gast)


Lesenswert?

Ist der C-Code in Ordnung? Stimmt die Reihenfolge in der ich in das 
Baudratenregister schreibe?

von Solder (Gast)


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

von S. Landolt (Gast)


Lesenswert?

Die eingangs gezeigten Messungen wurden unmittelbar an Pin D0 des 
ATmega16 gemacht?

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


Lesenswert?

Christian Karle schrieb:
> Stimmt die Reihenfolge in der ich in das Baudratenregister schreibe?
Sende doch einfach mal vom uC aus ein Zeichen, dann kannst du es am 
Oszi sehen...

von Christian Karle (Gast)


Lesenswert?

@ s. Landol -> korrekt!

von Jan S. (jannemann)


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

von Alexander S. (alex998)


Lesenswert?

Hallo,

kann es sein dass in Zeile 32 noch was fehlt?
 UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); //8N1

--> |

von Jan S. (jannemann)


Lesenswert?

Du meinst:
1
UCSRC |= ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); //8N1
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

von Alexander S. (alex998)


Lesenswert?

Jan S. schrieb:

> Nein, das sollte egal sein. Alle anderen Bits in dem Register sind schon
> null.

Ich glaube dass macht schon einen Unterschied. UCSRC und UBRRH teilen 
sich den Zugriff, könnte es sein dass der TO aus Versehen auf UBRRH 
schreibt?

von Bastian W. (jackfrost)


Angehängte Dateien:

Lesenswert?

Ich hab deinen Code mal auf nem Atmega32 ( ich hatte keinen Atmega16 da 
) getestet.

Der Atmega32 war auf dem STK500 montiert. Gesendet hab ich mit KiTTY und 
nem USB<->RS232 Adapter.

Fuses :

High 0x99
Low 0xE4

Hier läufts ohne Probleme.

Channel 0 ist RX und Channel 1 ist PB1.

Gruß JackFrost

von Sascha W. (sascha-w)


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

von Jan S. (jannemann)


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

von Carl D. (jcw2)


Lesenswert?

Christian Karle schrieb:
> 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.

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.