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

Re: Einlesen serieller Daten mit Clock-Leitung Kategorie: Programmierung (von Detlef K. - 3.09.2010 15:44)
Als Antwort auf Re: Einlesen serieller Daten mit Clock-Leitung von André H. - 29.08.2010 19:50

Hallo, funktioniert prima.
Erst beim Testen fiel auf, dass das eher um die 10 Baud sind
(2,5 Sekunden für 32bit, dann 5 Sekunden Pause).
Habe den Code etwas umgestellt (für meine Lesbarkeit) und angepasst
(Timeoutzeiten / keine Ausgabe der Null beim Timeout)
Im zweiten "if ..." fehlte im Code noch ein "i=0;", falls es keine Pause grö�er als das Timeout gibt.

Vielen, vielen Dank, wieder was gelernt.
Detlef K.


thread main
{long timer, timer2, wert;
 byte i;
 byte CLK; byte Data;
 ports.deactb(1);


 CLK=8; //P1H.0
 Data=9; //P1H.1

 hwcom.setspeed(5);//9600
 hwcom.print("Test SerIO");
 hwcom.ret();

 timer=system.timer();

// Version LSB zuerst
 loop
 {
  wait ports.get(CLK);
  wert=wert or cast.intLong(ports.get(Data) and 1) shl i;
  wait not ports.get(CLK);
  i=i+1;
 
  if system.timer()-timer>3000 //32bit dauern ca. 2,5 Sekunden, dann Pause 5 Sekunden
   { // Timeout
    i=0;
    wert=0;
    timer=system.timer(); //muss rein, wenn i==0 im nächsten IF entfällt
   }

  if i>31 //or i==0
   {
    hwcom.num(wert);
    hwcom.print(" ");
    hwcom.num(system.timer()-timer2); //Zeitmessung
    hwcom.ret();
   
    timer=system.timer();
    timer2=system.timer();
    wert=0;
    i=0; //fehlte
   }
 }
}



> Hallo Detlef,
>
> > Ahhh.
> > Auf die Clock High warten, Wert übernehmen und einsortieren, Clock Low warten,
> > wiederholen bis 32. Und dazu noch mit Timeout. Muss man erst mal drauf kommen.
> > Bei mir ist das MSB zuerst, wie dreh ich das ganze dann um? (shr 2^32-i)?
> > oder geht das auch eleganter?
>
> Nein, das ist zu umständlich.
> So geht's einfacher:
>
> CLK=15; //P1H.7
> Data=14; //P1H.6
> thread main
> {long timer, wert;
>  byte i;
>  hwcom.setspeed(8);//57.600Baud für Testausgabe über ein Terminalprogram (Hyperterminal)
>  timer=system.timer();
>  loop
>  {
>   wait ports.get(CLK);
>   if system.timer()-timer>100
>    { // Timeout bei >100ms
>     i=31;
>     wert=0;
>    }
>   wert=wert or cast.intLong(ports.get(Data) and 1) shl i;
>   wait not ports.get(CLK);
>   if i>=32 or i==0
>    {
>     hwcom.num(wert);
>     hwcom.ret();
>     timer=system.timer();
>     wert=0;
>    }
>   i=i-1;
>  }
> }
>

>
> MfG André H.


    Antwort schreiben


Antworten: