Forum: Mikrocontroller und Digitale Elektronik CRC16 Berechnung (XModem)


von Wolfgang Z. (wolfzi99)


Angehängte Dateien:

Lesenswert?

Hallo,
ich benötige die Berechnung nach CRC16 XModem und habe dazu folgendes 
Modul in C gefunden.
Leider kann ich aber kein C.
Kann mir jemand dieses nach Luna-AVR übersetzen? oder in einen anderen 
Basic-Dialekt (VBA).
Gruß

von Suchet und ihr werdet finden (Gast)


Lesenswert?


von Uwe D. (monkye)


Lesenswert?

Es gibt eine Library in LunaAVR - finde ich auch sofort mit „Goggl“.

von Wolfgang Z. (wolfzi99)


Lesenswert?

Wahrscheinlich!
Und vielen Dank für die "nette" Antwort.

von Wolfgang Z. (wolfzi99)


Lesenswert?

Hallo Uwe,
Ja, die ist mir bekannt.
Aber die benutzt ein anderes Polynom und rechnet nach CRC16-CCITT.
Kann ich also nicht verwenden.
Gruß

von Suchet und ihr werdet finden (Gast)


Lesenswert?

Wolfgang Z. schrieb:
> Wahrscheinlich!
> Und vielen Dank für die "nette" Antwort.

Wenn Du nett willts dann geh zur Oma.
Wenn du ne passende CRC willst, dann lerne wie man in einen Code den 
Algorithmus aus einem anderen Coder verpflanzt.

So eine CRC-Summe ist doch nix weiter als XOR und bit shift, das kann 
auch BASIC:
http://lua-users.org/wiki/BitwiseOperators

Für Doofe, gefunden mit:
https://www.google.com/search?client=firefox-b-d&q=lua+BASIC+XOR+bit+shift&oq=&aqs=

von Alex D. (allu)


Lesenswert?

Suchet und ihr werdet finden schrieb:
> Zu doof für google ?

Wofür dann ein Forum wie mikrocontroller.net, wenn man eh nur Google 
fragen darf ?

von Wolfgang Z. (wolfzi99)


Lesenswert?

Hallo Alex,
das sehe ich auch so.
Danke für Deine Unterstützung!

von Gegeg J. (Gast)


Lesenswert?

jep, ohne Google würden hier einige ziemlich blöd aus der Wäsche gucken.
DIe haben nie gelernt wie eine soziale Gemeinschaft funktioniert...sind 
halt oft Nerds...die nie Freunde hatten und sich immer alleine 
durchboxen mussten.
Also nicht verärgert über die sein, sie können nichts dafür:-( 
Eigentlich sollte man ihnen eher helfen, abr das ist oft zu spät, sie 
wollen gar kein Sozialverhalten mehr..es fehlt die Grundlage im Gehirn, 
dieser bildet sich bis 25 Jahre aus, danach haben sie es schwer.
Ist auch nichts anderes als eine geistige Behinderung und daher sollte 
man auch nicht über solche Menschen herziehen

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Alex D. schrieb:
> Wofür dann ein Forum wie mikrocontroller.net, wenn man eh nur Google
> fragen darf

Er fragt ja nicht wie er es machen könnte sondern sagt, dass es einer 
für ihn machen soll.
Dementsprechend weht dann eben auch der Wind.

Hilfe zur Selbsthilfe ja.
Hilfe zum Faullenzen gibts hier eben nicht.

Vor allem Code als Bild anfügen, gehts noch?

Vor allemw as wird denn an dem Code nicht verstanden?
zB der VBA Schiebeoperator sieht 1zu1 aus wie in C.
Ansonsten ist die Syntax auch nicht so anders, der TO hats also nicht 
mal versucht.

von STK500-Besitzer (Gast)


Lesenswert?

Gegeg J. schrieb:
> jep, ohne Google würden hier einige ziemlich blöd aus der Wäsche gucken.
> DIe haben nie gelernt wie eine soziale Gemeinschaft funktioniert...sind
> halt oft Nerds...die nie Freunde hatten und sich immer alleine
> durchboxen mussten.

Andererseits gibt es hier häufig Fragen, die man durch einfaches Googlen 
innerhalb kürzester Zeit beantwortet bekommt.

Ich stimme zu, dadd die Antwort von "Suchet und ihr werdet finden 
(Gast)" war nicht wirklich freundlich formuliert war. Sowas kann man 
netter rüberbringen.
Und wenn man genervt ist, kann man sich etwaige Antworten auch einfach 
sparen.

von Gegeg J. (Gast)


Lesenswert?

"Vor allem Code als Bild anfügen, gehts noch?"

komisch in etlichen anderen Foren machen das die Leute sehr gerne und 
helfen..nur hier sind halt die gescheiterten Nerds die frustriert alles 
selber lernen mussten, da ihnen nie Freunde geholfen haben.
Und sie zu hause eine dicke, wenig attraktive Freundin haben oder gar 
keine..

von Alex D. (allu)


Lesenswert?

Mw E. schrieb:
> Vor allemw as wird denn an dem Code nicht verstanden?
> zB der VBA Schiebeoperator sieht 1zu1 aus wie in C.
> Ansonsten ist die Syntax auch nicht so anders, der TO hats also nicht
> mal versucht.

D.h. du könntest ihm problemlos helfen, möchtest aber nicht ...

Warum verschwendest du dann deine wertvolle Zeit mit nicht hilfreichen 
Antworten ?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Alex D. schrieb:
> D.h. du könntest ihm problemlos helfen, möchtest aber nicht

Wieso? Er möchte doch keine Hilfe, sondern nur einen Dummen der seine 
Arbeit macht.

von Wolfgang Z. (wolfzi99)


Lesenswert?

Ich brauche keinen "Dummen" der meine Arbeit macht.
Natürlich habe ich es schon selbst versucht, aber nicht hinbekommen.
Meine Programmier-Versuche hatten nicht das gewünschte Ergebnis.
Darum habe ich mich an das Forum gewandt, mit der Hoffnung, dass jemand
schon eine fertige Routine dafür hat.
Warum das Rad nochmal erfinden!

von STK500-Besitzer (Gast)


Lesenswert?

Wolfgang Z. schrieb:
> Darum habe ich mich an das Forum gewandt, mit der Hoffnung, dass jemand
> schon eine fertige Routine dafür hat.
> Warum das Rad nochmal erfinden!

Und genau deswegen kommt dann gerne der Hinweis zu googlen.
Die Wahrscheinlichkeit, dass jemand solchen Algorithmus in Luna-AVR hier 
im Forum schon erstellt hat, ist geringer, als im restlichen Internet.

Wolfgang Z. schrieb:
> Meine Programmier-Versuche hatten nicht das gewünschte Ergebnis.

Die du uns ja wunderbar vorenthalten hast.
In Foren sollte man nach Hilfe fragen, und nicht nach fertigen Lösungen.

von Bernd K. (prof7bit)


Lesenswert?

STK500-Besitzer schrieb:
> Die Wahrscheinlichkeit, dass jemand solchen Algorithmus in Luna-AVR hier
> im Forum schon erstellt hat, ist geringer, als im restlichen Internet.

Genau so siehts wahrscheinlich aus. Ich würde mich mit der Frage an die 
kleine versprengte Enklave wenden in der die 12 Programmierer 
eingesperrt sind die das tatsächlich selbst verwenden, jeder von denen 
wird in der Lage sein das im Handumdrehen zu portieren. Hier jedoch ist 
es eher unwahrscheinlich denn um funktionsfähige Code abzuliefern müsste 
man ja erstmal selbst eine funktionierende Umgebung für dieses exotische 
Luna-Plattform griffbereit haben und die Sprache beherrschen, und wer 
hat das schon?

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Wolfgang Z. schrieb:
> Darum habe ich mich an das Forum gewandt, mit der Hoffnung, dass jemand
> schon eine fertige Routine dafür hat.

Das steht da oben aber nicht ;)
Da steht:
Wolfgang Z. schrieb:
> Kann mir jemand dieses nach Luna-AVR übersetzen?

Also eine Handlungsanweisung und nicht "hat da wer für mich?".

Wolfgang Z. schrieb:
> Natürlich habe ich es schon selbst versucht, aber nicht hinbekommen.
> Meine Programmier-Versuche hatten nicht das gewünschte Ergebnis.

Sowas enthält man dann aber beim Eröffnugspost nicht vor, sondern fragt 
wieso das nicht funktioniert.

von Wolfgang Z. (wolfzi99)


Lesenswert?

Okay, habe ich verstanden!
Trotzdem Danke für die Hinweise.
Bin nun mal nicht der Foren-Experte.

