Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> Hallo skontox, > > > Ich habe die CC2 mit einem Datenhandschuh über die RS232-Schnittstelle mit 9600 Baut gekoppelt! > > Problem ist, dass der Handschuh seine Daten permanent sendet (kein Empfang möglich!) und ich bei größeren > > Berechnungen mit den empfangenen Werten Probleme mit der Synkronisation mit dem Empfang habe. > > Bei kleineren Berechnungen läuft es ganz gut! > > Wie oft sendet wird der Datenrahmen pro Sekunde gesendet ? > Wie lange dauert das Senden? > Gibt es eine Pause zwischen zwei Datenrahmen ? > Aus dem Quellcode konnte ich erkennen, daß ein Datenrahmen 10 Byte hat > und folgenden Aufbau besitzt: > 1.Byte Start-Kennzeichen: Wert 1 > Byte 2 bis 9: 8 Datenbytes > 10.Byte Ende-Kennzeichen: Wert 128 > > > Was kann man da machen? Wahrscheinlich ist mein Code auch nicht so super, aber auf die Schnelle > > viel mir nix besseres ein. > Was soll später, außer dem Modell-Auto :-) , einmal gesteuert werden ? > Das Problem könnte die Rechenzeit werden. > > Wenn zuviele Daten zu schnell ankommen, hiflt nur, daß Du einen Teil davon auswertest, und > den Rest ignorierst.(Puffer regelmäßg mit hwcom.flush() leeren bis die daten wieder > ausgewertet werden sollen) Das geht natürlich nur, wenn der Datenhandschuh immer die > aktuelle Stellung der Hand sendet, und nicht die Bewegung selbst. > > Zu hwcom: > Es reicht, wenn Du die Schnittstelle am Anfang des Mainthreads einmal initialisierst und die > Baudrate setzt. Hier solltest Du auch einmal mit hwcom.flush() den Empfangspuffer > leeren, wenn bereits vor dem System-Start der CC2 Daten empfangen werden. > > Deine Hauptschleife kann man folgendermaßen optimieren:<code> > ... > byte errcnt; > run 255;// Maximale Prio, nur bei Single-Thread Anwendungen empfohlen ! > hwcom.flush(); > errcnt=0; > loop > { > wait hwcom.rxd(); > if hwcom.get()==1 //Endzeichen im Paket > { > wait hwcom.rxd(); > if hwcom.get()==128 //Startzeichen im Paket > { > errcnt=0; > wait hwcom.rxd();hwcom.get(); //Byte 1 ignorieren > wait hwcom.rxd();hwcom.get(); //Byte 2 ignorieren > wait hwcom.rxd();hwcom.get(); //Byte 3 ignorieren > wait hwcom.rxd();hwcom.get(); //Byte 4 ignorieren > wait hwcom.rxd();hwcom.get(); //Byte 5 ignorieren > > wait hwcom.rxd(); //Byte 6 > wert= hwcom.get();//Enthält den "Pitch"-Wert Wert 255 ganz nach vorne gekippt! > //Wert 0 ganz nach hinten. 127 genau die Waage > if wert>=130 and wert<=155 //Der Wagen soll nicht fahren! > { > ports.set(0,0); //Vorwärts ist aus > ports.set(1,0); //Rückwärts ist aus > } > else > if wert<130 //Der Wagen soll Rückwärts fahren > { > ports.set(0,0); //Vorwärts ist aus > ports.set(1,1); //Rückwärts ist an > } > else > if wert>155 //Der Wagen soll Vorwärts fahren > { > ports.set(1,0); //Rückwärts ist aus > ports.set(0,1); //Vorwärts ist an > } > wait hwcom.rxd(); //Byte 7 > wert= hwcom.get();//Enthält den "Roll"-Wert Wert 255 ganz nach vorne gekippt! > //Wert 0 ganz nach hinten. 127 genau die Waage > if wert>=100 and wert<=155 //Der Wagen soll nicht lenken! > { > ports.set(2,0); //Rechts ist aus > ports.set(3,0); //Links ist aus > } > else > if wert<100 > { > ports.set(2,0); //Rechts ist aus > ports.set(3,1); //Links ist an > } > else > if wert>155 > { > ports.set(3,0); //Links ist aus > ports.set(2,1); //Rechts ist an > } > > wait hwcom.rxd();hwcom.get(); //Byte 8 ignorieren > } > else > { > errcnt=errcnt+1; > if errcnt>=20 break; // Schleife verlassen => keine sync möglich > } > } > else > { > errcnt=errcnt+1; > if errcnt>=20 break; // Schleife verlassen => keine sync möglich > } > } > resume; > ...</code> > Ich habe hier die For-Schleife und die damit zusammenhängenden > If-Abfragen weggelassen, da diese zu viel Zeit in Anspruch nehmen. > Dafür wird öfters mit hwcom.get() gerabeitet. > Die Syncronisation habe ich auch angepasst. Selbst, wenn diese einmal > verlorengehen sollte, sollte der Datenrahmen wieder erkannt werden. > Dazu werden bis zu 20 Byte ausgewertet, um den Beginn eines Datenrahmen > zu finden. Wird dieser nicht gefunden, so wird die Schleife verlassen. > > Wenn Du mit Multithreading arbeitest, solltest du die Prio des Loops etwas herabsetzen. > (statt run 255 z.B. run 128) > Du kannst die Eingelesenen Werte auch Global verfügbar machen, indem Du > statt auf diese zu reagieren, erstmal in ein Byte-Array schreibst, und dann mit > einem anderem Thread mit den Daten entsprechend "reagierst". > Hier könnte man zwar wieder mit einer For-Schleife arbeiten, jedoch sollten > die extra-Programmzeilen vorgezogen werden, um sich die Rechenzeit der For-Schleife > selbst zu sparen: > > Mit For-Schleife:<font face="Courier New" size=2> > for i=0 ... 7 {wait hwcom.rxd;Data[i]=hwcom.get();}</font> > > Ohne For-Schleife:<font face="courier New" size=2> > wait hwcom.rxd(); > Data[0]=hwcom.get(); > wait hwcom.rxd(); > Data[1]=hwcom.get(); > wait hwcom.rxd(); > Data[2]=hwcom.get(); > wait hwcom.rxd(); > Data[3]=hwcom.get(); > wait hwcom.rxd(); > Data[4]=hwcom.get(); > wait hwcom.rxd(); > Data[5]=hwcom.get(); > wait hwcom.rxd(); > Data[6]=hwcom.get(); > wait hwcom.rxd(); > Data[7]=hwcom.get();</font> > > > Ich hoffe, das hilft Dir weiter. > Probiere die abgeänderte Schleife einmal aus und schreib, ob's funzt. :-) > > MfG André H.
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB