erste Schritte in Spin

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Probier's mal so (Du übergibst ja die Adresse vom Puffer) :

Code: Alles auswählen

PUB bwrite(puffer) | n,i
repeat i from 0 to 127
  n := byte[puffer + i] <-----------------------------
  ios.sdputc(n)
"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 »

Bin heute mal wieder dazu gekommen etwas weiterzuschreiben. Doch ich finde den Fehler nicht. Deine gepostet Methode funktioniert auch nicht. Es liegt an der Übergabe des Puffers von der "library" an das eigentliche Programm denn:
iso.printhex(ymodem.getpack128,256)
gibt nur Mist aus. Der Fehler muss also hier liegen

Code: Alles auswählen

PUB getpack128 | buffer[128],i
  repeat i from 0 to 127
    buffer[i] := ser.rx
  return buffer
Denn

Code: Alles auswählen

PUB getpack128 | buffer[128],i
  repeat i from 0 to 127
    buffer[i] := ser.rx
    ios.printhex(buffer[i],2)
  return buffer
gibt die Daten richtig wieder. Ich habe deshalb überlegt ob es möglich wäre wenn ich den Puffer in der Library global definiere und dann aus meinem Programm darauf zugreife ala ios.print(ymodem.buffer) (oder so). Geht das?
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

Hat denn keiner eine Idee wo der Fehler liegt? Ein Teil des Forums schreibt Ramotimierungen in PASM und häng an so nem Mist fest!
DJLinux

Re: erste Schritte in Spin

Beitrag von DJLinux »

Julian hat geschrieben:Hat denn keiner eine Idee wo der Fehler liegt? Ein Teil des Forums schreibt Ramotimierungen in PASM und häng an so nem Mist fest!
ich habe noch keine Ahnung von Spin (möchte ich auch garnicht) aber so viele Möglichkeiten kann es da nicht geben. :lol:

Ist keine Verarsche ich weiss es wirklich nicht und müste genau wie Du auch es testen.
Da ich Dir den CRC Code in Spin geschrieben habe obwohl ich mich damit nicht auskenne bist Du nun an der Reihe dir die richtige Addressierung auszusuchen.

Manche sind gleichbedeutend soviel erkenne ich schon mal.

Learning by doing

Grüsse Joshy

Code: Alles auswählen

PUB bwrite1(puffer) | n,i
  repeat i from 0 to 127
    n := byte[puffer][i]
  'ios.sdputc(n)
PUB bwrite2(puffer) | n,i
  repeat i from 0 to 127
    n := byte[puffer]
    puffer++
  'ios.sdputc(n)
PUB bwrite3(puffer) | n,i
  repeat i from 0 to 127
    n:=byte[puffer+i]
PUB bwrite4(puffer) | n,i
  repeat i from 0 to 127
    n := byte[@puffer][i]
  'ios.sdputc(n)
PUB bwrite5(puffer) | n,i
  repeat i from 0 to 127
    n := byte[@puffer]
    puffer++
  'ios.sdputc(n)
PUB bwrite6(puffer) | n,i
  repeat i from 0 to 127
    n := @byte[puffer][i]
    puffer++
  'ios.sdputc(n)
PUB bwrite7(puffer) | n,i
  repeat i from 0 to 127
    n := @byte[puffer]
    puffer++
  'ios.sdputc(n)
PUB bwrite8(puffer) | n,i
  repeat i from 0 to 127
    n:=byte[@puffer+i]
PUB bwrite9(puffer) | n,i
  repeat i from 0 to 127
    n := @byte[@puffer]
    puffer++
  'ios.sdputc(n)
PUB bwrite10(puffer) | n,i
  repeat i from 0 to 127
    n := @@byte[@puffer]
    puffer++
  'ios.sdputc(n)
DJLinux

Re: erste Schritte in Spin

Beitrag von DJLinux »

Julian mach mich schlauer, was war denn jetzt der richtige Bytearray Zugriff wenn das Array in einem anderen Objekt existiert ?

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

Re: erste Schritte in Spin

Beitrag von Julian »

