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 | ||
| ||
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) |