Forum: Compiler & IDEs LCD Erstversuch


von Pierre G. (bqube)


Lesenswert?

Guten Nabend Liebe Gemeinde ich versuch nun in C ein LCD 2x16 
anzusteuern was aber irgendwie nicht hinn haut ...... unter ASM hatte 
das damals Funktioniert nun hab ich fast den selben Code in C 
geschrieben aber das Zeichen T wird nicht auf dem LCD ausgegeben.

LCD ist wie folgt angeschlossen

PORTD 7-0 an DB 7 - 0
PORTB 0 E und 1 an RS
RW auf Masse


1
#include <avr/io.h>
2
#ifndef F_CPU
3
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400 definiert"
4
#define F_CPU 1000000
5
#endif
6
#include <util/delay.h>
7
8
void enns(void) // Einstellungen Senden
9
{
10
  PORTB = 0b00000001;
11
  _delay_us(5);
12
  PORTB = 0b00000000;
13
}
14
15
void ennt(void) // Text Senden
16
{
17
  PORTB = 0b00000011;
18
  _delay_us(5);
19
  PORTB = 0b00000000;
20
}
21
22
int main(void)
23
{
24
    DDRB = 0xff;
25
  DDRD = 0xff;
26
    {
27
         _delay_ms(15);
28
     PORTD = 0b00110000; //1
29
     enns();
30
     PORTD = 0b00000000;
31
     
32
     _delay_ms(5);
33
     PORTD = 0b00110000; //2
34
     enns();
35
     PORTD = 0b00000000;
36
     
37
     _delay_us(120);
38
     PORTD = 0b00110000; //3
39
     enns();
40
     PORTD = 0b00000000;
41
     
42
     _delay_us(120);
43
     PORTD = 0b00110000; //4
44
     enns();
45
     PORTD = 0b00000000;
46
     
47
     _delay_us(120);
48
     PORTD = 0b00111000; //5
49
     enns();
50
     PORTD = 0b00000000;
51
     
52
     _delay_us(120);
53
     PORTD = 0b00001000; //6
54
     enns();
55
     PORTD = 0b00000000;
56
     
57
     _delay_us(120);
58
     PORTD = 0b00000001; //7
59
     enns();
60
     PORTD = 0b00000000;
61
     
62
     _delay_us(120);
63
     PORTD = 0b00000110; //8
64
     enns();
65
     PORTD = 0b00000000;
66
     
67
     _delay_us(120);
68
     PORTD = 0b00001100; //9
69
     enns();
70
     PORTD = 0b00000000;
71
     
72
     _delay_us(120);
73
     PORTD = 'T';
74
     ennt();
75
     PORTD = 0x00;
76
     
77
     
78
  }
79
  
80
  while(1);
81
}

von troll (Gast)


Lesenswert?

>#define F_CPU 1000000
100kHz? Und wenn schon Warnung dann bitte mit richtigem Text... Ich 
würde es komplett rauswerfen und im Makefile/in den Projektoptionen 
angeben.

von troll (Gast)


Lesenswert?

Argh, zählen müsste man können. :-/

von Pierre G. (bqube)


Lesenswert?

Dann hab ich das wohl mit der CPU Angabe ein wenig missverstanden denn 
im GCC Tut steht es ja so drin 3686400UL das sind ja dann 3.6864 Mhz  da 
dachte ich wenn ich mit 1Mhz arbeiten will schreib ich einfach 1000000 ?

von troll (Gast)


Lesenswert?

Pierre Gnauck schrieb:
> dachte ich wenn ich mit 1Mhz arbeiten will schreib ich einfach 1000000 ?
Jain. Diese Angabe ist für den Compiler damit die Wartezeiten stimmen. 
Den AVR interessiert das nicht, da zählen die Fuses bzw. der 
angeschlossene Quarz. Und wenn du in der Warnung 3,irgendwas schreibst 
und F_CPU dann aber mit 1MHz definierst ist das irgendwie naja...

