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ß
Zu doof für google ? http://mdfs.net/Info/Comp/Comms/CRC16.htm Gefunden mit: https://www.google.com/search?client=firefox-b-d&q=CRC16+XModem+BASIC&oq=&aqs=
Hallo Uwe, Ja, die ist mir bekannt. Aber die benutzt ein anderes Polynom und rechnet nach CRC16-CCITT. Kann ich also nicht verwenden. Gruß
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=
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 ?
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
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.
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.
"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..
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 ?
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.
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!
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.
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
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.
Okay, habe ich verstanden! Trotzdem Danke für die Hinweise. Bin nun mal nicht der Foren-Experte.
"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
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
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?
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.
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
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
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.
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.
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.
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.
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.
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.
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.
Nachtrag: @Wolfgang, lies mal hier im Nachbarforum zu den Unterschieden... https://stackoverflow.com/questions/4455257/crc16-checksum-hcs08-vs-kermit-vs-xmodem
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
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
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!
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.