erste Schritte in Spin

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
DJLinux

Re: erste Schritte in Spin

Beitrag von DJLinux »

hat sich erledigt
Zuletzt geändert von DJLinux am So 16. Aug 2009, 20:21, insgesamt 1-mal geändert.
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag 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
DJLinux

Re: erste Schritte in Spin

Beitrag 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)
Zuletzt geändert von DJLinux am So 16. Aug 2009, 15:50, insgesamt 1-mal geändert.
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag 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.
DJLinux

Re: erste Schritte in Spin

Beitrag 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
DJLinux

Re: erste Schritte in Spin

Beitrag von DJLinux »

Was muss denn raus kommen für CRC bei "Hallo" 17071 ?
Zuletzt geändert von DJLinux am So 16. Aug 2009, 20:21, insgesamt 1-mal geändert.
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag 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.
DJLinux

Re: erste Schritte in Spin

Beitrag 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
Zuletzt geändert von DJLinux am So 16. Aug 2009, 20:22, insgesamt 1-mal geändert.
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag 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.).
DJLinux

Re: erste Schritte in Spin

Beitrag 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
Antworten