Seite 4 von 6

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 15:24
von DJLinux
hat sich erledigt

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 15:35
von Julian
Danke. Doch sowohl der code, als auch der mit der Tabelle liefern mir falsche Werte. Oh man so ein Mist mit diesem ..... CRC

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 15:36
von DJLinux
Hast Du denn verstanden warum es immer größer wird?

Wenn Du ein Long Wert 32 bit immer wieder shiftest dann schiebst Du die bits nicht aus der Variable heraus wie bei einer 16 bit Word variable sondern der Wert wird immer größer.

wert := (wert << 1) & $FFFF ' nur 16 bit berücksichtigen

edit:
Durch die 16 bit Maske $FFFF kann der Wert nie größer werden als eine 16 bit Variable (ohne Vorzeichen)

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 15:48
von Julian
Nein so wirklich verstanden wie das funktioniert habe ich nicht. Ich werde mich da erstmal einlesen bevor ich mit dem CRC zeugs weitermache (mit bitweisen Operationen habe ich noch nie gearbeitet). Ich werde erstmal mein YMODEM Download soweit fertig schreiben, dass ich Pakete empfangen kann. Dann werde ich einfach mal die CRC Berechnung 1:1 aus dem YMODEM Upload den Reiner gepostet hat übernehmen und schaun was passiert.

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 15:55
von DJLinux
Ich sehe Du hast doch ein "return crc & $FFFF" in Deinem Code
daher kann der CRC Rückgabewert gar nicht größer als 16 bit werden.
Der Fehler muss wo anders sein.

Grüsse Joshy

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 16:28
von DJLinux
Was muss denn raus kommen für CRC bei "Hallo" 17071 ?

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 16:37
von Julian
Laut meinem Python Script 295. Ich habe das Script nur bei Paketen mit 128 bzw. 1024 Bytes getestet und da hat der CRC Wert mit dem von Hyperterminal gesendeten übereingestimmt. Hier kann man das Ganze online Berechnen lassen: (in diesem Fall "Hallo") http://www.lammertbies.nl/comm/info/crc ... thod=ascii
Der Wert muss mit "CRC-CCITT (XModem)" übereinstimmen.

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 18:13
von DJLinux
Das ist jetzt 1:1 übersetzt.
Werde damit glücklich :lol:

Code: Alles auswählen

' CRC16.spin
OBJ
  ios: "ios"
  num: "numbers"
           
CON
  _CLKMODE     = XTAL1 + PLL16X
  _XINFREQ     = 5_000_000
  
  P_CCITT      = $1021
VAR word wert,crc,c
  
PUB main
  ios.start
  ios.startram
  
  ios.print(string("CRC16 Test"))
  ios.printnl
  wert :=calcrc(@str1)
  ios.print(string("Ergebnis in dec = ")) 
  ios.printdec(wert)
  ios.printnl
  ios.print(string("Ergebnis in hex = $")) 
  ios.printhex(wert,4)
  ios.printnl  

PUB calcrc(ptr) | i,j,count
  crc := 0
  count := strsize(ptr)-1
  repeat i from 0 to count
    c := byte[ptr][i]
    c := c << 8
    repeat j from 0 to 7
      if ( (crc ^ c) & $8000 )
        crc := (crc << 1) ^ P_CCITT
      else
        crc := crc << 1

      c := c << 1
      
  return crc


DAT
str1    byte  "Hallo",0

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 19:00
von Julian
Oh ja das bin ich. Eine Sache noch: kann ich die variable "wert" irgendwie lokal definieren? Einfach "PUB main | word wert" geht nicht und "PUB main | wert" liefert merkwürdige Ergebnisse (allerdings nur als Dezimalzahl, die Hex stimmt). C und CRC lassen sich ohne Probleme Lokal definieren. Ich versuch einfach so gut wie möglich globale variablen zu vermeiden (hab ich schon immer so gemacht, ka ob das sinnvoll ist.).

Re: erste Schritte in Spin

Verfasst: So 16. Aug 2009, 19:35
von DJLinux
Wenn Du lokal keine 16 Bit WORD variablen in Spin* verwenden kannst
dann must du wieder wert, crc und c an allen Stellen mit " & $FFFF" auf 16 bit reduzieren.
Den ganzen Quatsch kannst Du Dir aber mit 16 Bit WORD vars sparen.

*Ich möchte nicht in Spin programmieren aus dem Alter bin ich raus und spinnen kann ich auch ganz gut ohne HiVe :lol:

Grüsse Joshy