Hallo, ich habe mal wieder ein Projekt und diesmal wollte ich ein paar Leitungen am ATMega sparen und habe mir so einen Port-Expander von mjkdz (vermutlich mit PCA8574D) bestellt. Normalerweise verwende ich die LCD-Library von Peter Fleury und nun habe ich eigentlich gehofft, auf die schnelle einen Weg zu finden, wie ich die weiterhin nutzen kann, diesen I2C-Expander aber einfach dazwischen bekomme. Nur hat meine Internet-Recherche bisher recht wenig ergeben, wie man das wohl machen könnte. Hat einer von Euch das schon mal erfolgreich hinbekommen? Oder bin ich mit meinem Ansatz sogar auf dem Holzweg und es gibt eine ganz andere Lösung? Bei AVR-Freaks ist ein Thread, wo jemand den am ATtiny betreibt, allerdings macht der die LCD-Steuerung auch von Hand und nicht über eine Library wie die von Fleury. Danke für jeden Beitrag, Stefan
Stefan R. schrieb: > Hallo, > > ich habe mal wieder ein Projekt und diesmal wollte ich ein paar > Leitungen am ATMega sparen und habe mir so einen Port-Expander von mjkdz > (vermutlich mit PCA8574D) bestellt. Normalerweise verwende ich die > LCD-Library von Peter Fleury und nun habe ich eigentlich gehofft, auf > die schnelle einen Weg zu finden, wie ich die weiterhin nutzen kann, > diesen I2C-Expander aber einfach dazwischen bekomme. Nur hat meine > Internet-Recherche bisher recht wenig ergeben, wie man das wohl machen > könnte. Du hättest weniger in Internet Recherche investieren sollen, sondern mehr in den Source Code der LCD-Funktionen. Du musst die Stelle finden, an der die eigentliche Ausgabe auf die Portpins passiert. Jeder halbwegs vernünftige Programmierer baut sich seine LCD-Funtkionen so auf, dass alles in mehr oder weniger einer einzigen Ausgabe-Funktion zusammenläuft, die die tatsächliche Arbeit des Pin setzens bzw. löschens für ein auszugebendes Byte erledigt. Die gilt es im Code zu finden. Und dort ist dann dein Eingreifpunkt, an dem du das Byte dann eben nicht auf die diversen Portpins rausgibst sondern die Anpassung an deine spezielle Hardware machst. Zum Beispiel die Ausgabe an einen Port-Expander. Die Ausgabe bzw. Behandlung der Steuerleitungen nicht vergessen!
:
Bearbeitet durch Admin
Karl Heinz schrieb: > Jeder halbwegs vernünftige Programmierer baut sich > seine LCD-Funtkionen so auf Es müsste dann eigentlich irgendwo eine Standardbib geben damit nicht jeder über den Aufbau der LCD-Funktionen neu nachdenken muss.
1 | //++++++++++++ hardware-funktion 1: ++++++++++++++++++++
|
2 | void lcdset(lcdbyte){ |
3 | #if use_lcd4bit
|
4 | if gbi(lcdbyte,2){sbi(PORT(RS_Port),(RS_Pin));}else{cbi(PORT(RS_Port),(RS_Pin));} |
5 | lcdbyte &= 0xf0; |
6 | cbi(PORT(db4_Port),db4_Pin); |
7 | PORT(db4_Port)|=(gbi(lcdbyte,4))<<db4_Pin; |
8 | cbi(PORT(db5_Port),db5_Pin); |
9 | PORT(db5_Port)|=(gbi(lcdbyte,5))<<db5_Pin; |
10 | cbi(PORT(db6_Port),db6_Pin); |
11 | PORT(db6_Port)|=(gbi(lcdbyte,6))<<db6_Pin; |
12 | cbi(PORT(db7_Port),db7_Pin); |
13 | PORT(db7_Port)|=(gbi(lcdbyte,7))<<db7_Pin; |
14 | #endif
|
15 | |
16 | #if use_mcp23s17_lcd
|
17 | //mcp23s17A_send(0x12,lcdbyte);
|
18 | hwSpiA(0x12,lcdbyte); |
19 | #endif
|
20 | |
21 | #if use_twilcd64x || use_twilcd64
|
22 | i2c_start_wait(64); |
23 | i2c_write(lcdbyte); // |
24 | i2c_stop(); |
25 | #endif
|
26 | |
27 | #if use_twilcd72x
|
28 | set_mcp23017_outAB(lcdbyte , 0); |
29 | #endif
|
30 | |
31 | #if use_lcd74hc
|
32 | send74hc16bitlcd(lcdbyte & 12,lcdbyte & 0xf0); |
33 | #endif
|
34 | }//------- void lcdset(lcdbyte) ------------------ |
35 | |
36 | |
37 | //++++++++++++ hardware-funktion 2: ++++++++++++++++++++
|
38 | void lcdsetE(lcdbyte){ |
39 | #if use_lcd4bit
|
40 | lcdset(lcdbyte); |
41 | sbi(PORT(En_Port),(En_Pin)); |
42 | cbi(PORT(En_Port),(En_Pin)); |
43 | #endif
|
44 | |
45 | #if use_twilcd64
|
46 | i2c_start_wait(varADR_SLAVE_LCD); |
47 | i2c_write(lcdbyte); // |
48 | i2c_write(lcdbyte+WERTpinE); // |
49 | i2c_write(lcdbyte); // |
50 | i2c_stop(); |
51 | #endif
|
52 | |
53 | #if use_mcp23s17_lcd
|
54 | /*mcp23s17A_send(0x12,lcdbyte);
|
55 | mcp23s17A_send(0x12,lcdbyte+WERTpinE);
|
56 | mcp23s17A_send(0x12,lcdbyte);*/
|
57 | hwSpiA(0x12,lcdbyte); |
58 | hwSpiA(0x12,lcdbyte+WERTpinE); |
59 | hwSpiA(0x12,lcdbyte); |
60 | #endif
|
61 | |
62 | #if use_twilcd72
|
63 | //uint8_t mcp23017_72_A,mcp23017_72_B;
|
64 | //lcdbyte d7-d6-d5-d4-en-rs-//-//
|
65 | mcp23017_72_A= (mcp23017_72_A & 0b00000011) + (lcdbyte & 0b11111100); |
66 | //mcp23017_72_B= (mcp23017_72_B & 0b00111111) + (((lcdbyte & 0b00000100)<<5));
|
67 | set_mcp23017_outAB(mcp23017_72_A, mcp23017_72_B); |
68 | set_mcp23017_outAB((mcp23017_72_A + WERTpinE), mcp23017_72_B ); |
69 | set_mcp23017_outAB(mcp23017_72_A, mcp23017_72_B); |
70 | #endif
|
71 | |
72 | #if use_twilcd72x
|
73 | set_mcp23017_outAB(lcdbyte , 0); |
74 | set_mcp23017_outAB(lcdbyte + 8, 0); |
75 | set_mcp23017_outAB(lcdbyte , 0); |
76 | #endif
|
77 | |
78 | #if use_twilcd64x
|
79 | i2c_start_wait(varADR_SLAVE_LCD); |
80 | i2c_write(lcdbyte); // |
81 | i2c_write(lcdbyte+WERTpinE); // |
82 | i2c_write(lcdbyte); // |
83 | i2c_stop(); |
84 | #endif
|
85 | |
86 | #if use_lcd74hc
|
87 | send74hc16bitlcd(lcdbyte &4,lcdbyte & 0xf0); |
88 | send74hc16bitlcd((lcdbyte &4) + 8,lcdbyte & 0xf0); |
89 | send74hc16bitlcd(lcdbyte &4,lcdbyte & 0xf0); |
90 | #endif
|
91 | }//------------- lcdsetE(lcdbyte) ----------------------- |
92 | //------------ hardware-funktion 2: --------------------
|
leluno schrieb: > Karl Heinz schrieb: >> Jeder halbwegs vernünftige Programmierer baut sich >> seine LCD-Funtkionen so auf > > Es müsste dann eigentlich irgendwo eine Standardbib geben Ha! Willkommen in der Realität. Nichts ist so schwer durchzusetzen, wie Standards. Denn jeder hat eine andere Vorstellung davon, wie ein bestimmter Standard im Detail auszusehen hat. Und jeder erhebt seine persönlichen Vorlieben/Problemchen zum Standard.
:
Bearbeitet durch User
"Für ganz Faule" gibt es von Nico und Thomas Eichelman eine Lib zur Ansteuerung von LCDs über PCA8574X unter der Verwendung der I2C-Lib von Peter Fleury. http://computerheld.de/i2clcd/ Funktioniert auf die Schnelle wunderbar :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.