Hallo, ich möchte aus dem asuro Code den Code für die LCD Ansteuerung benutzen. Bevor ich aber ein LCD anschließe wollte ich schauen, ob die PCF8574 Ausgänge geschaltet werden. Doch leider funktioniert der Code nicht so, wie ich es haben möchte. Wenn ich den ausgeklammerten Code in der main aktiviere, so schaltet dieser alles richtig. Mache ich das über die Funktion in der while, so sind alle Ausgänge geschaltet. Wo genau ist mein Fehler? Meine Hardware ist AVR-Net IO + Addon. Wäre nett, wenn sich einer den Code anschauen würde.
Stefan T. schrieb: > Wenn ich den ausgeklammerten Code in der main aktiviere, so schaltet > > dieser alles richtig. wobei das nun nicht wirklich stimmt! Habe festgestellt, dass alle Ausgänge gleichzeitig geschaltet werden und nicht nur ein bestimmtes.
So ich benutze nun den pcf8574.c und .h von mikrocontroller seite mit TWI und jetzt klappt es mit den Schalten soweit. Ich SUCHE nun einen Code zu Ansteuerung des LCDs auf AVR NET IO + ADDON von Pollin. Kennt einer einer einen Code der auf Pollin Board funktioniert?
Ich poste mal meinen letzten Code den ich habe. Leider funktioniert die Initialisierung nicht. Ich bekomme zwei Balken angezeigt. Vielleicht sieht jemand das Problem. Angeschlossen ist es wie in lcd.h. pcf8574.c (von Mikrocontroller)
1 | #include "pcf8574.h" |
2 | |
3 | void pcf8574_init (void) |
4 | {
|
5 | /*set bus speed*/
|
6 | TWBR = 0x10; |
7 | }
|
8 | |
9 | unsigned char pcf8574_send_start (void) |
10 | {
|
11 | /*writing a one to TWINT clears it, TWSTA=Start, TWEN=TWI-enable*/
|
12 | TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); |
13 | /*wait, until start condition has been sent --> ACK*/
|
14 | while (!(TWCR & (1<<TWINT))); |
15 | return TWSR; |
16 | }
|
17 | |
18 | void pcf8574_send_stop (void) |
19 | {
|
20 | /*writing a one to TWINT clears it, TWSTO=Stop, TWEN=TWI-enable*/
|
21 | TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); |
22 | }
|
23 | |
24 | unsigned char pcf8574_send_add_rw (unsigned char address, unsigned char rw) |
25 | {
|
26 | /*address can be 0 .. 8; rw=0 --> write, rw=1 --> read*/
|
27 | unsigned char addr_byte = 0; |
28 | /*shift address one bit left*/
|
29 | addr_byte = address << 1; |
30 | /*set RW-Bit, if necessary*/
|
31 | addr_byte |= rw; |
32 | /*0b0100xxx0 --> address of Expander*/
|
33 | addr_byte |= 0b01000000; |
34 | /*TWDR contains byte to send*/
|
35 | TWDR = addr_byte; |
36 | /*send content of TWDR*/
|
37 | TWCR = (1<<TWINT) | (1<<TWEN); |
38 | /*wait, until address has been sent --> ACK*/
|
39 | while (!(TWCR & (1<<TWINT))); |
40 | return TWSR; |
41 | }
|
42 | |
43 | unsigned char pcf8574_send_byte (unsigned char byte) |
44 | {
|
45 | /*TWDR contains byte to send*/
|
46 | TWDR = byte; |
47 | /*send content of TWDR*/
|
48 | TWCR = (1<<TWINT) | (1<<TWEN); |
49 | /*wait, until byte has been sent --> ACK*/
|
50 | while (!(TWCR & (1<<TWINT))); |
51 | return TWSR; |
52 | }
|
53 | |
54 | unsigned char pcf8574_read_byte (void) |
55 | {
|
56 | /*send content of TWDR; TWEA = enable ACK*/
|
57 | TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); |
58 | /*wait, until byte has been received --> ACK*/
|
59 | while (!(TWCR & (1<<TWINT))); |
60 | return TWDR; |
61 | }
|
62 | |
63 | void pcf8574_set_outputs (unsigned char address, unsigned char byte) |
64 | {
|
65 | pcf8574_init (); |
66 | pcf8574_send_start (); |
67 | pcf8574_send_add_rw (address, 0); |
68 | pcf8574_send_byte (byte); |
69 | pcf8574_send_stop (); |
70 | }
|
lcd.h
1 | #ifndef I2CLCD_H_
|
2 | #define I2CLCD_H_
|
3 | |
4 | #ifndef F_CPU
|
5 | #define F_CPU 16000000
|
6 | #endif
|
7 | |
8 | #define wait1us _delay_loop_1((F_CPU * 0.000001) / 3)
|
9 | #define wait1ms _delay_loop_2((F_CPU * 0.001) / 4)
|
10 | |
11 | #define LCD_DEVICE 0x40
|
12 | #define LCD_LINES 2
|
13 | #define LCD_ROWS 16
|
14 | |
15 | #define LCD_LINE1 0x00
|
16 | #define LCD_LINE2 0x40
|
17 | #define LCD_LINE3 0x10
|
18 | #define LCD_LINE4 0x50
|
19 | |
20 | #define LCD_D4_PIN 0
|
21 | #define LCD_D5_PIN 1
|
22 | #define LCD_D6_PIN 2
|
23 | #define LCD_D7_PIN 3
|
24 | #define LCD_RS_PIN 4
|
25 | #define LCD_E_PIN 6
|
26 | #define LCD_BL_PIN 7 // Backlight
|
27 | |
28 | #define LCD_D0 (1<<LCD_D4_PIN)
|
29 | #define LCD_D1 (1<<LCD_D5_PIN)
|
30 | #define LCD_D2 (1<<LCD_D6_PIN)
|
31 | #define LCD_D3 (1<<LCD_D7_PIN)
|
32 | #define LCD_D4 (1<<LCD_D4_PIN)
|
33 | #define LCD_D5 (1<<LCD_D5_PIN)
|
34 | #define LCD_D6 (1<<LCD_D6_PIN)
|
35 | #define LCD_D7 (1<<LCD_D7_PIN)
|
36 | #define LCD_RS (1<<LCD_RS_PIN)
|
37 | #define LCD_E (1<<LCD_E_PIN)
|
38 | #define LCD_BL (1<<LCD_BL_PIN)
|
39 | |
40 | |
41 | #define LCD_CLEAR 0x01
|
42 | #define LCD_HOME 0x02
|
43 | |
44 | #define LCD_ENTRYMODE 0x04
|
45 | #define LCD_INCREASE LCD_ENTRYMODE | 0x02
|
46 | #define LCD_DECREASE LCD_ENTRYMODE | 0x00
|
47 | #define LCD_DISPLAYSHIFTON LCD_ENTRYMODE | 0x01
|
48 | #define LCD_DISPLAYSHIFTOFF LCD_ENTRYMODE | 0x00
|
49 | |
50 | #define LCD_DISPLAYMODE 0x08
|
51 | #define LCD_DISPLAYON LCD_DISPLAYMODE | 0x04
|
52 | #define LCD_DISPLAYOFF LCD_DISPLAYMODE | 0x00
|
53 | |
54 | #define LCD_CONFIGURATION 0x20
|
55 | #define LCD_8BIT LCD_CONFIGURATION | 0x10
|
56 | #define LCD_4BIT LCD_CONFIGURATION | 0x00
|
57 | #define LCD_2LINE LCD_CONFIGURATION | 0x08
|
58 | #define LCD_5X7 LCD_CONFIGURATION | 0x00
|
59 | |
60 | extern void lcdInit(void); |
61 | extern void lcdWriteI2C(uint8_t value); |
62 | extern void lcdWrite(uint8_t value); |
63 | extern void lcdCommand(uint8_t command); |
64 | extern void lcdWaitUS(uint16_t us); |
65 | extern void lcdWaitMS(uint16_t ms); |
66 | |
67 | #endif /* I2CLCD_H_ */ |
lcd.c
1 | #include <avr/io.h> |
2 | #include <inttypes.h> |
3 | #include <util/delay.h> |
4 | #include "i2cLCD.h" |
5 | #include "pcf8574/pcf8574.h" |
6 | |
7 | void lcdInit(void) { |
8 | lcdWaitMS(15); |
9 | lcdWrite(LCD_D5 | LCD_D4); |
10 | lcdWaitMS(5); |
11 | lcdWrite(LCD_D5 | LCD_D4); |
12 | lcdWaitUS(101); |
13 | lcdWrite(LCD_D5 | LCD_D4); |
14 | lcdWrite(LCD_D5); |
15 | |
16 | lcdCommand(LCD_4BIT | LCD_2LINE | LCD_5X7); |
17 | lcdCommand(LCD_DISPLAYOFF); |
18 | lcdCommand(LCD_CLEAR); |
19 | lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); |
20 | lcdCommand(LCD_DISPLAYON); |
21 | // lcdWriteI2C(LCD_BL); // Backlight on
|
22 | }
|
23 | |
24 | void lcdWrite(uint8_t value) { |
25 | lcdWriteI2C(value | LCD_E); |
26 | lcdWriteI2C(value | LCD_E); |
27 | lcdWriteI2C(value & (!LCD_E)); |
28 | }
|
29 | |
30 | void lcdWriteI2C(uint8_t value) { |
31 | pcf8574_set_outputs(0, value); |
32 | }
|
33 | |
34 | void lcdCommand(uint8_t command) { |
35 | uint8_t lcddata; |
36 | lcddata = command; |
37 | lcddata >>= 4; |
38 | lcdWrite(lcddata); |
39 | lcddata = command; |
40 | lcddata &= 0x0F; |
41 | lcdWrite(lcddata); |
42 | }
|
43 | |
44 | void lcdWaitUS(uint16_t us) { |
45 | uint16_t i; |
46 | for(i=0; i<us; i++) |
47 | wait1us; |
48 | }
|
49 | |
50 | void lcdWaitMS(uint16_t ms) { |
51 | uint16_t i; |
52 | for(i=0; i<ms; i++) |
53 | wait1ms; |
54 | }
|
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.