Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Kommunikation 2er units Kategorie: Programmierung CC-Plus (von Grübel Denk - 11.11.2010 17:17)
 Als Antwort auf Re: Kommunikation 2er units von Grübel Denk - 9.11.2010 15:27
Etwas hab ich noch übersehen

#Testen
>
> GET wert       ' Das ein Byte abgeholt werden kann wissen wir ja schon
> IF wert >< sync THEN RETURN  ' ungleich 255? .. dann wieder auf die lauer legen
> GET grun     ' drei nachfolgende werte abholen. GET ohne IF rxd ... wartet ggfs. endlos
> GET weis   ' bis ein byte empfangen wurde. Dies garantiert aber auch das nach empfang des  .
> GETmusik ' (echten) sync bytes kein verlust der synchronisation auftreten kann, es sei denn der
>                '8 bytes große empfangspuffer der RS232 läuft über.
> PUT sync '  Frei navch MAPI: Meldung an MASTER das es weitergehen kann
> RETURN

sollte noch geändert werden zu

#Testen
>
> GET wert       ' Das ein Byte abgeholt werden kann wissen wir ja schon
IF wert = sync THEN GOTO EMPFANG
PUT sync
RETURN
#Empfang
> GET grun     ' drei nachflogende werte abholen. GET ohne IF rxd ... wartet ggfs. endlos
> GET weis   ' bis ein byte empfangen wurde. Dies garantiert aber auch das nach empfang des  .
> GETmusik ' (echten) sync bytes kein verlust der synchronisation auftreten kann, es sei denn der
>                '8 bytes große empfangspuffer der RS232 läuft über.
> PUT sync '  Frei navch MAPI: Meldung an MASTER das es weitergehen kann
> RETURN



oder, in OCBASIC:

> GET wert       ' Das ein Byte abgeholt werden kann wissen wir ja schon
> IF wert >< sync THEN PUT sync : RETURN  ' ungleich 255? .. dann wieder auf die lauer legen
> GET grun     ' drei nachfolgende werte abholen. GET ohne IF rxd ... wartet ggfs. endlos
> GET weis   ' bis ein byte empfangen wurde. Dies garantiert aber auch das nach empfang des  .
> GETmusik ' (echten) sync bytes kein verlust der synchronisation auftreten kann, es sei denn der
>                '8 bytes große empfangspuffer der RS232 läuft über.
> PUT sync '  Frei navch MAPI: Meldung an MASTER das es weitergehen kann
> RETURN


Grund Der MASTER könnte unter bestimmten Umständne blokkiert werden wenn dieser vor dem SLAVE gestartet und bestimmte kombinationen von grun, weis und musik gesendet werdedn, oder kurzzeitig die serielle verbindung zwischenbeiden c-control unterbrochen wird




