Für dieses Forum muß Javascript im Browser aktiviert werden!
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 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 <code>max7311.getw(0);</code> auszulesen. > > > new1= inp1; > > new2= inp2; > > loop > > { > > wait((ports.get(8) & 0x01 )==0 ); // warten bis Interrupt ausgelöst wird... > > Ein <code>(ports.get(8) & 0x01 )==0</code> ist unnötig, da die Rückgabe bei <code>ports.get()</code> > entweder -1 oder 0 sein. Somit würde ein <code>wait not ports.get(8);</code> 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 <code>hwcom.ready()</code> prüfen, > bevor Du sbuf[] wieder bearbeitest. Denn das Senden geschieht im Hintergrund. > > > new1= inp1; > > new2= inp2; > > } > > } > > // Ende Code--------------------------------- > > MfG André H.