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 Ralf, > > danke für die schnelle Antwort! > > Hmm, also wenn ich jedem pcf8574 einen Port als Interrupt zuordne.. > Dann würde er in diesem Moment auch nur abgefragt.. > Das hört sich gut an, allerdings müßte ich da auch einiges in dem > Modul pcfkeyb.c2 ändern. > Das geht immer von Port 15 aus. > Und über die Funktion getchar(0); wird immer auf ein Interrupt > (wait ports.get(IntPort)==0;) gewartet. > also müßte ich hier für jedes Modul eine eigene getchar Funktion erstellen. > Allerdings würde im Programm an der Stelle pcfkeyb.getchar(0); das > Programm warten bis ein Interrupt kommt. > Da ich dann aber drei getchar habe, die nacheinander im Programm stehen > würden, würde das Programm an allen drei einen Interrupt erwarten um weiterzulaufen! > Ich habe hier auch schon irgendwo gelesen das man alle Interrupts > zusammenschalten kann. > Allerdings müßte das Modul pcfkeyb.c2 entsprechend geändert werden! > > Ich bin jetzt so weit: > > <code> > const IntPort=15;// Port für PCF-Interrupt (0 bis 15) > // Dieser Port benötigt einen Pull-Up Widerstand (z.B. 10k) > const Char[]= 0x41,0x42,0x43,0x44, // rechte Spalte > 0x45,0x46,0x47,0x48, // mittlere Spalte > 0x49,0x4a,0x4b,0x4c, // linke Spalte > 0x4d,0x4e,0x4f,0x50; // Nur für 4x4 Matrix > const Char1[]= 0x51,0x52,0x53,0x54, // rechte Spalte > 0x55,0x56,0x57,0x58, // mittlere Spalte > 0x59,0x5a,0x5b,0x5c, // linke Spalte > 0x5d,0x5e,0x5f,0x60; // Nur für 4x4 Matrix > > > > > //Das Array Char[] muß für eine 4x4 Matrix angepasst werden. > byte PCF,PCF1,pressed,presseda,Matrix,Matrix1; > /****************************************/ > /* PCF8574 für Matrix-Tastatur */ > /* initialisieren */ > /****************************************/ > function init(byte pcf,byte pcf1,byte matrix) > //pcf: 0 bis 7 =PCF8574; 8 bis 15 =PCF8574A > //matrix: 0 = 3x4; 1= 4x4 > { > if pcf > 7 PCF=((pcf+16) shl 1) or 64; else PCF=(pcf shl 1) or 64; > Matrix= (matrix==0) and 0x80; > i2c.cstart(PCF); > i2c.write(Matrix or 0xF); > i2c.stop(); > > if pcf1 > 7 PCF1=((pcf1+16) shl 1) or 64; else PCF1=(pcf1 shl 1) or 64; > Matrix1= (matrix==0) and 0x80; > i2c.cstart(PCF1); > i2c.write(Matrix1 or 0xF); > i2c.stop(); > } > > > > > > function getstate() returns int > {int chars;byte i; > chars=0; > for i=0 ... 3 - (Matrix shr 7) > { > i2c.cstart(PCF); > i2c.write(not(0x10 shl i)or Matrix); > i2c.stop(); > i2c.cstart(PCF or 1); > chars=chars or ((not i2c.readlast() and 0xF) shl (4*i)); > i2c.stop(); > } > i2c.cstart(PCF); > i2c.write(0xF or Matrix); > i2c.stop(); > return chars; > > } > > function getstate1() returns int > {int chars1;byte i1; > chars1=0; > > for i1=0 ... 3 - (Matrix1 shr 7) > { > i2c.cstart(PCF1); > i2c.write(not(0x10 shl i1)or Matrix1); > i2c.stop(); > i2c.cstart(PCF1 or 1); > chars1=chars1 or ((not i2c.readlast() and 0xF) shl (4*i1)); > i2c.stop(); > } > i2c.cstart(PCF1); > i2c.write(0xF or Matrix1); > i2c.stop(); > return chars1; > > } > > /****************************************/ > /* Auf Tasteneingabe warten und */ > /* Wert als ASCII-Zeichen zurückgeben */ > /****************************************/ > function getchar(byte delay) returns byte //delay in ms = Wartezeit bis Abfrage > {int chars,charsa,chars2,chars2a; byte i,ia; > chars=0; > charsa=0; > wait ports.get(IntPort)==0; > if delay > { > chars=getstate(); > charsa=getstate1(); > sleep delay;} > chars2=getstate(); > chars2a=getstate1(); > if chars2 {chars=chars2;pressed=0xFF;} else pressed=0; > if chars2a {charsa=chars2a;presseda=0xFF;} else presseda=0; > for i=0...15 > if chars and (1 shl i) > return Char[i]; > > for ia=0...15 > if charsa and (1 shl ia) > return Char1[ia];// Rückgabe des ASCII-Codes beim Drücken einer Taste > return 0;// Rückgabe von 0 beim loslassen einer Taste > } > </code> > > hier jetzt das Modul mit zwei pcf8574 die beide mit demselben > Interrupt arbeiten. > Ich habe hier jetzt einfach beim Init noch einn PCF1 eingebaut. > Sonst wird die Initialisierung immer wieder von dem nächsten 8574 > Überschrieben. Das klappt auch so weit! > > Aber der Knackpunkt liegt irgendwie in getstate! > > Wer kann mir da weiterhelfen?? > > Gruß, > > Borris