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

Re: 32 Digital-Eingänge? Kategorie: CC2-Unit & Appl.Board / CC2-Station (von joe - 6.09.2004 20:29)
Als Antwort auf Re: 32 Digital-Eingänge? von André H. - 4.09.2004 8:34
Ich nutze:
C-Control II Station, OSOPT V3.0
Hallo zusammen,

sorry, aber ich glaub, ich bin zu blöd um zu programmieren.
Wenn ich einen Schalter an P0  ... P7(i2c-max7311-board ) betätige, wird der Portinhalt richtig über
die Funktion showports angezeigt und richtig über die RS232 übertragen.
Beim Drücken bzw. Loslassen eines Schalters P8...P15(i2c-max7311-board ) wird
der PortInhalt  RICHTIG angezeigt,
ABER via RS232 NICHT RICHTIG übertragen, d.h. es kommt immer eine 0 (inp=0 und out=0)rüber.
Ich verstehs nicht, was mach ich nur falsch.

mfg Joe


function showports(int read, int y)
{byte i;
 lcdext.line(y);
 for i=0 ... 15
 {//Zeile anzeigen
  lcdext.ziff(((read shr i) and 1));
 }
}

 byte sbuf[12];
 int inp, new, out;
 byte flag;
 system.TIME time;

thread main
{ // Initialisierung
  stports.init();
 lcdext.init();
 hwcom.init();
 hwcom.setspeed(8);

 max7311.setDDRw(0,0xFFFF);
 inp= max7311.getw(0);
 new= inp;
 loop
 {
  wait not ports.get(8); // Interrupt
       inp= max7311.getw(0); //Hole Word vom MAX7311
       out= inp ^ new;        // Welches Bit hat sich geändert?
       system.gettime ( time );
       sbuf[0]=system.day();
       sbuf[1]=system.month();
       sbuf[2]=system.year();
       sbuf[3]=time.hour;
       sbuf[4]=time.minute;
       sbuf[5]=time.second;
       sbuf[6]=out;
       sbuf[8]=inp ;
       sbuf[10]=13;
       sbuf[11]=10;
       showports(inp,1);
       showports(out,2);
       new= inp;
       while not hwcom.ready();
       hwcom.send(sbuf, 12);
  }
 }







> Hallo joe,
>
> > möchte von CNC-Maschinen die Standzeiten bzw. Laufzeiten erfassen. Relaisausgänge
> > von den CNC-Maschinen sind da. Ich denke da an ca. 24-32 Eingänge.
> > Hab mir das so vorgestellt:
> > Das c-Control sammelt die Schaltpunkte (mit Zeitstempel und Maschinen-Nummer) und
> > gibt sie dann an den PC im Laufe eines Tages weiter.
> >
> >
> > hab jetzt die Station mit i2c-max7311-board aufgebaut und programmiert.
> > Schalter an Port P3 und P13 des I2C-Boards geklemmt.
> > Interrupteingang auf P0/cc-Station gelegt.
> > Läuft soweit gut.
> >
> > Mein Problem:
> > Wenn ich einen von den 2 Schaltern betätige, bekomm ich manchmal die Werte
> > inp1=0
> > inp2=0  
> > out1=0
> > out2=0 übertragen, obwohl P0 gar nicht aktiv ist.
>
> Zuerst: Bitte setze C2 Quellcode immer in die code-Tags. Dann lässt sich's leichter lesen !
>            Auch wird dann Quellcode nicht verfälscht dargestellt, sobald GröÃ?er- und kleinerzeichen
>            vorkommen.
>
> Ich nehme einmal an, da� einfach zwei Interrupts ausgelöst werden. Denn ein Interrupt
> seitens I²C-Portexpander wird bei jeder �nderung am Port seit dem letzten abgefragten
> Zustand ausgelöst. Also hier einmal bei Drücken und einmal beim loslassen.
>
> Nun noch ein paar Anmerkungen zu Deinen Routinen:
>
> > // Beginn Code---------------------------------
> > thread main
> > { // Initialisierung
> >  stports.init();
> >  lcdext.init();
> >  i2c.init();
>
> Ein Init des I²C-Busses ist unnötig, da dies bereits vom OS beim Systemstart übernommen wird.
>
> >  hwcom.init();
> >  hwcom.setspeed(8);
> >
> >  inp1=max7311.getb(0, 0);
> >  inp2=max7311.getb(0, 1);
>
> Warum lieÃ?t Du den MAx7311 byteweise aus ?
> Besser wäre es mit Integer zu arbeiten und den ganzen Baustein komplett
> mit max7311.getw(0); auszulesen.
>
> >  new1=  inp1;
> >  new2=  inp2;
> >  loop
> >  {
> >  wait((ports.get(8) & 0x01 )==0 ); // warten bis Interrupt ausgelöst wird...
>
> Ein (ports.get(8) & 0x01 )==0 ist unnötig, da die Rückgabe bei ports.get()
> entweder -1 oder 0 sein. Somit würde ein wait not ports.get(8); völlig reichen.
>
> >        inp1= max7311.getb(0, 0); //Hole 1.Byte vom MAX7311
> >        inp2= max7311.getb(0, 1); //Hole 2.Byte vom MAX7311
>
> Hier wieder dasselbe, wie oben. Ein auslesen als Integer und eine Bearbeitung als Integer spart
> einiges an Programmzeilen und fördert u.a. auch die �bersichtlichkeit.
>
> >        out1= inp1 ^ new1;        // XOR : Welches Bit hat sich geändert?
> >        out2= inp2 ^ new2;        // XOR : Welches Bit hat sich geändert?
> >        system.gettime ( time );
> >        sbuf[0]=system.day();
> >        sbuf[2]=system.month();
> >        sbuf[4]=system.year();
> >        sbuf[6]=time.hour;
> >        sbuf[8]=time.minute;
> >        sbuf[10]=time.second;
> >        sbuf[12]=out1;
> >        sbuf[13]=out2;
> >        sbuf[14]=inp1;
> >        sbuf[15]=inp2;
> >        sbuf[16]=13;
> >        sbuf[17]=10;
>
> Was ist das mit sbuf[] ?
> Du speicherst die Zeitangaben nur in jedem zweiten Byte ab. Die Bytes sbuf[1], sbuf[3], sbuf[5],
> sbuf[7] sbuf[9] und sbuf[11] sind immer undefiniert. Also 6 überflüssige Bytes.
>
> > /*       showports(inp1,1);
> >        showports(out1,2);*/
> >        hwcom.send(sbuf, 18);
>
> Wenn Du Datenrahmen mit hwcom sendest, solltest Du immer auf hwcom.ready() prüfen,
> bevor Du sbuf[] wieder bearbeitest. Denn das Senden geschieht im Hintergrund.
>
> >        new1= inp1;
> >        new2= inp2;
> > }
> > }
> > // Ende Code---------------------------------
>
> MfG André H.
>


    Antwort schreiben


Antworten:

Re: 32 Digital-Eingänge? (von André H. - 6.09.2004 21:00)
    Re: 32 Digital-Eingänge? (von joe - 8.09.2004 19:27)
        Re: 32 Digital-Eingänge? (von joe - 8.09.2004 21:18)