www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom CRC16 - Ich krieg die Krise.


Autor: Ralph Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich habe hier eine (funktionierende) Funkübertragung.
Gesendet wird ein Array (Word*5).

Array(5)...Array(2) sind Daten, Array(1) ist die per Bascom-Funktion 
errechnete CRC16 über Array(5)...Array(2).

Vergleiche ich im Empfänger gesendete und neu berechnete CRC, sind sie 
identisch. Fein.

Rechne ich die CRC16 über das gesamte Array, sollte dann "0" 
herauskommen.
Tut es aber nicht....

Der Programm-Code sieht so aus:
Cks = Crc16(rx_telegram(1) , 10)
Cks_tx = Rx_telegram(1)
Cks_rx = Crc16(rx_telegram(2) , 8)

Der Empfänger gibt z.B. folgendes per Terminal aus:
Cks = 5746
Cks_tx = 33491
Cks_rx = 33491

Welche Dusseligkeit mache ich hier?

Ratlose Grüße aus der Wesermarsch

Ralph

PS: Die Cks... sind alle als "Word" definiert.

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne mehr Quellcode ist es wie immer schwierig...

Hier mal ein paar Anregungen:

Die CRC16 Checksumme ist 2 Byte lang, also word oder integer.

Cks_tx = Rx_telegram(1)
Da wird einer Word-Variablen ein Byte zugewiesen?

Falls rx_telegramm(2) aus Bytearray ist, müßte das
Cks_rx = Crc16(rx_telegram(3) , 8), oder falls WordVar
Cks_rx = Crc16(rx_telegram(2) , 4) heissen.

MFG
screwdriver

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
screwdriver schrieb:
> Cks_rx = Crc16(rx_telegram(2) , 4) heissen.

Das war Unsinn.

Um ein Array inklusive CRC-Checksumme auf Null zu testen, muß die 
Checksumme zuletzt durch den CRC-Generator laufen, d.h. die 
CRC-Checksumme muß in der Variablen Array(5) stehen. Ausserdem sind LSB 
und MSB zu vertauschen.

Beispiel:
Dim Array(5) As Word
Dim Bytearray(10) As Byte At Array(1) Overlay
Dim Wtemp As Word

Array(1) = 1
Array(2) = 3
Array(3) = 5
Array(4) = 7



Array(5) = Crc16(bytearray(1) , 8)
Print Array(5)

Wtemp = Array(5)
Bytearray(9) = High(wtemp)
Bytearray(10) = Low(wtemp)

Wtemp = Crc16(bytearray(1) , 10)
Print Wtemp

Do
Loop

Autor: Ralph Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin screwdriver,

screwdriver schrieb:
> Ohne mehr Quellcode ist es wie immer schwierig...

Na, ob der Bandwurm (mitten in der Bastelphase) mehr Klarheit 
brächte...:-)


> Die CRC16 Checksumme ist 2 Byte lang, also word oder integer.

Klar; ist als Word definiert.

> Cks_tx = Rx_telegram(1)
> Da wird einer Word-Variablen ein Byte zugewiesen?

Nö. Rx_telegram ist wie folgt definiert:

dim rx_telegram(5) = word

rx_telegram(1) ist das erste Element des Array, also ne Word-Variable.

> Falls rx_telegramm(2) aus Bytearray ist, müßte das
> Cks_rx = Crc16(rx_telegram(3) , 8), oder falls WordVar
> Cks_rx = Crc16(rx_telegram(2) , 4) heissen.

Hm. Ich verstehe die Bascom-Hilfe anders.

Sei a = Crc16(b , c),

dann ist "b" das erste Element zur CRC-berechnung (also ne Word, 
genauer rx_telegram(1)) und c die Anzahl der Bytes. Oder bin ich genau 
hier auf dem Holzweg?

Cks_rx und Cks_tx werden ja auch völlig korrekt berechnet und sind 
(fast) immer gleich.

Lediglich die CRC16 über das gesamte Telegramm (also incl. Checksumme in 
rx_telegram(1)) wird nicht null. Was es werden sollte, wenn ich den 
Algorithmus richtig verstanden habe...

Danke fürs Gedanken-machen!


Ralph

Autor: Ralph Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

da haben wir uns überschnitten.

screwdriver schrieb:


> Um ein Array inklusive CRC-Checksumme auf Null zu testen, muß die
> Checksumme zuletzt durch den CRC-Generator laufen,

Ahaaa....
Das wäre die Erklärung.

Das probiere ich gleich mal aus. An den Sender komme ich gerade nicht 
heran (der liegt zum Dauertest draußen im Schnee), da werde ich mal eben 
im Empfänger ein bisschen pfuschen.

Ich sach dann Bescheid :-)

Ralph

Autor: Ralph Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bescheid!

So, jetzt habe ich mal ein neues Test-Array angelegt, mit den Daten des 
empfangenen Telegramms passend befüllt und das oberste Element um 8 
rotiert.

Bingo!
Die Prüfsumme ist auf wundersame Weise null.

Ganz herzlichen Dank!

Ralph

der sich jetzt diesem mistigen PCF8583 zuwenden kann. Das Ding will auch 
nicht sowie ich es gerne hätte.

Autor: screwdriver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph Fischer schrieb:
> ....und das oberste Element um 8 rotiert.

Nur zur Info:

rotate wtemp,righ,8
-> 75 Cycles

rotate wtemp,left,8
-> 68 Cycles

Wtemp = Array(5)
Bytearray(9) = High(wtemp)
Bytearray(10) = Low(wtemp)
-> 30 Cycles

Falls mal eng werden sollte!

screwdriver

Autor: Ralph Fischer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich noch mal...

screwdriver schrieb:
> Wtemp = Array(5)
> Bytearray(9) = High(wtemp)
> Bytearray(10) = Low(wtemp)
> -> 30 Cycles

Dankeschön :-)
Gut zu wissen.

Allerdings verbringt der Controller eh die meiste Zeit mit Nasebohren 
(bzw. Warten darauf, daß alle paar Minuten ein Telegramm eintrudelt).

Die gesamte Auswertung passiert noch mit Floats; eigentlich ein 
Wahnsinn.

Aber so langsam läuft der ganze Kram (soll ein Telemetriesystem 
(RFM01/02) für bis zu 32 Sender mit verschiedenen Sensoren werden).

Dann gehts ans Aufräumen. Zumindest der Empfangsstart wird dann in ne 
ISR gepackt.

Sollte es mal richtig eng werden, muß ich halt meine 
Assembler-Kenntnisse modernisieren.
Die sind gut 25 Jahre eingerostet (Z80) ;-)

Jucken würden mich diese Risc-Teile ja schon...

Danke noch mal!

Ralph

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.