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

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: