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 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 > > <code> > 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); > } > } > </code> > > > > > > > > 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. > >