> Kalr die Pause sollte moeglichst kurz sein. Deswegen mit 100 starten und dann immer in die entsprechende richtung halbieren, je nachdem ob noch ging oder nciht.
>
> Beim Grübeln ist mir noch etwas aufgefallen:
>
> Wie bekannt liefert  "IF rxd ..." FALSE wenn gerade kein Byte im RS232 Empfangspuffer sthet und die nachfolgende GET Anweisung wird dann übersprungen.
>
> Wenn das nächste GET ausgeführt wird  denkt der SLAVE auch es handelt sich schon um das nächste byte, Damit erhält dann z.B. "weis" den wert von "grun" was natürlich nicht "weis" ist, sich aber irgendwie mit einem anderen wort ganz gut reimt.
>
> Auch wichtig: Wenn du als Wert fürs Syncronisationsbyte z.B. 255 festlegst musst ausserdem
> sicher sein, dass weder "grun" noch "weis" noch "musik" jemals den Wert 255 annehmen solange
> der SLAVE in der main loop auf das sync byte lauert.
>
> MAPIs Anregung folgend hab mal die PAUSE ´durch ein Quittungsbyzte erstzt auf das der MASTER   nach jedem DATENSATZ erst wartet.  (GET Anweisung in "senden")
>
>
> Auf die Schnelle:
>
> DEFINE sync 255
>
>
> DEFINE wert Byte[1]
> DEFINE grun Byte[2]
> DEFINE weis Byte[3]
> DEFINE musik Byte[4]
>
>
> '--------------- MASTER:
>
> option ccbasic ' ( Falls OCBASIC mit C-Control 1.1 nutzt )
>
> #main
>
> 'Dein Programn bereitet die Werte von grun, weis und musik vor ...
>
> GOSUB senden  ' bzw. "senden(grun,weis,musik)" falls OCBASIC
>
> GOTO main
>
>
>
> function senden()
> put sync         ' 255      
> put grun         ' 0...255
> put weis         ' 0... 255
> put musik      ' 0 ... 255
> GET wert      ' Frei nach MAPI: MASTER wartet auf beliebiges Byte vom SLAVE
> end function
>
>
>
>
> '----- SLAVE -----
>
>
> #main
>
> IF rxd THEN GOSUB Testen    ' Nur wenn überhaupt ein neues Byte empfangen wurde
>
> ' Hier kannst noch andere Sachen reintun....
>
> GOTO main
>
>
> #Testen
>
> GET wert       ' Das ein Byte abgeholt werden kann wissen wir ja schon
> IF wert >< sync THEN RETURN  ' ungleich 255? .. dann wieder auf die laauer legen
> GET grun     ' drei nachflogende werte abholen. GET ohne IF rxd ... wartet ggfs. endlos
> GET weis   ' bis ein byte empfangen wurde. Dies garantiert aber auch das nach empfang des  .
> GETmusik ' (echten) sync bytes kein verlust der synchronisation auftreten kann, es sei denn der
>                '8 bytes große empfangspuffer der RS232 läuft über.
> PUT sync '  Ftrei navch MAPI: Meldung an MASTER das es weitergehen kann
> RETURN
>
>  Gehts damit?
>
> PS welches BASIC (CCBASIC, BASIC++ OCBASIC?) und welche C-cIOntrol Hardware verwendest du.
>
>
> Fallst 2 Main-Unit Ausführungen der C-Control (I) 1.1 verwendest koennten als Alternative mit dem BASIC Befehl "HANDSHAKE ON" die dort  mit den dort herausgeführten RTS/CTS Leitungen der RS232 aktiviert und so die Flußsteuerung automatisch per Hardware erledigt werden.
>
> Erknttnis:
>
> Auf den ersten blick erscheint die gestellte aufgabe trivial. Problematidsch ist die fehlende Synchronisation zweier ohne (Daten) Flußsteuerung  verbunden Controller die erstaunlich viele
> Freiheitsgrade für  Laufzeitfehler zuläßt. --> Gib zu du willst uns testen :-))
>
>
>  
>
>
>
>
>
>
>
>
> > > Meine Vermutung:
> > >
> > Hallöchen
> > Danke für deine Antwort! Ich werde dir auf jeden Fall noch eine Beschreibung geben.
> > Aber zur Aufgabe: wird mein Programm nicht lahm durch die pausen?
> > naja ich werd ma was aus probieren. Aber schau doch auch ma in die andere Antwort von mir rein. Vielleciht hast du noch ne Idee.
> >
> > Gruß ALEX
> >
> >
> > > Wenn Master die function 'senden()' ohne Verzoegerung mit voller Geschwindikeit der main - Schleife immer wieder aufruft wird der 8 Bytes grosse RS232 Empfangspuffer des Slave schneller gefuellt als das Empfangsprogramm dort die Daten auslesen und verarbeiten kann.
> > >
> > > Solange kein Platz im Empfanmgspuffer (wieder) freigeworden ist, gehen empfangene Zeichen verloren, Master und Slave sind nicht mehr snyhron und die Anzeige flakcert.
> > >
> > >
> > > Versuch mal:
> > >
> > > > function senden()
> > > > put sync
> > > > put grün
> > > > put weis
> > > > put musik
> > >   PAUSE xyz '
> > > > end function
> > >
> > > Wert fuer 'xyz' must ausprobieren z.B. erst 100 oder 50, dann 75 oder 25, dann 62 oder 12, usw.
> > >
> > > Der Trick mit dem Sync-Byte ist dann nicht noetig, wodurch der Slave auch etwas schneller wird.
> > >
> > > Statt
> > >
> > > >if rxd = true then
> > > >          get x
> > > > end if
> > >
> > > kannst direkt schreiben
> > >
> > >  IF rxd THEN GET x
> > >
> > >
> > > Bei Erfolg würd mich mal deine Projektbeschreibung interessieren, vielleicht mit Hardwarebeschreibung zum Nachbauen
> > > ?
> > > Klingt jedenfalls interessant....
> > >

 Antwort schreiben

Bisherige Antworten:

Re: Kommunikation 2er units (von Alex - 16.11.2010 4:28)
    Re: Kommunikation 2er units (von Grübel Denk - 4.12.2010 12:28)