www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Denkanstoß - BER Berechnung


Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich empfange mit einem µC (Renesas M32C) (über den UART) meine gesendete 
Zeichen, welche von einem 2. µC gesendet werden.

Bsp:
10101010 | 10101010 | 01010101 | 01010101 | 01010101
einschwing - preamble - data      data        data

(dies wird zum bsp. alle 5ms gesendet)


Mein programm war zuerst so geschrieben, dass die ersten beiden zeichen 
ignoriert werden und erst danach ein bitvergleich stattfindet.

Ich möchte aber die Zeichen nicht einfach ignorieren
zum Bsp:
1. Zeichen ignorieren
2. Zeichen auswerten, wenn ja dann bitvergleich, wenn nein dann wieder 
auf neuen anfang warten oder so ...

Ich weiß grad nicht wie ich genau auf den neuen anfang warten soll.
Immoment ist es so:

if(empfanges Zeichen == 0xAA)
 // Bitvergleich
else
 // 3 Zeichen einlesen und verwerfen

Aber das genau so ein Käse...

Vielleicht hat von euch schon jemand etwas in der <Richtung programmiert 
und kann mir einen Denkanstoß geben.

Gruß Timo

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

Bewertung
0 lesenswert
nicht lesenswert
Bei deinem Problem würde es sich anbieten einen Zeichenzähler
als 'Schmalspur-Statemachine' einzusetzen

als Pseudo-Code
  Zaehler = 0

  while( 1 ) {    // die klassische main-Hauptschleife

    if( Zeichen empfangen ) {

      if( Zaehler == 0 ) {     // müsste das das Einschwingzeichen sein?
        if( Zeichen == 0xAA ) // ist es richtig ?
          Zaehler++;       
      }

      else if( Zaehler == 1 ) {    // das muesste jetzt die Preambel sein
        if( Zeichen == 0xAA )      // ist sie richtig ?
          Zaehler++;
        else
          Zaehler = 0;             // nein: zurück an Anfang
      }

      else {                       // Zeichen 2 bis 4: Daten
        if( Zaehler == 4 )         // Wenns das letzt Datenzeichen war
          Zaehler = 0;             // dann muss wieder das Einschwingzeichen
                                   // kommen
        mach was mit den Zeichen
      }
    }
  }

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es mit einem kleinen Automatenrealisieren:

state = 0;
while(true) {
 zeichen = recive();
 
 switch (state)
  case 0:
   if (zeichen == 0xAA) 
    state = 1
   break

  case 1:
   if (zeichen == 0xAA) 
    bitergleich(zeichen)
    state = 2
   else
    state=0
   break
  case 2:
   savedata(zeichen)
   if (datenende)
    state = 0
  break;
}
ist jezt natürlich pseudocode aber prinzip sollte klar sein.

Mist und der Karlheinz war schneller :( wein

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn "einschwing" das bedeutet, wie es heißt, d.h. daß das Byte 
korrumpiert sein kann, dann ist die UART hoffnungslos am Arsch.

Für die UART sind nur solche Zeichen zum Synchronisieren erlaubt, die 
außer dem Startbit keine weiteren 1-0 Flanken enthalten, z.B. 0xF0 ist 
o.k.


Peter

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ja die beiden codebsp sind klar und daran hab ich auch gedacht ..
nur hab ich das problem, dass direkt das erste zeichen bei der 
funkübertragung nicht immer zu 100% ankommt und die erste 10101010 als 
11101010 erkannt wird .. und da liegt hauptsächlich mein problem.

weil dadurch verliere ich ein haufen pakete.

der versuchsaufbau ist dafür da die bitfehlerrate der funkstrecke zu 
testen

gruß

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo wrote:
> nur hab ich das problem, dass direkt das erste zeichen bei der
> funkübertragung nicht immer zu 100% ankommt und die erste 10101010 als
> 11101010 erkannt wird .. und da liegt hauptsächlich mein problem.

Ja, das ist ja genau meine Rede.
Die UART hat keine Nase, womit sie riechen kann, was die Daten sind.
In der Technik muß man immer eindeutige Signale einsetzen.

Nimm 0xF0 zur Synchronisation und dann klappts auch.


Peter

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.