Sorry, bin erst gerade dazu gekommen mir das anzuschauen (irgendwer hatte das im Forum mal als Sozialstress beschrieben ;) ). Doch ich glaube wir reden aneinander vorbei. Das Problem liegt nicht im Code zum schreiben des Puffers auf SD (den hab ich aus xload übernommen). Das Problem ist die Pufferübergabe. Ich habe allen unnötigen Code entfernt und die Daten mal hochbeladen
Dateianhänge
yload.zip
(5.89 KiB) 523-mal heruntergeladen
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Julian hat geschrieben:Sorry, bin erst gerade dazu gekommen mir das anzuschauen (irgendwer hatte das im Forum mal als Sozialstress beschrieben ;) ). Doch ich glaube wir reden aneinander vorbei. Das Problem liegt nicht im Code zum schreiben des Puffers auf SD (den hab ich aus xload übernommen). Das Problem ist die Pufferübergabe. Ich habe allen unnötigen Code entfernt und die Daten mal hochbeladen
Ich habe jetzt mal kurz drübergesehen. Irgendwie ist mir die Logik dahinter nicht ganz klar wie Du Variablen/Werte übergibst:
z.B.

Code: Alles auswählen

PUB getpack128 | buffer[128],i,test1
  repeat i from 0 to 127
    buffer[i] := ser.rx
  return buffer 
Hier gibst Du als Returnwert den Inhalt des Arrays "buffer" zurück. Wenn ich das richtig interpretiere als 256-Stellige Zahl .. bißchen groß für die arme Variable ;)
Meines Erachtens musst Du die Adresse von "buffer" zurückgeben, also "RETURN @buffer".
Das geht aber nur, wenn "buffer" nicht ein lokales Array ist, da dieses nach dem Verlassen der Routine ja nicht mehr Existent ist.

Mein Vorschlag wäre, "buffer[128]" in "ymodemlib" global zu definieren, "RETURN @buffer" wie oben, und im Hauptprogramm:

Code: Alles auswählen

.....
      if packnr == 0
         buffer := ymodem.getpack128  ' buffer = Adresse des Puffers
.....
und statt:

Code: Alles auswählen

         ios.printhex(buffer,265) <--- ich glaube, da kommt nur Müll raus. Übrigens .. warum 265 ?
lieber

Code: Alles auswählen

  repeat i from 0 to 256 STEP 2
    ios.printhex(buffer+i,2)
Außerdem wirft mir das hier --> "CRC := ymodem.getcrc" <--- einen Kompilerfehler raus, da die Routine nicht existiert.

Joshy hat Dir auch alle Möglichkeiten gezeigt, wie man auf den Puffer zugreifen könnte (und das hat nichts mit SD-Schreibzugriff zu tun nur weil der Befehl da drin ist).
Probiers halt einfach mal aus mit einem anderen/kleineren Puffer der mit einfachen Ganzzahlen befüllt ist.
Wir können hier auch alle nur rumprobieren. Bei mir hat die Übergabe bis jetzt immer geklappt.
Ich glaube auch ehrlich gesagt nicht daß die Übergabe das Problem ist, sondern wie Du hinterher damit weiterarbeitest.
Ich hab's gerade mal mit dem Befehl "ios.printhex(buffer,256)" in einem Testprogramm probiert ... und bei mir kommt da IMMER nur Müll raus.

Gruß.
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
DJLinux

Re: erste Schritte in Spin

Beitrag von DJLinux »

Im Moment weiss ich garnicht was Julian von uns möchte er schreibt "Das Problem ist die Pufferübergabe".

Code: Alles auswählen

VAL
  byte Buffer[128-1]

  Irgendwas(@Buffer) ' Addresse des Arrays Buffer[] übergeben

PUB Irgendwas(pBuffer) | i
  repeat i from 0 to 127
    wert := byte[pBufer][i] ' oder einer der Anderen zehn Versionen
Julian
Beiträge: 136
Registriert: Mo 1. Jun 2009, 19:33

Re: erste Schritte in Spin

Beitrag von Julian »

So ich hatte vorhin mal Lust ein wenig weiter zu machen. Das hat besser geklappt, als ich gedacht hab. Doch ich bin (natürlich) wieder auf Probleme gestoßen. Zum einen funktioniert die CRC Berechnung nicht (die Routine passt, habs mit vordefinierten Strings getestet), zum anderen funktioniert die Routine zum auslesen des Dateinamens und der Größe nicht. Ich bin mir sicher das muss wieder mit diesen bitweisen Operationen gemacht werden, die ich mir immer noch nicht angeschaut habe :oops:. Damit ihr versteht, wie das überhaupt funktionieren soll, habe ich meine Python Datei beigelegt, mit der ich das YModem Protokoll erforscht habe (ich habe keine gute Beschreibung gefunden, nur diese TXT mit dem Mischmasch aus XMODEM und YMODEM). Wenn ihr diese nicht nur lesen, sondern auch testen möchtet, benötigt ihr noch pyserial. Ich freue mich wie immer über jede Hilfe

Gruß
Julian
Dateianhänge
yload.zip
(6.73 KiB) 552-mal heruntergeladen
Antworten