von Pierre G. (bqube)


Lesenswert?

Gut wurde geändert .. ist sonnst was an dem Code Falsch das die Funktion 
verhindert ?

von Pierre G. (bqube)


Lesenswert?

So sieht nun der Code aus
1
#include <avr/io.h>
2
#ifndef F_CPU
3
#warning "F_CPU war noch nicht definiert, wird nun mit 1000000 definiert"
4
#define F_CPU 1000000UL
5
#endif
6
#include <util/delay.h>
7
#define DatenPort PORTD
8
#define SteuerPort PORTB
9
10
void Setup(void)
11
{
12
  SteuerPort |= (1 << 0);
13
  _delay_us(5);
14
  SteuerPort &= ~(1 << 0);
15
}
16
17
void Text(void)
18
{
19
  SteuerPort |= (1 << 1);
20
  SteuerPort |= (1 << 0);
21
  _delay_us(5);
22
  SteuerPort &= ~((1 << 0) | (1 << 1));
23
}
24
25
int main(void)
26
{
27
    DDRB = 0xff;
28
  DDRD = 0xff;
29
    {
30
         _delay_ms(15);
31
     DatenPort = 0b00110000; //Interface auf 8-Bit setzen
32
     Setup();
33
     DatenPort = 0b00000000;
34
     
35
     _delay_ms(5);
36
     DatenPort = 0b00110000; //Interface auf 8-Bit setzen
37
     Setup();
38
     DatenPort = 0b00000000;
39
     
40
     _delay_us(120);
41
     DatenPort = 0b00110000; //Interface auf 8-Bit setzen
42
     Setup();
43
     DatenPort = 0b00000000;
44
     
45
     _delay_us(120);
46
     DatenPort = 0b00110000; //Interface auf 8-Bit setzen
47
     Setup();
48
     DatenPort = 0b00000000;
49
     
50
     _delay_us(120);
51
     DatenPort = 0b00111000; //2-zeilig, 5x8-Punkt-Matrix 
52
     Setup();
53
     DatenPort = 0b00000000;
54
     
55
     _delay_us(120);
56
     DatenPort = 0b00001000; //Display aus
57
     Setup();
58
     DatenPort = 0b00000000;
59
     
60
     _delay_us(120);
61
     DatenPort = 0b00000001; //Display löschen
62
     Setup();
63
     DatenPort = 0b00000000;
64
     
65
     _delay_us(120);
66
     DatenPort = 0b00000110; //Kursor nach rechts wandernd, kein Display shift 
67
     Setup();
68
     DatenPort = 0b00000000;
69
     
70
     _delay_us(120);
71
     DatenPort = 0b00001100; //Display ein
72
     Setup();
73
     DatenPort = 0b00000000;
74
     
75
     _delay_us(120);
76
     DatenPort = 'T';    // T Senden
77
     Text();
78
     DatenPort = 0x00;
79
     
80
     
81
  }
82
  
83
  while(1);
84
}

von Peter D. (peda)


Lesenswert?

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296

Es ist keine gute Idee, den ganzen PortB zu schreiben, bestimmt brauchst 
Du die restlichen Pins noch für andere Aufgaben.
Der AVR kann bitweise IO-Pins schreiben.

von Pierre G. (bqube)


Lesenswert?

Ja so hatte ich das in ASM auch gemacht nur ich bekomm ja so noch nicht 
mal das Display zum Laufen ... und ich versteh nicht wo der Fehler drin 
ist  ...

Mfg Bqube

von Pierre G. (bqube)


Lesenswert?

So ich hab das ganze nun mal auf einem Realen Display getestet und siehe 
da es Funktioniert aber wieso haut das ganze nicht Simuliert hin ?

Mfg Bqube

Simulator einmal AVR Simulator IDE und der andere ISIS Schematic

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.