Forum: Mikrocontroller und Digitale Elektronik PCF8574 AVR Net IO Ansteuerung


von Stefan T. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Stefan T. (Gast)


Lesenswert?

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.

von Stefan T. (Gast)


Lesenswert?

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?

von Stefan T. (Gast)


Lesenswert?

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
}

von Shortie (Gast)


Lesenswert?


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
Noch kein Account? Hier anmelden.