Re: Init LCD in lcdext vs. pcflcd Kategorie: Sonstige Hardware (von Rolf - 23.08.2003 17:16) | |
Als Antwort auf Re: Init LCD in lcdext vs. pcflcd von André H. - 22.08.2003 16:54
| |
Hallo André > > 1.Ist es möglich, das BF-Flag mit dem PCF-Modul auszulesen und wenn ja, wie? > > Es ist möglich: > > i2c.cstart(addr); > i2c.write(0xF2); > i2c.write(0xF6); > i2c.stop(); > i2c.cstart(addr or 1); > BF= (i2c.readlast() and 0x80)!=0; > i2c.stop(); > i2c.cstart(addr); > i2c.write(0xF2); > i2c.write(0xF0); > i2c.stop(); Ich habe gemä� Deinem Vorschlag und mit Einsicht in die Datenblätter folgende Funktion erstellt: function WriteCmd (byte pcfnr, byte cmd) {byte PCF; if pcfnr > 7 PCF=((pcfnr+16) shl 1)or 64; else PCF=(pcfnr shl 1) or 64; i2c.cstart(PCF); i2c.write((cmd and 0xF0) or light[pcfnr]); i2c.write((cmd and 0xF0) or light[pcfnr] or 0x4);// HighNibble i2c.write((cmd and 0xF0) or light[pcfnr]); i2c.write((cmd shl 4) or light[pcfnr] or 0x4); // LowNibble i2c.write((cmd shl 4) or light[pcfnr]); // i2c.write(light[pcfnr] or 0x1); // i2c.stop(); sleep 20; //i2c.cstart(PCF); i2c.write(0xF2);// D4-7 = 1, RS = 0, RW = 1 i2c.write(0xF2 or 0x4);// E =1, BF steht erst bei fallender Flanke von E an i2c.write(0xF2);// Register BF+ADDR Counter high Nibble liegt nun an D4-7 i2c.stop(); i2c.cstart(PCF or 1); //Lesen High Nibble ins PCF if (i2c.readlast() and 0x80)!=0 //Zu schnell -> sleep oben höher setzen { plm.beep (12);// einmal kurz piepen sleep 100; // Status nun unklar da BF überrannt plm.beep (-1);// }; i2c.stop(); // D7 = Bit 7 = BF-Status, D6-D4 = ADDR Counter i2c.cstart(PCF);// D4-7 = 1, RS = 0, RW = 1 i2c.write(0xF2 or 0x4);// E =1 i2c.write(0xF2);// Register BF+ADDR Counter low Nibble liegt nun an D4-7 i2c.stop(); i2c.cstart(PCF or 1); //Lesen Low NIbble i2c.readlast(); //wert wird noch verworfen, 2 x 4 Bit �bertragung abgeschlossen i2c.stop(); i2c.cstart(PCF); //Diese Sequenz setzt das Display in den Schreibmodus i2c.write(0xF0); //Setzen des PCF, D4-D7=1, RS=0,RW=0,E=0 i2c.stop(); } Eigentlich müste ich damit das BF-Flag auslesen könen, wie Du sagst. Die Funkktion dürfte nur piepen wenn BF 1 also Bussy hat. Ich zitiere aus dem Datenblatt: "Interfacing to the MPU The HD44780U can send data in either two 4-bit operations or one 8-bit operation, thus allowing interfacing with 4- or 8-bit MPUs. For 4-bit interface data, only four bus lines (DB4 to DB7) are used for transfer. Bus lines DB0 to DB3 are disabled. The data transfer between the HD44780U and the MPU is completed after the 4-bit data has been transferred twice. As for the order of data transfer, the four high order bits (for 8-bit operation, DB4 to DB7) are transferred before the four low order bits (for 8-bit operation, DB0 to DB3). The busy flag must be checked (one instruction) after the 4-bit data has been transferred twice. Two more 4-bit operations then transfer the busy flag and address counter data." Das "BF"-Flag ist immer 1, selbst wenn mann 20 ms wartet. Eigentlich dürfte sie nur bei sehr kleinen sleep-Werten Alarm geben und mit steigenden Sleepwerten müste es aufhören (weil dann das Timing eingehalten wird). Oder der i2c ist zu langsam, dann dürfte BF niemals 1 sein. Daraus schlie�e ich, das entweder noch ein Denkfehler in der Funktion ist oder Du unrecht bezüglich Deiner Angaben zum Lesen des BF hast. Ich würde Dir gerne Recht geben aber dazu mu� die Funktion wie erwartet arbeiten. In Deinem Beispiel liest Du BF vor der fallenden Flanke von E ein. Das Datenblatt ist dazu wie zitiert eindeutig. Und werde bitte nicht wieder ausfallend. Gru� Rolf | |
Antwort schreiben Antworten: |