von Gegeg J. (Gast)


Lesenswert?

"In Foren sollte man nach Hilfe fragen, und nicht nach fertigen 
Lösungen."

aha...in anderen Foren hat man dazu eine weniger Einzelngänger 
Meinung...
So  eine meinung haben irgendwie die Typischen C 
Programmierer...offensichtlich frustriert C dauerhaft

von Roland F. (rhf)


Lesenswert?

Hallo,
Mw E. schrieb:
> Das steht da oben aber nicht ;)
> Da steht:
> Wolfgang Z. schrieb:
>> Kann mir jemand dieses nach Luna-AVR übersetzen?
>
> Also eine Handlungsanweisung und nicht "hat da wer für mich?".

Also für mich ist das eindeutig eine Frage und keine Handlungsanweisung.

rhf

von STK500-Besitzer (Gast)


Lesenswert?

Gegeg J. schrieb:
> aha...in anderen Foren hat man dazu eine weniger Einzelngänger
> Meinung...

Dann bin ich lieber Einzelgänger, der nicht noch irgendwelche Leute mit 
durchs Studium schleppen musste, die nur konsumiert haben.

> So  eine meinung haben irgendwie die Typischen C
> Programmierer...offensichtlich frustriert C dauerhaft

Wenn du meinst.
Hast du schon was zur Problemlösung statt weiterer Erderwärmung durch 
die Produktion unnütiger, heißer Luft beigetragen?

von test (Gast)


Lesenswert?

Die Frage ist eher... Warum programmiert man eigentlich wenn man 
überhaupt keinen Bock aufs programmieren hat? Es gibt genug andere 
Hobbys die man sich suchen kann.
Das verstehe ich wirklich nicht wenn ich hier diese Art von Fragen lese.

von Roland F. (rhf)


Lesenswert?

STK500-Besitzer schrieb:
> Hast du schon was zur Problemlösung statt weiterer Erderwärmung durch
> die Produktion unnütiger, heißer Luft beigetragen?

Und wie schätzt du deinen Beitrag zur Problemlösung in dieser Diskussion 
ein?

rhf

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


Lesenswert?

Wolfgang Z. schrieb:
> Okay, habe ich verstanden!
> Trotzdem Danke für die Hinweise.
> Bin nun mal nicht der Foren-Experte.

 Aber du hast dir nicht mal die Mühe gemacht Source abzutippen oder dein
 mißglücktes Versuch in Basic anzuhängen, statt dessen ein .PNG und
 Erklärungen wie du es versucht hast.

 Btw. das C-Programm ist auch nicht optimal.
1
     if(crc & 0x8000) {
2
        crc <<= 1;          //*** Shift wenn Richtig
3
        crc ^= 0x1021;
4
     } else {
5
        crc <<= 1;          //*** Shift wenn Falsch auch
6
     }

 Versuch es mal hiermit:
1
 crc = partial
2
 For i = 0 To len - 1
3
    c = ((crc>>8) And &HFF)
4
    c = c Xor *ptr
5
    ptr += 1
6
    crc = (CUShort(c)<<8) Or (crc And &HFF)
7
    For j = 0 To 7
8
       crc <<= 1
9
       If crc And &H8000 Then
10
          crc = crc Xor &H1021
11
       End If
12
    Next j
13
  Next i
14
  Return crc

 Und das nächste Mal Source als Datei oder Text mitschicken, auch
 dein (angebliches) C=>Basic Versuch.
 Wetten, daß die Antworten dann ganz anders aussehen?

 P.S.
 Aus dem Kopf auf die schnelle, nicht sicher ob das so richtig ist.
 Pointer in Basic ist VarPtr, so weit ich mich erinnere...

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

Roland F. schrieb:
> Und wie schätzt du deinen Beitrag zur Problemlösung in dieser Diskussion
> ein?

Nicht wirklich effektiv. Von meiner Seite kommen aber keine wilden 
Thesen bzgl. Frustrationgründen.

von Uwe D. (monkye)


Lesenswert?

Wolfgang Z. schrieb:
> Hallo Uwe,
> Ja, die ist mir bekannt.
> Aber die benutzt ein anderes Polynom und rechnet nach CRC16-CCITT.
> Kann ich also nicht verwenden.
> Gruß

