mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart Bus vertausch Variable


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe 2 Atmega32 erst direkt Uart und dann per Max485 verbunden aber 
jedesmal taucht das selbe problem auf.
ich schicke nur 2 variablen von Controller 1. zu Controller 2.  am 
anfang geht alles wie gewollt, aber nach ein paar Minuten oder einen 
Reset werden die Variablen vertauscht, (Variable 1 hat den Wert von 
Variable 2.)

Controller 1. (der der nur sendet)
'----UART BUS-------------------------------------------------------------------
   Open "COMd.6:9600,8,N,1,inverted" For Output As #1       'TXD
   Open "COMd.7:9600,8,N,1,inverted" For Input As #2        'RXD
'----UART Bus Daten senden------------------------------------------------------
   Printbin #1 , Kreis01 ; Sa01


Controller 2. (empfänger)

'----UART BUS-------------------------------------------------------------------
Open "COMa.7:9600,8,N,1,inverted" For Output As #1          'TXD
Open "COMd.7:9600,8,N,1,inverted" For Input As #2           'RXD
'-------------------------------------------------------------------------------
Do

Inputbin #2 , Kreis01 , Sa01                                'Variable einlesen

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich geht dir ein Wert verloren z.B. weil keine Flusskontrolle 
vorhanden ist und der Empfänger gerade nicht empfangen kann, wenn der 
Sender sendet.

Du könntest z.B.

Brute-Force Wartezeiten zwischen den Sendevorgängen hinzufügen, in der 
Hoffnung, dass der Empfänger danach mit der Verarbeitung fertig ist.

Die Werte zusätzlich mit Kennung ("Wert1=...") oder Prüfsumme versenden, 
so dass ein teilweiser Datenausfall auf Empfängerseite erkannt wird.

Eine Rückmeldung des Empfängers einbauen, so dass der Datenausfall auf 
Senderseite erkannt wird und die Sendung ggf. wiederholt oder gebremst 
werden kann.

Z.B. dass der Empfänger selbst was sendet (XON/XOFF Verfahren) oder eine 
Handshake-Leitung verwenden (RTS/CTS Verfahren) s. RS232

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Da geht anscheinend etwas verloren. Allerdings sind deine Informationen 
mehr als dürftig.

MfG Spess

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

warum verwendest du einen Software-UART? Der Mega32 hat doch einen in 
Hardware.

Wie schnell hintereinander werden die Daten gesendet? Ist eine grössere 
Pause zwischen den Paketen?

> Printbin #1 , Kreis01 ; Sa01

Als was sind diese Variablen deklariert?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den Hardware Uart hatte ich erst, dann dachte ich aber das der Fehler 
damit zutuen hat, deswegen bin ich umgestiegen, die beiden variablen 
sind als Byte declariert!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian schrieb:
> den Hardware Uart hatte ich erst, dann dachte ich aber das der Fehler
> damit zutuen hat, deswegen bin ich umgestiegen,

Damit wird alles nur noch schlimmer.

Dein Problem ist, dass du keine wie auch immer geartete 
Steuerinformation hast, woran der Empfänger erkennen kann, was jetzt das 
erste Byte und was das zweite Byte ist.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie bekomme is das hin?

Autor: Ulrich E. (ulrich_e)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz einfach so:
Du musst 16Bit übertragen. Das verteiltst du jetzt auf 4Bytes(32Bit)
Byte1: 0b0000AAAA
Byte2: 0b0001AAAA
Byte3: 0b0010BBBB
Byte4: 0b0011BBBB

Danach einfach:
Variable1 = (Byte1 & 0x0F) | (Byte2 >> 4)
Variable2 = (Byte3 & 0x0F) | (Byte4 >> 4)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ulrich E. schrieb:
> ganz einfach so:
> Du musst 16Bit übertragen. Das verteiltst du jetzt auf 4Bytes(32Bit)
> Byte1: 0b0000AAAA
> Byte2: 0b0001AAAA
> Byte3: 0b0010BBBB
> Byte4: 0b0011BBBB
>
> Danach einfach:
> Variable1 = (Byte1 & 0x0F) | (Byte2 >> 4)
> Variable2 = (Byte3 & 0x0F) | (Byte4 >> 4)

Und das wichtigste:
Bei jedem Byte testen (anhand des oberen Nibbles) um welchen Teil der 
beiden Eregnisbytes es sich handelt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.