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
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
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.
Was für einen Transreciever hast du dran ? Poste mal den Schaltplan. Funktioniert es wenn du in der ISR einen Pin toggelst ? Gruß JackFrost
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...
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 ;-(
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!
Toggle einen Pin egal ob test>100 ist oder nicht. Wenn test immer <=100 ist wird auch nichts getoggelt.
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...
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
Es handelt sich um 2V/diff. Ja, das FE Flag werde ich noch testen, sobald ich Zuhause bin.
Ist der C-Code in Ordnung? Stimmt die Reihenfolge in der ich in das Baudratenregister schreibe?
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
Die eingangs gezeigten Messungen wurden unmittelbar an Pin D0 des ATmega16 gemacht?
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...
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
Hallo, kann es sein dass in Zeile 32 noch was fehlt? UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); //8N1 --> |
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
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?
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.