Propeller und Forth

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
MarkusG
Beiträge: 13
Registriert: So 17. Apr 2011, 17:06

Propeller und Forth

Beitrag von MarkusG »

Hallo,

ich habe mit großem Interesse die Seite zum Hive Projekt gelesen, erst einmal Gratulation, tolle Sache!
Ich bin mir nicht sicher ob ich mit meiner Frage hier richtig bin, also....

Vorkenntnisse:
ich beschäftige mich seit einiger Zeit mit dem Propeller, bisher in SPIN und Assembler.
FORTH ist ein Thema das mich ebenso schon länger theoretisch fasziniert.
Ich würde jetzt gerne ein kleines Projekt mit dem Propeller und FORTH realisieren.

Projekt:
Der Propeller sollte als I/O Prozessor arbeiten. D.h. Serieller Schnittstelle zu einem Master (asynchron) das sollte die FORTH Terminalschnittstelle sein. Und dann Schnittstellen zu diverser Peripherie: 2 x seriell, I2C, SPI u.ä.
SPI und I2C kann man glaube ich gut in FORTH selbst realisieren, anders denke ich ist es bei einer seriellen Schnittstelle.

Stand der Dinge:
FORTH auf dem Propeller hab ich soweit zum laufen gebracht.
Ich würde nun gerne eine zweite serielle Schnittstelle, außer dem Terminal, zum laufen bringen, um darüber weitere Peripherie anzusprechen.
In PropFORTH 3.5 hab ich ein serial.f zusammen mit aslicer.f gefunden, das mir in die richtige Richtung zu gehen scheint.

Frage:
Läuft das auch unter PropFORTH 4.0 ?
Oder gibts es einen besseren anderen Weg so etwas zu realisieren.

Ich bin f. jedem Tipp dankbar.
Die Dokumentation zu PropFORTH ist leider sehr spärlich und verstreut.
Ich würde das Projekt auch gerne unter OpenSource stellen, vielleicht als IlOnix ;-)

Grüße

Markus Greim
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Propeller und Forth

Beitrag von drohne235 »

Die Dateien von der Version 3.5 habe ich mir noch nie angeschaut. Hast du mal versucht diese zu compilieren? Schau dir mal im 4.0 die Datei com.f an, könnte das richtige sein und unterstützt auch Master/Slave zwischen zwei Props, wenn ich das richtig interpretiere. Ich glaube dazu gibt es auch noch einen Text im Wiki von PropForth, hab aber selbst auch noch nicht damit experimentiert.

Ansonsten gibt es ja bei der Version 4.0 noch den PASM-Treiber (sercog), welcher ja die Schnittstelle zum Host realisiert. Im Prinzip könnte man diese auch in einer zweiten COG starten. Schau dir mal die Datei PropForthCore.f an, dort wird er im Wort "onboot" in COG 7 gestartet.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
MarkusG
Beiträge: 13
Registriert: So 17. Apr 2011, 17:06

Re: Propeller und Forth

Beitrag von MarkusG »

Hi,

das war ein guter Tipp:

startserialkog (n1 n2 n3 n4 --)
n1 - rx pin
n2 tx pin
n3 baud rate
n4 cog

jetzt muss ichs nur noch ausprobiern ;-)

Markus
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Propeller und Forth

Beitrag von drohne235 »

Und nicht vergessen vorher eine COG frei zu machen. Mit cog? kann man sich die Belegung anschauen. Im Normalfall werden alle COG's in onboot belegt, aber mit "nr cogstop" kannst du eine COG wieder freimachen.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
MarkusG
Beiträge: 13
Registriert: So 17. Apr 2011, 17:06

Re: Propeller und Forth

Beitrag von MarkusG »

So ein kleiner Zwischenbericht:
(Anmerkung: die Lernkurve ist ganz schön steil, PropForth doku, naja...)
Also ich dachte erst mein Forth läuft richtig was ein Irrtum war. Also zurück auf Los.

Nach zichmaligem Versuch und Irrtum (Kommentare willkommen):

Man muss erst
PropForth.spin

laden, das ist glaube ich klar. Nun zeigt er
mit
words
schon einige Wörter an aber nicht alle.

Dann über Terraterm o.ä.

PropForthCore.f

laden.

Ich verstehe allerdings nicht was in PropForthCore.f steht und was in PropForth.f
PropForthCore.f hat 1170 Zeilen, PropForth.f (657 Zeilen) verstehe nicht, wie/ob beide zusammenhängen.

nun geht

cog?

oder
: gruss ." Hallo Olga " ;

ACHTUNG es müssen überall Leerzeichen hin: zwischen : und gruss zwischen gruss und ." im String und zwischen dem String und dem Strichpunkt !
(absoluter FORTH Anfängerfehler denk ich mal)

Normal sind alle Zahleneingaben offensichtlich Hex

decimal schaltet auf Dezimaleingabe

Nun zu meiner _Aufgabe_ einen String auf Pin 5 mit 9600 baud auszugeben:

\ von hex nach dezimal
decimal
\ einen cog f. seriellen Treiber frei machen
2 cogstop
\ seriellen Treiber auf PIN 5 (TxD) und 6 (RXD) mit 9600 baud in cog 2
5 6 9600 2 startserialcog
\ einen kleinen Teststring definieren und an cog 2 ausgeben
: test c" Hallo Olga " 2 cogx ;
\ das funktioniert tatsächlich :D
test

Danke f. die Hilfe soweit, Kommentare erwünscht, morgen gehts ans einlesen,
heute lieber nicht mehr, man sollte immer mit einem Erfolgserlebnis in den Feierabend gehen. ;-)

Grüße

Markus
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Propeller und Forth

Beitrag von drohne235 »

Was mich dabei immer fasziniert, ist die Interaktivität. Dadurch, das alles auch im Interpreter funktioniert, kann man wirklich damit "spielen" und die ganzen kleinen Gizmos und Bausteine hin- und herschieben. :)

Zum Kernaufbau:

Das Basisvokabular des Core, ist in PropForth.spin als Spincode schon integriert. Du findest es als langen DAT-Bereich ziemlich weit hinten. Und genau jene Worte, die sich dort befinden, stehen quasi als Forth-Quelltext nochmal in PropForthCore.f zur Verfügung. Da sich Änderungen an der Datei PropForthCore.f natürlich nicht auf den Spincode auswirken (wie sollten sie auch), kann man theoretisch mit der Erweiterung spinmaker.f aus diesem geänderten Forthquelltext wieder Spincode erzeugen, welchen man in den DAT-Bereich der Spin-Datei kopieren kann.

Hmm, klingt jetzt irgendwie kompliziert... ;)

Zumindest theoretisch, da das bei mir nur in einer älteren Forthversion funktioniert hat. Das Ganze ist nochmal hier im Wiki beschrieben: http://code.google.com/p/propforth/wiki ... gPropForth
So ist der Core von Forth quasi in Forth geschrieben und kann geändert werden.

Noch verwirrender ist die Datei PropForth.f in de neuen Version, da sie Erweiterungsworte des Core enthält. So zum Beispiel das Wort "cog?".

Ansonsten findest du hier http://hive-project.de/board/viewtopic.php?f=7&t=428 in dem Archiv zum Hive im Verzeichnis doc eine Exceltabelle mit einer Übersicht der Worte im Core- und Erweiterungswortschatz. Ein paar Internas habe ich weggelassen, aber das wesentliche ist enthalten. Vielleicht hilft dir das ein wenig weiter.

Hast du einen 64K EEPROM an deinem Propeller? Das macht für Experimente mit nur einem Prop absolut Sinn, da man die oberen 32KB als Minidateisystem verwenden kann. Am Hive habe ich ja mein SDCard, aber an einer kleinen Schaltung ist das praktisch.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
MarkusG
Beiträge: 13
Registriert: So 17. Apr 2011, 17:06

Re: Propeller und Forth

Beitrag von MarkusG »

Hallo,

ein weiterer Sachstand mit bedingter Erfolgsmeldung:

In meiner letzten mail ist ein kleiner Fehler, nach aktuellem Kenntnisstand reicht es
PropForth.spin
in das eeprom zu laden und dann

PropForth.f

zu laden.
Zur seriellen Kommunikation.
Es geht jetzt um das Empfangen von Zeichen über eine weitere serielle Schnittstelle.
Senden s.o.

Mit

2 >con

Kommen alle Zeichen die über den serialcog 2 einlese auf der Konsole raus.
Leider habe ich keinen Weg gefunden das wieder abzuschalten.

Das erfüllt auch nicht das was ich will, ich wollte eher die Zeichen holen und dann
in eine Datenstruktur packen.

http://code.google.com/p/propforth/wiki/PropForthFAQ

Gibt es ein paar mystische Anmerkungen zu dem Thema. Ich zitiere:

"how to give output from one cog to another cog?

This is little trickier, and it depend on what needs to be done. Here are a couple methods.
- responses: make a word to update shared memory. com.f has examples
- route output using the emit routine and emit pointer. This is what is done in fast load, see code for 'fl' word for examples.
- cogxo - don't even try this one yet. Wait for the tutorial (when debugging is finished)"

