Forum: Mikrocontroller und Digitale Elektronik UART Problem beim senden


von Andreas H. (raucher91)


Angehängte Dateien:

Lesenswert?

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

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


Lesenswert?

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
von Andreas H. (raucher91)


Angehängte Dateien:

Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Andreas H. (raucher91)


Lesenswert?

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 ?

von spess53 (Gast)


Lesenswert?

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

von Andreas H. (raucher91)


Lesenswert?

Hey Ja es soll mit mehreren laufen
Was ist dieser Multi Mode Prozessor?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Andreas H. (raucher91)


Lesenswert?

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

von der alte Hanns (Gast)


Lesenswert?

Nun, vielleicht lag es am zum Multi Mode Prozessor mutierten 
Multi-Prozessor Mode.
(Was aber an dem einen Satz wohl zu 'bearbeiten' war?)

von spess53 (Gast)


Lesenswert?

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

von Max Haag (Gast)


Lesenswert?

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++;
  }

von Maximilian H. (maximilian_h88)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Maximilian H. (maximilian_h88)


Angehängte Dateien:

Lesenswert?

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
von Maximilian H. (maximilian_h88)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.