Der Hinweis hätte mir genügt eine andere Antwort zu formulieren. Nicht 
jeder kennt jede sprachliche Besonderheit in einer der vielen 
Basic-Dialekte. Dein Motiv kann ich durchaus verstehen.

von Uwe D. (monkye)


Lesenswert?

Schau Dir mal die Implementierung bei BASCOM an, hier der Link 
https://avrhelp.mcselec.com/index.html?crc16.htm

Da ist ein Beispiel im unteren Teil der Hilfe.

von Wolfgang Z. (wolfzi99)


Lesenswert?

Hallo Uwe,

vielen Dank.
Dieser Teil zeigt mir, dass es sich um das richtige Polynom handelt:

For J = 0 To 7 Step 1 ' for each bit
    CRC1 = shl(CRC1, b)
    If b Then CRC1 = CRC1 Xor &H1021
Next J

Werde ich gleich morgen nach LunaAVR überführen und dann testen.

von Suchet und ihr werdet finden (Gast)


Angehängte Dateien:

Lesenswert?

Da das BASIC-beispiel aus dem ersten von mir genannten Link:

1
REM crc%   = incoming CRC
2
REM start% =>start of data
3
REM num%   = number of bytes
4
:
5
FOR addr% = start% TO start% + num% - 1
6
  crc% = crc% EOR 256* ?addr%                   :REM EOR with current byte
7
  FOR bit% = 1 TO 8                            :REM Loop through 8 bits
8
    crc% = crc% + crc%                           :REM Move crc% up one bit
9
    IF crc% AND &10000 : crc% = crc% EOR &11021  :REM EOR with XMODEM polynomic
10
  NEXT bit%                                  :REM Ensuring CRC remains a 16-bit value
11
NEXT addr%
12
:
13
REM crc% = outgoing CRC

Bit shifts sind durch Multiplikationen mit Zweierpotenzen realisiert, 
das EOR steht wohl für XOR also exklusiv-OR. Details zum benutzen 
Basic-Dialekt finden sich dort: 
http://www.bbcbasic.co.uk/bbcwin/manual/bbcwin2.html#operators

Es sollte doch nicht schwer sein das durch VBA zu prügeln, zumal in den 
Kommentaren die jeweilige Operation in plain english genannt wird.
Im Anhang derselbe Code als Textdatei.

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


Lesenswert?

Wolfgang Z. schrieb:
> Hallo Uwe,
>
> vielen Dank.
> Dieser Teil zeigt mir, dass es sich um das richtige Polynom handelt:
> Werde ich gleich morgen nach LunaAVR überführen und dann testen.

 Deine Antwort zeigt mir, daß du überhaupt nichts kapiert hast.
 Und auch, daß du Luna nicht kannst.
 Luna hat genau dieselben Shift und logishe Operatoren wie C.
 Also hättest du die meisten Zeilen einfach abschreiben können.

 Und der Beispiel in Bascom ist so etwas von retarded...
 Es wird unnötig eine Funktion kreiert und aufgerufen...
 In dieser Funktion werden lokalen Variablen unnötig Werte zugewiesen...
 Überall wird mit Long gerechnet, anstatt einfach bit 15 zu prüfen...
 Function CRC16 wird as Integer deklariert, d.h. von -32,768 bis +32,767
 Bascom hat auch Word als Data type.
 usw. usw.

 Ich habe es nicht ausprobiert, kann aber wetten, daß der Beispiel in
 Bascom falsche Werte liefert.

von Uwe D. (monkye)


Lesenswert?

Marc V. schrieb:
> Wolfgang Z. schrieb:
>> Hallo Uwe,
>>
>> vielen Dank.
>> Dieser Teil zeigt mir, dass es sich um das richtige Polynom handelt:
>> Werde ich gleich morgen nach LunaAVR überführen und dann testen.
>
>  Und der Beispiel in Bascom ist so etwas von retarded...
>  Es wird unnötig eine Funktion kreiert und aufgerufen...
>  In dieser Funktion werden lokalen Variablen unnötig Werte zugewiesen...
>  Überall wird mit Long gerechnet, anstatt einfach bit 15 zu prüfen...
>  Function CRC16 wird as Integer deklariert, d.h. von -32,768 bis +32,767
>  Bascom hat auch Word als Data type.
>  usw. usw.
>
>  Ich habe es nicht ausprobiert, kann aber wetten, daß der Beispiel in
>  Bascom falsche Werte liefert.

