Re: 32 Digital-Eingänge? Kategorie: CC2-Unit & Appl.Board / CC2-Station (von André H. - 4.09.2004 8:34) | ||
Als Antwort auf Re: 32 Digital-Eingänge? von joe - 1.09.2004 19:47 | ||
| ||
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. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: 32 Digital-Eingänge? (von joe - 6.09.2004 20:29) 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) |