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

erste Schritte in Spin

Beitrag von Julian »

So der Hive ist fertig und ich versuche mich gerade ein wenig in Spin einzuarbeiten. Ich versuche gerade einfach einen String über die Tastatur einzulesen und auszugeben. Die Eingaberoutine habe ich aus der play.spin. Doch ich bekomme den String nicht angezeigt. Mein Code sieht so aus:

Code: Alles auswählen

OBJ
        ios: "ios"

CON

_CLKMODE     = XTAL1 + PLL16X
_XINFREQ     = 5_000_000
OS_TIBLEN       = 64
VAR
byte tibpos
byte tib[OS_TIBLEN]
byte inputstr
Pub main
  ios.start
  ios.startram
  ios.print(string("Input test"))
  ios.printnl
  inputstr := os_cmdinput
  ios.print(string("You typed: "))
  ios.print(inputstr)
  ios.stop
PUB os_cmdinput | charc                                 'eingaberoutine für eine kommandozeile
{{os_cmdinput - eingaberoutine für eine kommandozeile
  tib     - eingabepuffer
  tibpos  - index im tib}}
  
  tibpos := 0                                           'tibposition auf anfang setzen
  repeat 
    if ios.keystat > 0                                      'taste gedrückt?
      charc := ios.key                                      'tastencode holen
        if (tibpos + 1) < OS_TIBLEN                     'tastaturpuffer voll?
          case charc
            ios#CHAR_BS:                                'backspace
                   if tibpos > 0
                     tibpos--
                     tib[tibpos] := $0                  'letztes zeichen im puffer löschen
                     ios.printctrl(ios#CHAR_TER_BS)         'steuerzeichen anterminal senden
            other: ios.bus_putchar2(charc)                  'sonstige zeichen
        
      if (charc <> ios#CHAR_NL) & (charc <> ios#CHAR_BS) 'ausser sonderzeichen alles in tib
        if (tibpos + 1) < OS_TIBLEN                     'tastaturpuffer voll?
          tib[tibpos++] := charc
          tib[tibpos] := $0
  until charc == $0D                                    'schleife bis RETURN
  tibpos := 0
  charc := 0
Und was bedeuten die Variablen nach dem Namen der Funktion die mit | oder mit () deklariert werden. Werden die zurückgegeben bzw. an die Funktion übergeben (so wie ByVal bei VB)?
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Julian hat geschrieben:Und was bedeuten die Variablen nach dem Namen der Funktion die mit | oder mit () deklariert werden. Werden die zurückgegeben bzw. an die Funktion übergeben (so wie ByVal bei VB)?
Erstmal zu Deiner 2. Frage:

"PUB blub(test1,test2) | x,y"

würde bedeuten:

test1 und test2 werden dem Objekt von dem Aufrufenden Befehl übergeben. also der Aufruf wäre dann "blub(wert1, wert2)"
x und y sind lokale variablen. Diese werden nur in dieser Routine verwendet und sind von "außen" nicht zugänglich.

Der Code von Dir kann so nicht funktionieren .. ich überlege nur gerade, wie ich das schriftlich hier zeige ... kommt noch.

Gruß.
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

So, hier Dein code mit Änderungen.
Ich hab's kommentiert.
ich habe das Array tib in Deine Variable umkopiert .. hätte man sich sparen können und direkt einen Pointer auf tib zurückgeben, aber wer weiß was Du mit dem Array sonst noch vorhast.

Code: Alles auswählen

OBJ
        ios: "ios"

CON

_CLKMODE     = XTAL1 + PLL16X
_XINFREQ     = 5_000_000
OS_TIBLEN       = 64
VAR
byte tibpos
byte tib[OS_TIBLEN]
byte inputstr[OS_TIBLEN]                                'damit wir auf die einzelnen Bytes des strings zugreifen können
Pub main
  ios.start
  ios.startram
  ios.print(string("Input test"))
  ios.printnl
  inputstr := os_cmdinput                               ' Returnwert ist inputstr
  ios.print(string("You typed: "))
  ios.print(@inputstr)                                  ' Zeiger auf erstes Byte von Inputstr                                
  repeat                                                    ' Unendliche Schleife für mich zum testen
  ios.stop
PUB os_cmdinput | charc,x                                 'eingaberoutine für eine kommandozeile
{{os_cmdinput - eingaberoutine für eine kommandozeile
  tib     - eingabepuffer
  tibpos  - index im tib}}
  
  tibpos := 0                                           'tibposition auf anfang setzen
  repeat 
    if ios.keystat > 0                                      'taste gedrückt?
      charc := ios.key                                      'tastencode holen
        if (tibpos + 1) < OS_TIBLEN                     'tastaturpuffer voll?
          case charc
            ios#CHAR_BS:                                'backspace
                   if tibpos > 0
                     tibpos--
                     tib[tibpos] := $0                  'letztes zeichen im puffer löschen
                     ios.printctrl(ios#CHAR_TER_BS)         'steuerzeichen anterminal senden
            other: ios.bus_putchar2(charc)                  'sonstige zeichen
        
      if (charc <> ios#CHAR_NL) & (charc <> ios#CHAR_BS) 'ausser sonderzeichen alles in tib
        if (tibpos + 1) < OS_TIBLEN                     'tastaturpuffer voll?
          tib[tibpos++] := charc
          tib[tibpos] := $0                              
  until charc == $0D                                     'schleife bis RETURN
  x := 0                                                             
  repeat until tib[x] == $0
      inputstr[x] := tib[x]                             'tib nach inputstr umkopieren .. könnte man sich auch sparen
      x++
  inputstr[x] := $0                                     ' $0 zum Schluß in inputstr, da wir die Schleife vorher verlassen haben
  return inputstr                                       ' das geben wir zurück
  tibpos := 0
  charc := 0
Alternativ könnte man sich das sparen:

Code: Alles auswählen

x := 0                                                             
  repeat until tib[x] == $0
      inputstr[x] := tib[x]                             'tib nach inputstr umkopieren .. könnte man sich auch sparen
      x++
  inputstr[x] := $0                                     ' $0 zum Schluß in inputstr, da wir die Schleife vorher verlassen haben
  return inputstr                                       ' das geben wir zurück
und dafür das machen:

Code: Alles auswählen

  return tib                                       ' das geben wir zurück
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 »

Danke für den Code. Evtl. sollte ich mir doch vorher mal das Tutorial im Propeller Tools und das Handbuch anschaun. Ich bin vorhin mal die IOS Funktionen (so wies in der Wiki steht) durchgegangen und da gibts zwar alles mögliche für den Zugriff auf die SD Karte aber keine Möglichkeit eine Datei zu löschen (klar man könnte ein Datei überschreiben und nichts reinschreiben aber dann ist die Datei ja immernoch da). Sehe ich das richtig oder hab ich da was übersehen?
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Julian hat geschrieben:Danke für den Code. Evtl. sollte ich mir doch vorher mal das Tutorial im Propeller Tools und das Handbuch anschaun. Ich bin vorhin mal die IOS Funktionen (so wies in der Wiki steht) durchgegangen und da gibts zwar alles mögliche für den Zugriff auf die SD Karte aber keine Möglichkeit eine Datei zu löschen (klar man könnte ein Datei überschreiben und nichts reinschreiben aber dann ist die Datei ja immernoch da). Sehe ich das richtig oder hab ich da was übersehen?
Datei löschen = ios.sdopen("d",stradr)

Der Buchstabe "d" = delete. Gibt noch "r","w", usw.

Danach "ios.sdclose" nicht vergessen.

Schau Dir am besten mal den Source von Regime an. Da wird alles mit SD-Karte gemacht.

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 »

Ok ich habe mir xload ein wenig angepasst. Doch irgendwie werden die Daten nicht mehr richtig übertragen, obwohl ich den eigentlichen Transfercode nicht verändert habe. Evtl. findet einer von euch den Fehler. Die transferierte Datei auf der SD Karte wird dann mit chkdsk gelöscht werden.
Dateianhänge
xload.zip
Meine (kaputt) angepasste xload version
(5.83 KiB) 534-mal heruntergeladen
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Bei mir funktioniert Dein Code ohne Probs.

Die übermittelte bin-datei konnte auch ganz normal gestartet werden.

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 »

Ok habs auch grad noch mal getestet. Jetzt gehts. Merkwürdig. Naja evtl. hatte die SD nen Schlag der durch den letzten Check via checkdisk wieder behoben wurde (hab immer in den gleichen Dateinamen geladen).
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Julian hat geschrieben:Ok habs auch grad noch mal getestet. Jetzt gehts. Merkwürdig. Naja evtl. hatte die SD nen Schlag der durch den letzten Check via checkdisk wieder behoben wurde (hab immer in den gleichen Dateinamen geladen).
Hmm .. nicht ganz fürchte ich ... habe gerade eine ganz normale Textdatei gesendet.
Neben meinem Text ist da noch ein Haufen anderer Müll drin.

Ich checke das Prog noch mal .. heute Nacht aber wohl nicht mehr.

Gruß
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Benutzeravatar
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: erste Schritte in Spin

Beitrag von Rainer »

Hmm .. scheint wohl nicht Dein Fehler zu sein.

Code: Alles auswählen

PUB bwrite(puffer) | n,i        ' schreibt 128 byte nutzdaten in datei

repeat i from 0 to 127
  n := byte[puffer][i]
  ios.sdputc(n)
Der Code oben schreibt auf alle Fälle immer 128 Byte auf die SD ... auch wenn nur 1 Buchstabe in der Textdatei ist.
Dürfte aber bei Programmen kein Problem sein, sieht nur bei Textdateien ziemlich blöd aus ... und man kriegt Probleme, wenn man bis EOF einliest (bei Konfigurationsdateien, z.B.)

Schaue ich mir aber noch mal genauer an .. vll. lese ich da auch was falsches raus.

[EDIT]
Jo, ist so wie ich gedacht habe.
Es wird immer bis zur 128 Byte-Grenze geschrieben.
Sieht man wenn man z.B. eine Textdatei übermittelt und dann mit "type <name.txt>" sich die Datei ansieht.
Passiert mit allen 3 Versionen von Xload (also mit der Originalen, Deiner und meiner Version).
Wird wohl auch so sein müssen, da man ja immer mind. 1 Sektor schreiben muß.
Da ich das Ding aber ständig benutze und noch nie Probleme hatte, muß Dein Fehler wirklich an der SD-Karte gelegen haben.
[/EDIT]

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