Allerdings bin ich mir nicht sicher ob damit meine Fragestellung gemeint ist.

Für Anmerkungen wie immer dankbar, und
Frohe Ostern
an alle Mitleser

Markus
MarkusG
Beiträge: 13
Registriert: So 17. Apr 2011, 17:06

Re: Propeller und Forth

Beitrag von MarkusG »

Noch eine kleine Ergänzung:

Besser gehts mit \term (n1, n2 --)

\Miniterminal zu COG n1; Kanal n2; CTRL+F = Quit

2 1 term

macht ein kleines Terminal, alle was auf der Seriellen Schnittstelle reinkommt wird in der Konsole geschrieben, alles was ich in der Konsole tippe kommt auf der seriellen Schnittstelle raus.
Scheint also alles über einen Kanal zu gehen. Werde mich in diese Geschichte etwas weiter einarbeiten...

Grüße

Markus
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Propeller und Forth

Beitrag von drohne235 »

Hi Markus!

Mit >con ist ungünstig, da du so deine interaktive COG umschaltest, aber zum testen ist das ja mal interessant.

Ich würde folgendermaßen vorgehen: Wenn du zum Beispiel in COG-B den zweiten seriellen Treiber startest, dann kannst du diesen mit einer zweiten COG, nennen wir sie mal COG-A, verbinden. COG-A sollte dabei nicht deine interaktive COG sein. Im Normalfall (schau mal mit cog? nach) bist du ja interaktiv im Terminal auf COG6; COG7 ist der erste serielle Treiber.

Mit "<cog-a-nr> <cog-b-nr> ioconn" kannst du nun beide COG's miteinander verbinden.

Was bedeutet das nun?: Im Prinzip hat jede COG einen Zeicheneingabekanal und einen Zeichenausgabekanal, ähnlich wie ganz einfache Pipes bei Linux-Programmen. Der Eingang für jede COG ist dabei eine einfache Variable im privaten Bereich von der COG selbst. Der Ausgang aber ist ein Vektor, d.h. ein Zeiger "irgendwohin". Das ist eine ziemlich coole Geschichte, denn damit kann man den Ausgabevektor einer COG mit dem Eingang einer anderen COG verbinden. Und genau das macht "ioconn": dieses Wort verbindet von beiden COG's den Ausgabevektor mit dem Eingang der anderen COG - damit sind sie jetzt quasi "kurzgeschlossen". Alles was COG-A per "emit" ausgibt, ist eine Eingabe in COG-B oder kann per "key" dort abgefragt werden.

Nun hast du also deine zweite serielle Schnittstelle mit einer freien COG verbunden. Im Prinzip kannst du jetzt an diese zweite Schnittstelle auch ein Computer mit einem Terminalprogramm anschließen und mit diesem zweiten Forthteilsystem parallel zum anderen Terminal arbeiten. Das ist schonmal cool, aber noch nicht das was du möchtest: du möchtest ja mit dieser COG Zeichen empfangen und irgendwo speichern. Also startest du vorher in dieser COG einfach ein entsprechendes Wort, nennen wir es mal "verarbeite-meine-zeichen":

Code: Alles auswählen


wvariable zeichen

: verarbeite-meine-zeichen
  begin
    key?
    if key zeichen C! then
  0 until ;

c" verarbeite-mein-zeichen" <cog-a-nr> cogx
<cog-a-nr> <cog-b-nr> ioconn

Was machts? In unserem Wort wird die Endlosschleife "begin ... 0 until" abgearbeitet. Mit key? schaut die COG-A, ob von der seriellen COG-B (mußt du vorher starten) ein Zeichen vorliegt. Ist das der Fall wird bedingt mit "if key zeichen C! then" dieses Zeichen in die Variable "zeichen" gespeichert.

Die beiden letzten Zeilen starten erst in COG-A unser Verarbeitungswort und verbinden dann die beiden COG's.

Hab's jetzt mal so ohne Test hingeschrieben, also ohne Gewähr! ;) Schade, genau zu diesem Thema habe ich auf dem KC-Treffen einen kleinen Vortrag gehalten - hätte dir gefallen denke ich. Da hätten wir schön experimentieren können... :)
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
MarkusG
Beiträge: 13
Registriert: So 17. Apr 2011, 17:06

Re: Propeller und Forth

Beitrag von MarkusG »

Danke!
Das funktioniert prima, bin ganz begeistert.

mit

Code: Alles auswählen

....
if key dup zeichen C! emit then
0 until ;
...
gibt es auch ein Echo!
Ich werde mich jetzt mal an eine echte kleine Hardwareanbindung machen.

Grüße

Markus
Antworten