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 - 9.11.2010 15:27)
 Als Antwort auf Re: Kommunikation 2er units von Alex - 9.11.2010 0:30
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 Grübel Denk - 11.11.2010 17:17)
    Re: Kommunikation 2er units (von Alex - 16.11.2010 4:28)
        Re: Kommunikation 2er units (von Grübel Denk - 4.12.2010 12:28)