Hallo Forumsmitglieder, Ich Hoffe ihr könnt mir helfen und zwar will Ich einen Atmega644p als Master in einem RS485 Bus betreiben mein Problem ist dass der Slave (Atmega8) alles Empfängt und auf seinen Befehl Antworten soll dies Tut er auch aber nur 1 mal dann empfängt er nur noch selbst wenn ich es ohne Bus mache also TX / RX direkt anschließe habe Ich das gleiche Problem. Woran könnte dies liegen ?? Danke und Gruß andy
Andreas Hermann schrieb: > Ich Hoffe ihr könnt mir helfen und zwar will Ich einen Atmega644p als > Master in einem RS485 Bus betreiben mein Problem ist dass der Slave > (Atmega8) alles Empfängt und auf seinen Befehl Antworten soll dies Tut > er auch aber nur 1 mal dann empfängt er nur noch selbst wenn ich es ohne > Bus mache also TX / RX direkt anschließe habe Ich das gleiche Problem. Hier mal ein paar Satzzeichen zum korrekten Einfügen in den obigen Text: ....,,,,!!?? > Woran könnte dies liegen ?? Und jetzt postest du die Frage besser nochmal mit Schaltplan und leserlicher Problembeschreibung und Quelltexten, die nicht auf .txt enden, sondern in deinem Fall auf .bas o.ä!
:
Bearbeitet durch Moderator
Okay dann mache Ich es nochmal richtig. Aufgabe: Ein Atmega644p dient als Master, dieser soll über einen RS485 Bus vorerst einen Atmega8 als Slave Ansprechen. Dieser Slave reagiert auf Adresse 132. Problemstellung: Der Slave Empfängt die Adresse 132 und Antwortet dem Master. Problem dieser Antwortet nur 1 mal, Empfangen tut er weiterhin. Erst nach einem Neustart des Slave sendet er wieder 1 mal eine Antwort . Auch wenn Ich den Aufbau ohne Bus gestalte ( TX vom Master an RX von Slave und RX vom Master an TX von Slave besteht dieses Problem) Ich hoffe Ich habe nun alle Regeln beachtet Danke, Gruß Andy
Hi Master: Dim Slave As Integer ... Slave = 132 ... Print #2 , Slave Slave: Dim Incomming_data As String * 10 ... Input Incomming_data Noecho ... If Incomming_data = "132" Then ... Im Master sendest du ein Integer und im Slave empfängst du einen String. An welcher Stelle kommt es zu dieser wundersamen Wandlung? Die USARTs der AVRs unterstützen einen einen Multiprozessor-Mode. Nur läuft der etwas anderes. MfG Spess
spess53 schrieb im Beitrag > > Im Master sendest du ein Integer und im Slave empfängst du einen String. > An welcher Stelle kommt es zu dieser wundersamen Wandlung? > > Die USARTs der AVRs unterstützen einen einen Multiprozessor-Mode. Nur > läuft der etwas anderes. > > MfG Spess Ohje des is ma garned aufgefallen. Also den Integer einfach in String ändern und dann geht's ?
Hi >Ohje des is ma garned aufgefallen. Also den Integer einfach in String >ändern und dann geht's ? BASCOM gehört definitiv nicht zu meinen Stärken. Aber an deiner Stelle würde ich als Adresse ein Byte und kein Integer benutzen. Auf der Slave-Seite dann einfach den Wert des empfangenen Bytes überprüfen. >Ein Atmega644p dient als Master, dieser soll über einen RS485 Bus >vorerst einen Atmega8 als Slave Ansprechen. Dieser Slave reagiert auf >Adresse 132. Soll das auch noch mit mehreren Slaves laufen? Wenn ja, würde ich dir dringend den schon erwähnten Multi-Prozessor Mode ans Herz legen. MfG Spess
Hey Ja es soll mit mehreren laufen Was ist dieser Multi Mode Prozessor?
Andreas Hermann schrieb: > Was ist dieser Multi Mode Prozessor? LOL. Wie wäre es wenn du zuerst mit LED blinken anfängst ?
:
Bearbeitet durch User
Marc Vesely schrieb: > Andreas Hermann schrieb: >> Was ist dieser Multi Mode Prozessor? > > LOL. > Wie wäre es wenn du zuerst mit LED blinken anfängst ? Wie kommst du auf deine "hilfreiche" Antwort?? Weil auf solche Antworten kann i verzichten Sry
Nun, vielleicht lag es am zum Multi Mode Prozessor mutierten Multi-Prozessor Mode. (Was aber an dem einen Satz wohl zu 'bearbeiten' war?)
Hi >Was ist dieser Multi Mode Prozessor? Aktuelles Datenblatt vom ATMega8 S.145: Multi-processor Communication Mode. Grundlage ist die Kommunikation mit 9 Bit und gesetztem MPCM-Bit in UCSRA der Slaves. Sendet der Master eine Adresse mit gesetzten Bit 8 wird diese von allen Slaves empfangen. Erkennt ein Slave die Adresse schaltet er sein MPCM-Bit ab und die Kommunikation zwischen Master und Slave läuft mit gelöschten Bit 8. Die restlichen Slaves bekommen davon aber nichts mit. Ist die Kommunikation zwischen Master und adressiertem Slave beendet setzt dieser das MPCM-Bit wieder und das Spiel kann von neuem beginnen. >Wie kommst du auf deine "hilfreiche" Antwort?? Weil auf solche Antworten >kann i verzichten Sry Ganz unberechtigt ist so eine Antwort nicht. Du lieferst hier fast 10 k Quellcode und hast grundlegende Routinen nicht mal richtig getestet. Gewöhne dir an kleinere Portionen zu schreiben und erst weiter machen wenn diese auf Herz und Nieren getestet sind. MfG Spess
Hallo, ich habe ein ähnliches Problem. Ich benutze einen STM32F103RBT6 und Keil µVision 5 auf einem Geschäftsintern designten Evalboard. Aufgabe: ein Datenlogger der auf eine vom benutzer definierte SPI-Rx oder Tx Adresse hört und diese über das Hyperterminal ausgibt. Momentan bin ich so weit, dass mein Datenlogger alles mitloggt und es fehlt nun an dem Benutzerdialog, dass ich auf eine bestimmte Adresse hören kann. Problem: ich erhalte kein recive Flag von meinem uart, wenn ich im Hyperterminal ein Zeichen eingebe, wodurch ich darauf schließe, dass ich auch kein Zeichen empfange. Wenn ich im Debugmode nachschaue was in meinem recive Register drinsteht, so wird mir 0x7F angezeigt was mach ich falsch, dass ich keine Daten erhalte USART_ClearFlag( USART3, USART_FLAG_RXNE ); while( USART_GetFlagStatus( USART3, USART_FLAG_RXNE ) == RESET ) {} if( USART_GetFlagStatus( USART3, USART_FLAG_RXNE ) == SET ) { for(;;) { result=(USART_ReceiveData(USART3) & 0xFF); if( result != 0 ) { USART_ClearFlag( USART3, USART_FLAG_RXNE ); break; } } result++; }
Nachtrag: ich sende/emfange über einen Max232 mit offiziell 460800 Baudrate. ich weiß das ist eigentlich zu schnell für den Baustein, ich habe auch einen Baustein bestellt, der 1MBaud kann, warte momentan aber noch darauf. ich habe den Empfang auch schon bei einer niedrigeren Baudrate probiert, allerdings klappt es auch da nicht. ich hab bis jetzt alle Baudrates durch, die mir das HT anbietet bis 115200 Baud Danke für eure Hilfe im Vorraus
Max Haag schrieb: > was mach ich falsch, dass ich keine Daten erhalte
1 | USART_ClearFlag( USART3, USART_FLAG_RXNE ); |
2 | while( USART_GetFlagStatus( USART3, USART_FLAG_RXNE ) == RESET ) |
3 | {}
|
4 | |
5 | /* Warum nochmal prufen ? Aber wenn schon, dann ist !== RESET irgendwie logischer.
|
6 | if( USART_GetFlagStatus( USART3, USART_FLAG_RXNE ) !== RESET )
|
7 | {
|
8 | */
|
9 | for(;;) |
10 | {
|
11 | |
12 | // result=(USART_ReceiveData(USART3) & 0xFF); //* Was genau willst du hiermit bezwecken ?
|
13 | |
14 | result=(uint8_t)USART_ReceiveData(USART3); //* Hoffentlich ist result als uint8_t deklariert |
15 | |
16 | if( result != 0 ) //* Wie willst du eine Null in Hyperterminal senden ? |
17 | {
|
18 | USART_SendData(USART3, (uint8_t)result); //* Zurucksenden ? |
19 | |
20 | // USART_ClearFlag( USART3, USART_FLAG_RXNE ); //* Machst du am Anfang, wieso hier wieder ?
|
21 | break; |
22 | }
|
23 | }
|
24 | result++; //* Wozu soll das gut sein ? |
25 | // }
|
Hoffe, dass dein USART_Init richtig ist.
Danke für die schnelle Antwort result ist als uint8 definiert. meine usart init hab ich mal angehängt das result++ ist nur ne dummyzeile, dass ich im watchfenster mehrere werte anschauen kann, weil ohne dummyzeile wird mir der Wert von result nicht im watch angezeigt. mit der null hast du recht...das ist sozusagen noch alt, als result nach dem RecieveData befehl immer 0 war. Darum ist eigentlich auch die ganze endlosschleife nutzlos :D der clearflag war zu Beginn, als ich den Code geschrieben hab noch an der zweiten Stelle, allerdings war dann der flag manchmal gesetzt, obwohl das unmöglich hätte sin dürfen, da der flag gelöscht war und ich nix im Hyperterminal eingegeben hatte, sondern einfach ein leeres HT vor mir hatte
:
Bearbeitet durch User
Zur Unterstützung häng ich jetzt mal einfach alle Dateien an, von denen ich glaub, dass sie auch nur im entferntesten was mit der empfangsroutine zu tun haben könnten, sofern ´die nicht von ST sind. Vielleicht fällt euch ja beim drüberschauen, va bei MyFunctions (;)) noch was auf, wie ich den ganzen spaß ein wenig eleganter ausdrücken kann :D PS: in der My Functions.c sind die letzten vier funktionen noch ungenutzt (möglicherweise fliegen auch die letzten beiden wieder raus), allerdings wäre ich euch sehr verunden, wenn euch eine elegante Methode einfällt, wie ich meinen Text, den ich bei s_Warning und s_UserSend verschick elegant auf einmal verschicken kann und nicht Zeichen für Zeichen, da dies zum einen relativ viel Speicher frisst und zum anderen extrem beindert ist da irgendwie am Text was zu ändern, bzw sich zurecht zu finden PSS: Ja ich habe die Forumsregeln gelesen und weiß, dass das Forum kein "entwickungsmarkt" ist, allerdings beschränken sich meine kenntnisse und mein können auf das was in der angehängten Dateien zu bewundern ist.....oder auch nich :) Nachtrag: Wenn ich mich nicht irre, dann sollte ja die Funktion
1 | result = USART_GetITStatus(USART3, USART_IT_RXNE); |
mir anzeigen ob ein interrupt ausgelöst wurde oder nicht. Für result erhalte ich im debugger, ohne dass Hyperterminal überhaupt offen ist eine 0x01. In der stm32f10x_uart.c wird SET (also dass das Bit gesetzt ist in dem Register) als !=RESET definiert und RESET=0.......aufgrund dessen nehme ich mal an, dass meine erhaltene 0x01 als aufgetretener Interrupt zu sehen ist. Sollte ich mich irren klatscht mir das (bitte mit Erklärung :DD) ins Gesicht Vielen Dank im Vorraus
:
Bearbeitet durch User
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.