erste Schritte in Spin

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

Ok das mit dem XOR ist schon mal gut. Aber was bedeutet z.b. "(data<<8)" also was macht das <<8 mit dem data String? Oder was ist das für eine if abfrage "if crc&$8000"? $weißt auf eine HEX zahl (80 00h = 32768d?) hin soviel ist klar aber was soll das "&". Ich kenn & nur aus VB und da wird es benutzt um z.B. 2 Strings zu verbinden. Ja das sind eigentlich die 2 Sache die ich nicht verstehe.
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Julian hat geschrieben:Ok das mit dem XOR ist schon mal gut. Aber was bedeutet z.b. "(data<<8)" also was macht das <<8 mit dem data String? Oder was ist das für eine if abfrage "if crc&$8000"? $weißt auf eine HEX zahl (80 00h = 32768d?) hin soviel ist klar aber was soll das "&". Ich kenn & nur aus VB und da wird es benutzt um z.B. 2 Strings zu verbinden. Ja das sind eigentlich die 2 Sache die ich nicht verstehe.

"(data<<8)" ist Bitweises Linksshiften um 8 Bit. Damit werden in diesem Beispiel die hoherwertigen Bits ausgeblendet, da ich die da nicht brauche.

Code: Alles auswählen

Also 
 |--MSB---| |--LSB--|
%0001 0110 1111 1111 <<8 ..... wird zu 
%1111 1111 0000 0000 

... wir schieben die MSB's sozusagen aus der Zahl raus und verschieben die LSB 8 Stellen nach links.
"if crc&$8000". & ist bitweises UND wie Du es kennst. Da kommt bei jedem Vergleich einzelner Bits immer wahr oder unwahr raus (1 oder 0)

Code: Alles auswählen

Also aus 

%0001 0110 1111 1111 & 
%1100 0001 1100 0000 wird
%0000 0000 1100 0000  
Also wenn ich zwei Bits "UND"'e, dann ist

Code: Alles auswählen

BitX  BitY            Ergebnis
 0     0                 0
 0     1                 0
 1     0                 0
 1     1                 1
In dem Beispiel wird einfach crc mit %0100 0000 0000 0000 ge'unded (was für ein blödes Wort *hehe*)
Das Ergebnis ergibt wahr oder unwahr .. dementsprechend verzweigt das If in die richtige Routine.

Siehe auch --> http://hive-project.de/wiki/schnipsel:byte1

Gruß.
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

So bis auf die CRC Kalkulation funktioniert mein Python Code. Ist auch nicht so wichtig solange sie auf dem HIVE läuft ;) . War (zumindest für mich) ne Menge Arbeit weil ich nirgends eine gescheite Beschreibung des YMODEM Protokolls gefunden hab (nur diese TXT mit einem Mischmasch aus XMODEM und YMODEM). Doch bevor ich jetzt den xload Code weiter verschandle, werde ich versuchen das ganze selbst neu umzusetzen.
Wenns Probleme gibt, werde ich euch wieder nerven :twisted:
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

Mein Kumpel hat mir den Tipp gegeben, dass es sich hierbei um die CRC16 Berechnung handelt. Da habe ich auch eine schöne Funktion in Python gefunden, die ich der oben geposteten vorziehe, da hier die Checksum für das gesamte packet berechnet wird. Doch ich hänge schon beim auslesen der Stringlänge. Da kommen bei mir sehr merkwürdige Zahlen zum vorschein. Hier mal der Python Code:

Code: Alles auswählen

def crc16str(s):
    crc = 0
    for index1 in range(len(s)):
        crc = crc ^ (ord(s[index1]) << 8)
        for index2 in range(1, 9):
            if crc & 0x8000 != 0:
                crc = ((crc << 1) ^ 0x1021)
            else:
                crc = crc << 1
    return crc & 0xFFFF
Und mein SPIN Code dazu:

Code: Alles auswählen

PUB CRC16(packet) | crc, i1, i2, size, n
  crc := 0
  size := strsize(@packet)
  ios.printdec(@size)           'debugging
  ios.printnl                   'debugging
  repeat i1 from 0 to size -1
    n := byte[@packet][i1]
    crc := @crc ^ (@n << 8)
    repeat i2 from 1 to 8
      if crc & $8000 <> 0
        crc := (@crc << 1) ^ $1021
      else
        crc := @crc << 1
  return crc & $FFFF
Doch die Größe wird irgendwie nicht richtig ausgegeben. Was mache ich falsch?

//edit: Und gibts es eine Möglichkeit 2 Werte zurückzugeben. Bei python geht das über tuples oder lists
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Julian hat geschrieben: Und mein SPIN Code dazu:

Code: Alles auswählen

PUB CRC16(packet) | crc, i1, i2, size, n
  crc := 0
  size := strsize(@packet)
  ios.printdec(@size)           'debugging <---------------------------   ios.printdec(size) 
  ios.printnl                   'debugging
  repeat i1 from 0 to size -1
    n := byte[@packet][i1]
    crc := @crc ^ (@n << 8)
    repeat i2 from 1 to 8
      if crc & $8000 <> 0
        crc := (@crc << 1) ^ $1021
      else
        crc := @crc << 1
  return crc & $FFFF
Doch die Größe wird irgendwie nicht richtig ausgegeben. Was mache ich falsch?

//edit: Und gibts es eine Möglichkeit 2 Werte zurückzugeben. Bei python geht das über tuples oder lists
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

Danke doch leider habe ich anstatt einer elend hohen Zahl jetzt einfach 1 :shock:
Die betreffenden Zeilen sehen so aus

Code: Alles auswählen

....
crc := CRC16(@str1)
....
DAT
str1    byte  "Hallo",0
die CRC wird auch nicht richtig berechnet, weil ja die schleife nur einmal durchläuft.
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Probier mal das "size := strsize(@packet)" ohne symbolische Adressierung.
Also "size := strsize(packet)"

Bin mir da aber auch nicht ganz sicher.
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

Ok danke das funktioniert. Doch die CRC ist immernoch falsch. Evtl. ist die crc irgendwas zu groß. Mein aktueller Code:

Code: Alles auswählen

PUB CRC16(packet) | crc, i1, i2, size, n
  crc := 0
  size := strsize(packet)
  repeat i1 from 0 to size -1
    n := byte[packet][i1]
    crc := crc ^ (n << 8)
    ios.printdec(crc) 
    ios.printnl  
    repeat i2 from 0 to 7
      if crc&$8000
        crc := (crc << 1) ^ $1021
      else
        crc := crc << 1
  return crc & $FFFF
Die erste 3 Werte Stimmen, doch bei den letzten 2 kommen irgendwelche hohen negativwerte raus. So sieht die ausgabe in Pyhton (beim gleichen Code) aus:
>>> crc16str("Hallo")
18432
5023948
1285723362
329145732413
84261307272041
295L <- Final CRC

Sind die Letzten 2 Werte zu groß?
DJLinux

Re: erste Schritte in Spin

Beitrag von DJLinux »

Klar sind die Werte zu groß das ist ja auch CRC16 und nicht CRC32 benutze 16bit WORD Variablen.

Im amerikanischen Forum findest Du auch CRC16 in Spin kannst das ja mal anschauen.

Grüsse Joshy
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

naja in Python funktioniert der Algo super. Das aus dem Amerikanischen Forum hab ich schon gefunden, doch die arbeiten mit Tabellen, was ich gerne vermeiden würde. Naja wenn jemandem noch was einfällt bitte posten. Ich werde mal die Funktion mit Tabellen testen
Antworten