Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: pcfkeyb.c2 3x 8574 ansteuern Kategorie: I²C-Bus (von Borris Koszlat, http://www.nighteagle.de - 31.03.2006 10:59)
Als Antwort auf Re: pcfkeyb.c2 3x 8574 ansteuern von Ralf Meißner - 30.03.2006 18:35
Ich nutze:
C-Control II Unit, CC2-Application-Board, OSOPT V3.0
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:


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
}


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

Meine Seite: http://www.nighteagle.de


    Antwort schreiben


Antworten:

Re: pcfkeyb.c2 3x 8574 ansteuern (von Borris Koszlat - 1.04.2006 13:26)
    Re: pcfkeyb.c2 3x 8574 ansteuern (von krassos - 2.04.2006 8:32)
        Re: pcfkeyb.c2 3x 8574 ansteuern (von Borris Koszlat - 2.04.2006 14:43)