Da wettest Du falsch.
Im Beispiel geht es um das WIE und nicht um das OPTIMAL.

Und das es in BASCOM gewisse Beschränkungen gibt im Syntax ist halt so, 
damit sieht der Code halt ein bissel anders aus - Du musst ja BASCOM 
nicht verwenden.

von Uwe D. (monkye)


Lesenswert?

Nachtrag: @Wolfgang, lies mal hier im Nachbarforum zu den 
Unterschieden...


https://stackoverflow.com/questions/4455257/crc16-checksum-hcs08-vs-kermit-vs-xmodem

von Detlef _. (detlef_a)


Lesenswert?

Hier reiten ja wieder die Trolle.

Habe die CRC Frage für mich hier
Beitrag "Yet another CRC32 Code"
final gelöst.

Vllt. hilfts ja.

Cheers
Detlef

: Bearbeitet durch User
von Wolfgang Z. (wolfzi99)


Lesenswert?

Hallo Uwe,
Danke für den Hinweis.
Diese Seite hat mich auf eine Idee gebracht (und schon umgesetzt).
Ich bestimme die CRC16-Werte mittels eines Online-Calculators:
https://crccalc.com/
Dann habe ich alle benötigten Prüfsummen als Konstante in mein Programm
eingefügt und hänge diese dann jeweils an die Befehle für das UART 
SD-Karten-Modul.
Das funktioniert ohne Probleme und ich kann die Daten von der SD-Karte 
lesen.
Nachteil: die gesendeten Byte-Folgen dürfen nicht geändert werden!
Klar, nicht gerade die eleganteste Lösung, aber damit komme ich jetzt in 
meinem Projekt weiter.

Gruß
Wolfgang

von Das dass das das !!! (Gast)


Lesenswert?

Wolfgang Z. schrieb:
> Nachteil: die gesendeten Byte-Folgen dürfen nicht geändert werden!
> Klar, nicht gerade die eleganteste Lösung, aber damit komme ich jetzt in
> meinem Projekt weiter.

Vielleicht hilft dir ein Tabellenbasierter CRC weiter. Hier hatte einer 
ein ähnliches Problem:
Beitrag "CRC 8 Probleme bei cyclic redundancy check"

Also erst den Tabellengenerator aus dem "Painless Guide To CRC" bemühen,
https://www.google.com/search?q=painless+guide+to+crc
dann mit Testvektoren aus https://www.google.com/search?q=autosar+crc 
bzw. auch deine SD-Kartenbefehle testen.
Viel Erfolg!

von Rainer V. (a_zip)


Lesenswert?

Wolfgang Z. schrieb:
> Nachteil: die gesendeten Byte-Folgen dürfen nicht geändert werden!
> Klar, nicht gerade die eleganteste Lösung, aber damit komme ich jetzt in
> meinem Projekt weiter.

Also das ist doch auch wieder Kokolores...wenn du eh feste Byte-Folgen 
senden mußt, dann kannst du doch gleich im Empfänger vergleichen oder!?
Gruß Rainer

von Wolfgang Z. (wolfzi99)


Lesenswert?

Hallo Rainer,

der Empfänger ist ein gekauftes SD-Karten Modul mit einer 
UART-Schnittstelle,
dass eine Prüfsumme der gesendeten Byte benötigt.
Daran kann ich nichts ändern.
Den CRC-Check kann man auch nicht deaktivieren, leider!

Gruß
Wolfgang

von Rainer V. (a_zip)


Lesenswert?

Wolfgang Z. schrieb:
> der Empfänger ist ein gekauftes SD-Karten Modul mit einer
> UART-Schnittstelle,
> dass eine Prüfsumme der gesendeten Byte benötigt.
> Daran kann ich nichts ändern.
> Den CRC-Check kann man auch nicht deaktivieren, leider!

Ok, habe ich so nicht verstanden, aber immer gleiche Bytefolgen ist doch 
trotzdem blöd oder?!
Gruß Rainer

von Wolfgang Z. (wolfzi99)


Lesenswert?

Ja, ist es!
Aber da es so funktioniert, ist erstmal OKAY für mich.

von Rainer V. (a_zip)


Lesenswert?

Ok, dann alles Gute!
Gruß Rainer

von Wolfgang Z. (wolfzi99)


Lesenswert?

Hallo Rainer,

DANKE!

von Rainer V. (a_zip)


Lesenswert?

:-)

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.