Forum: Compiler & IDEs Attiny2313 mit Pollin LCD-Modul C0802-04


von lifesbest23 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Forumgemeinde,

Ich habe bereits einiges mit Mikrocontrollern gemacht, meist mit einem 
ATmega 8 und habe damit auch schon LCD Module ähnlicher Art über den 4 
Bit Modus betrieben.
Nun habe ich mir eine kleine Schaltung mit ein paar Tastern, einer LED, 
einem Piezo, einem ATtiny 2313 und dem besagten Display mit einem 
HD47780 kompatiblen Kontroller gebastelt.
Das Display ist an den PORTB des tinys angeschlossen. Die Datenleitungen 
an den Bits 0..3 und die Enable Leitung auf Pin 6 und die RS Leitung auf 
Pin 7. Die R/W Leitung habe ich auf Erde gelegt.
Nun habe ich versucht, meine bereits funktionierenden Beispiele vom 
ATmega und einem anderen DIsplay an das Display anzupassen. Das hat 
nichts bewirkt. Dann habe ich angefangen zu googlen und bin auf zwei 
Code Beispiele hier im Forum gestoßen, die ich auch ausprobiert habe, 
die jedoch beide nur komische Ausgaben hervorgebracht haben( genauer, 
Zeichen auf dem Ganzen DIsplay, am meisten Schwarze Felder).
Dann habe ich versucht die Kommunikation selbst zu implementieren in dem 
angehängetn Code Beispiel. Das hat dann wieder nicht zu der gewünschten 
Ausgeabe geführt, sondern nur ein komisches Zeichen auf einer Position 
ausgegeben und den Cursor in der 2. Zeile Blinken lassen.
Nun frage ich mich, was das Problem ist. Ich schließe einen Hardware 
Fehler aus, da das Display ja anscheinend initialisiert wird und auch 
irgendetwas ausgibt. Aber was kann es dann sein?

Falls noch Fragen da sind, die ich noch nicht beantwortet habe, bitte 
Fragen.

Vielen Dank schon mal im vorraus

lifesbest23

von Timmo H. (masterfx)


Lesenswert?

Also bei mir geht es mit folgendem Code wunderbar:
1
struct bits {
2
  u8 b0:1;
3
  u8 b1:1;
4
  u8 b2:1;
5
  u8 b3:1;
6
  u8 b4:1;
7
  u8 b5:1;
8
  u8 b6:1;
9
  u8 b7:1;
10
} __attribute__((__packed__));
11
12
#define SBIT(port,pin) ((*(volatile struct bits*)&port).b##pin)
13
14
15
#define  LCD_D4    SBIT( PORTD, 0 )
16
#define  LCD_DDR_D4  SBIT( DDRD, 0 )
17
18
#define  LCD_D5    SBIT( PORTD, 1 )
19
#define  LCD_DDR_D5  SBIT( DDRD, 1 )
20
21
#define  LCD_D6    SBIT( PORTD, 2 )
22
#define  LCD_DDR_D6  SBIT( DDRD, 2 )
23
24
#define  LCD_D7    SBIT( PORTD, 3 )
25
#define  LCD_DDR_D7  SBIT( DDRD, 3 )
26
27
#define  LCD_RS    SBIT( PORTD, 7 )
28
#define  LCD_DDR_RS  SBIT( DDRD, 7 )
29
30
#define  LCD_E0    SBIT( PORTD, 4 )
31
#define  LCD_DDR_E0  SBIT( DDRD, 4 )
32
33
#define LCD_on()    PORTC |= (1<<PC4)
34
#define LCD_off()    PORTC &= ~(1<<PC4)
35
36
static void lcd_nibble( u8 d )
37
{
38
  LCD_D4 = 0; if( d & 1<<4 ) LCD_D4 = 1;
39
  LCD_D5 = 0; if( d & 1<<5 ) LCD_D5 = 1;
40
  LCD_D6 = 0; if( d & 1<<6 ) LCD_D6 = 1;
41
  LCD_D7 = 0; if( d & 1<<7 ) LCD_D7 = 1;
42
43
  LCD_E0 = 1;
44
  _delay_us( 1 );      // 1us
45
  LCD_E0 = 0;
46
}
47
48
49
static void lcd_byte( u8 d )
50
{
51
  lcd_nibble( d );
52
  lcd_nibble( d<<4 );
53
  _delay_us( 45 );      // 45us
54
}
55
56
57
void lcd_command( u8 d )
58
{
59
  LCD_RS = 0;
60
  lcd_byte( d );
61
  switch( d ){
62
    case 1:
63
    case 2:
64
    case 3: _delay_ms( 2 );    // wait 2ms
65
  }
66
}
67
68
/* Print single char from RAM and/or send data */
69
void lcd_data( u8 d )
70
{
71
  LCD_RS = 1;
72
  lcd_byte( d );
73
}
74
75
void lcd_init( void )
76
{
77
  uint8_t i=0;
78
  LCD_DDR_D4 = 1;
79
  LCD_DDR_D5 = 1;
80
  LCD_DDR_D6 = 1;
81
  LCD_DDR_D7 = 1;
82
  LCD_DDR_RS = 1;
83
  LCD_DDR_E0 = 1;
84
85
  _delay_ms(50);
86
87
  LCD_E0 = 0;
88
  LCD_RS = 0;        // send commands
89
  _delay_ms( 15 );      // wait 15ms
90
91
  lcd_nibble( 0x30 );
92
  _delay_ms( 5 );      // wait >4.1ms
93
94
  lcd_nibble( 0x30 );
95
  _delay_us( 100 );      // wait >100µs
96
97
  lcd_nibble( 0x30 );      // 8 bit mode
98
  _delay_us( 100 );      // wait >100us
99
100
  lcd_nibble( 0x20 );      // 4 bit mode
101
  _delay_us( 100 );      // wait >100us
102
103
  lcd_command( 0x28 );      // 2 lines 5*7
104
  lcd_command( 0x08 );      // display off
105
  lcd_command( 0x01 );      // display clear
106
  lcd_command( 0x06 );          // cursor increment
107
  lcd_command( 0x0C );      // on, no cursor, no blink
108
  
109
  /* lets insert our custon chars
110
   * to adress 0x00 in CG-RAM 
111
   */
112
  lcd_command( 0x40 );
113
  while(i < 8)
114
    lcd_data(pgm_read_byte(&custom_chars[i++]));
115
  
116
117
  lcd_command( 0x01 ); // clear screen
118
  
119
}

: Bearbeitet durch User
von lifesbest23 (Gast)


Lesenswert?

Da ich GCC verwende müsste ich ja u8 durch uint8_t ersetzen, oder?

von lifesbest23 (Gast)


Lesenswert?

Und woher kommt die Funktion pgm_read_byte und das custom_chars Array?
kann ich die ganze while schleife einfach durch ein
1
lcd_data('H');
ersetzen?

von lifesbest23 (Gast)


Lesenswert?

Ok, jetzt zeigt es ein H in der zweiten Position an. Es sollte zwar die 
erste sein, aber zumindest ist es das richtige Zeichen.
Vielen Dank Timmo :)
Ach und das man die while Schleife durch was ersetzen soll, ist unsinn. 
Ich habe sie einfach nur auskommentiert.

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.