Forum: Mikrocontroller und Digitale Elektronik Hilfe bei der Programmierung von LCD mit einem ATmega16


von Marius (Gast)



Lesenswert?

Guten Tag zusammen,

Ich bin grade dabei eine Lüftersteuerung mit 12V Lüfter zu 
programmieren.
Ich habe einen Subprint der auf meine platine passt der dann zum 
ATmega16 führt. Dazu hab ich auch Einen Mysmart USB Mk2 zum übertragen 
(MYAVR_PROGTOOL)
Ich programmiere in C und benutzt AVR Studio 6.2.

Auf meine Platine Hab ich ein LCD mit rein gebaut der mit Port B 
verbunden ist.

>(der LCD is ein HD44780 von Hitachi)

Leider dadurch das ich einen PWM Signal benutzt, musste ich leider PB3 
als ausgang für den PWM. Alle Andere Pins von PORTB können noch 
angeschlossen werden. (dazu ist mir klar das der LCD nicht mehr in 8-Bit 
Modus arbeiten kann, sondern jetzt nur noch in 4-bit Modus) Wie komm ich 
in 4-bit modus?

Ich arbeite schon eine weile mit C, und kenn mit ein bisschen aus(LCD 
leider noch nie). Ich hab die LCD Library aber weiss nicht wie ich es in 
meinem programm mit einbinden kann. Ich kann meinen Code den ich 
geschrieben hab hier mit einfügen als Notepad Datei.

Im voraus will ich mich herzlich bedanken für jeden hilfreichen Beitrag.

(Sorry wenn hier Schreibfehler sind, lebe nur seit 3 jahren in 
Deutschland)

Mfg.
Marius

von Johannes (Gast)


Lesenswert?

Nun ja, neben den Datenleitungen, benötigst du auch noch Steuerleitugen. 
Du musst ja nicht für alle Leitungen einen Port benutzen. Du kanns auch 
die Leitungen von verschiedenen Ports nehemen und die Software 
dementsprechend anpassen. Dann kannst du auch im 8-Bit-Modus arbeiten.

In den 4-Bit-Modus kommst du bei der Initialisierung des LCD. Der Ablauf 
der Initialisierung, also was geschickt werden muss und wie lange 
gewartet werden muss, steht im Datenblatt.

Johannes

von Marius (Gast)


Lesenswert?

@johannes:

Danke für die schnelle antwort, mir ist bewusst das ich verschiedene 
port pins benutzen kann, aber meine platine ist schon fertig, und da 
kann ich nichts drann ändern (ausser ich bastell mir nochmal so eine 
platine) das ist eine zeit und geld verschwendung....

also der LCD ist so verbunden das der PB3 mit D3 glaubich wars 
angeschlossen,
im 4-bit modus benutzt man ja D4-D7 glaub ich...

ja also ich hab mir das datenblatt durchgelesen, aber ich versteh immer 
nochnicht wie ich den LCD library den ich hergestellt hab in meinen 
programm einbinden kann (der LCD library ist eine extra C-file den ich 
gemacht hab)

muss ich die initialisierung im hauptprogramm angeben oder im LCD 
library? wenn du die datei brauchst kann ich die schnell hochladen...

Danke nochmal für deinen beitrag :)

mit freundlichen grüßen,
Marius

von Markus S (Gast)


Lesenswert?

Hallo,

ich habe mal Code herausgekramt mit dem ich vor langer Zeit mal mit dem 
HD44780 gearbeitet habe.
Vielleicht hilft es dir etwas weiter. Ein Blick ins Datanblatt ist auch 
sinnvoll.

Ist aber schon länger als 10 Jahre her.
Bei der Displayprogrammierung ist die größte Hürde immer die 
Initialisierungsroutine.
Wenn mal irgendetwas angezeigt wird, dann wird es einfacher.


Gruß Markus
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
4
#include "HD44780.h"
5
#include "timer.h"
6
7
#define LCD_RS PD4
8
#define LCD_RW PD5
9
#define LCD_E  PD6
10
#define LCD_D4 PC4
11
#define LCD_D5 PC5
12
#define LCD_D6 PC6
13
#define LCD_D7 PC7
14
#define LCD_DATA_O_PORT PORTC
15
#define LCD_DATA_I_PORT PINC
16
#define LCD_DATA_R_PORT DDRC
17
18
#define HD44780_CLR      0x01
19
#define HD44780_HOME     0x02
20
#define HD44780_ENTMODE(inc, shift) (0x04|(inc? 0x02: 0)|(shift? 1: 0))
21
#define HD44780_DISPCTL(disp, cursor, blink) \
22
(0x08|(disp? 0x04: 0)|(cursor? 0x02: 0)|(blink? 1: 0))
23
#define HD44780_SHIFT(shift, right) \
24
(0x10|(shift? 0x08: 0)|(right? 0x04: 0))
25
#define HD44780_FNSET(if8bit, twoline, font8x10) \
26
(0x20|(if8bit? 0x10: 0)|(twoline? 0x08: 0)|(font8x10? 0x04: 0))
27
#define HD44780_CGADDR(addr) (0x40|(addr & 0x3f))
28
#define HD44780_DDADDR(addr) (0x80|(addr & 0x7f))
29
#define HD44780_BUSYFLAG 0x80
30
31
#define LCD_E_ON  sbi(PORTD, LCD_E)
32
#define LCD_E_OFF cbi(PORTD, LCD_E)
33
34
#define LCD_RS_ON  sbi(PORTD, LCD_RS)
35
#define LCD_RS_OFF cbi(PORTD, LCD_RS)
36
37
#define LCD_RW_ON  sbi(PORTD, LCD_RW)
38
#define LCD_RW_OFF cbi(PORTD, LCD_RW)
39
40
41
#define LCD_OUTCMD(n) lcd_outbyte(n, 0)
42
#define LCD_OUTDATA(n) lcd_outbyte(n, 1)
43
#define lcd_incmd() lcd_inbyte(0)
44
#define lcd_indata() lcd_inbyte(1)
45
46
47
static inline void lcd_pulse_e(void)
48
{
49
  LCD_E_ON;
50
  asm volatile("nop");/* guarantee 1000 ns high */
51
  asm volatile("nop");
52
  asm volatile("nop");
53
  asm volatile("nop");
54
  LCD_E_OFF;
55
}
56
57
void lcd_outnibble(uint8_t n, uint8_t rs)
58
{
59
//  LCD_RS_OFF;
60
  if (rs)
61
    LCD_RS_ON;
62
  else
63
    LCD_RS_OFF;
64
  
65
  // Zuerst alle Ports zurück setzen
66
  cbi(LCD_DATA_O_PORT, LCD_D4);
67
  cbi(LCD_DATA_O_PORT, LCD_D5);
68
  cbi(LCD_DATA_O_PORT, LCD_D6);
69
  cbi(LCD_DATA_O_PORT, LCD_D7);
70
  
71
  if ( n & 0x01)
72
    sbi(LCD_DATA_O_PORT, LCD_D4);
73
  if ( n & 0x02)
74
    sbi(LCD_DATA_O_PORT, LCD_D5);
75
  if ( n & 0x04)
76
    sbi(LCD_DATA_O_PORT, LCD_D6);
77
  if ( n & 0x08)
78
    sbi(LCD_DATA_O_PORT, LCD_D7);
79
  
80
  lcd_pulse_e();
81
}
82
83
void lcd_outbyte(uint8_t b, uint8_t rs)
84
{
85
  lcd_outnibble(b >> 4, rs);
86
  delay(1);
87
  lcd_outnibble(b & 0xf, rs);
88
  delay(1);
89
}
90
91
92
void InitHD44780(void)
93
{
94
  IoInit();
95
   
96
  delay(30);
97
98
99
  LCD_E_OFF;
100
  LCD_RW_OFF;
101
  LCD_RS_OFF;
102
// Reset  
103
  lcd_outnibble(0x03, 0);
104
  delay(5);
105
  lcd_outnibble(0x03, 0);
106
  delay(1);
107
  LCD_OUTCMD(0x32);
108
// (1)Mode 4 Bit
109
  LCD_OUTCMD(0x28);
110
// (2)Entry Mode
111
  LCD_OUTCMD(0x06);
112
// (3)Display On/Off
113
  LCD_OUTCMD(0x0E);
114
// (4)Display Clear
115
  LCD_OUTCMD(0x01);
116
  delay(3);
117
// End Init
118
119
// (5) DD RAM 1st Digit
120
  LCD_OUTCMD(0x80);
121
  
122
// Daten Senden 
123
  LCD_OUTDATA(0x30);
124
  LCD_OUTDATA(0x31);
125
  LCD_OUTDATA(0x32);
126
  LCD_OUTDATA(0x33);
127
  LCD_OUTDATA(0x34);
128
  LCD_OUTDATA(0x35);
129
  LCD_OUTCMD(0x01);
130
  delay(2);
131
}
132
133
134
void WriteStringToDisplay( char * pcStr, BYTE byPos)
135
{
136
  char *pc;
137
  BYTE byDDPos = byPos;
138
  byDDPos |= 0x80;
139
  pc = pcStr;
140
  LCD_OUTCMD( byDDPos);
141
  while( *pc != '\0')
142
  {
143
    LCD_OUTDATA(*(pc++));
144
  }
145
}
146
147
148
void FillLine(  char pcChar, BYTE byPos)
149
{
150
  BYTE cc;
151
  BYTE byDDPos = byPos;
152
  byDDPos |= 0x80;
153
  LCD_OUTCMD( byDDPos);
154
  for (cc = 0; cc < DISPLAY_LINE_LEN; cc++)
155
  {
156
    LCD_OUTDATA( pcChar);
157
  }
158
159
}

: Bearbeitet durch Moderator
von Kopfschüttel (Gast)


Lesenswert?

Marius schrieb:
> Lueftersteuerung_Subprint_Schaltplan.jpg

Ein Tip:
Wenn du deinen Schaltplan gleich als PNG-Datei erzeugst, wird das nicht 
so ein Pixelgematsche. Die JPEG-Kompression ist für Linienzeichnungen 
mit scharfen Kontrasten nunmal denkbar ungeeignet.

Wozu wird beim Upload eigentlich der Hinweis angezeigt?

von Marius (Gast)


Lesenswert?

Kopfschüttel schrieb:
> Ein Tip:
> Wenn du deinen Schaltplan gleich als PNG-Datei erzeugst, wird das nicht
> so ein Pixelgematsche. Die JPEG-Kompression ist für Linienzeichnungen
> mit scharfen Kontrasten nunmal denkbar ungeeignet.
>
> Wozu wird beim Upload eigentlich der Hinweis angezeigt?

Erm Danke für deinen negativen beitrag? Soll das nicht grad egal sein 
solang man den schaltplan sehen kann?


Ich hab jetzt hier den LCD Library den ich hergestellt hab um den LCD in 
8-bit modus zu betreiben:
1
#define F_CPU 4000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
void enable (void)
7
{
8
    PORTD = 0x80;
9
  _delay_ms(5);
10
    PORTD = 0x00;
11
}
12
13
void LCDFreigabe (void)
14
{
15
  _delay_ms(18);
16
  for (unsigned char i=3; i!=0; i--)
17
  {
18
    PORTB = 0x30;
19
    enable ();
20
    _delay_ms(18);
21
  }
22
  
23
  PORTB = 0x38;  //Funktion Set
24
  enable();
25
  _delay_ms(2);
26
  
27
  PORTB = 0x0C;  //Display ON/OFF
28
  enable();
29
  _delay_ms(2);
30
  
31
  PORTB = 0x01;  //Display löschen
32
  enable();
33
  _delay_ms(2);
34
  
35
  PORTB = 0x06;  //Entry Mode Set
36
  enable();
37
  _delay_ms(2);
38
}
39
void zeile2(unsigned char zelle)
40
{
41
  _delay_ms(2);
42
  PORTD = 0x80;
43
  PORTB = 0x80+zelle;
44
  PORTD = 0x00;
45
  _delay_ms(2);
46
}
47
48
void ausgabe (unsigned char buchstabe)
49
{
50
  PORTD = 0xA0;
51
  PORTB = buchstabe;
52
  PORTD = 0x00;
53
  _delay_ms(2);
54
}
55
56
void Ag (void) { ausgabe(0x41);}
57
void Bg (void) {ausgabe(0x42);}
58
void Cg (void) {ausgabe(0x43);}
59
void Dg (void) {ausgabe(0x44);}
60
void Eg (void) {ausgabe(0x45);}
61
void Fg (void) {ausgabe(0x46);}
62
void Gg (void) {ausgabe(0x47);}
63
void Hg (void) {ausgabe(0x48);}
64
void Ig (void) {ausgabe(0x49);}
65
void Jg (void) {ausgabe(0x4A);}
66
void Kg (void) {ausgabe(0x4B);}
67
void Lg (void) {ausgabe(0x4C);}
68
void Mg (void) {ausgabe(0x4D);}
69
void Ng (void) {ausgabe(0x4E);}
70
void Og (void) {ausgabe(0x4F);}
71
void Pg (void) {ausgabe(0x50);}
72
void Qg (void) {ausgabe(0x51);}
73
void Rg (void) {ausgabe(0x52);}
74
void Sg (void) {ausgabe(0x53);}
75
void Tg (void) {ausgabe(0x54);}
76
void Ug (void) {ausgabe(0x55);}
77
void Vg (void) {ausgabe(0x56);}
78
void Wg (void) {ausgabe(0x57);}
79
void Xg (void) {ausgabe(0x58);}
80
void Yg (void) {ausgabe(0x59);}
81
void Zg (void) {ausgabe(0x5A);}
82
void as (void) {ausgabe(0x61);}
83
void bs (void) {ausgabe(0x62);}
84
void cs (void) {ausgabe(0x63);}
85
void ds (void) {ausgabe(0x64);}
86
void es (void) {ausgabe(0x65);}
87
void fs (void) {ausgabe(0x66);}
88
void gs (void) {ausgabe(0x67);}
89
void hs (void) {ausgabe(0x68);}
90
void is (void) {ausgabe(0x69);}
91
void js (void) {ausgabe(0x6A);}
92
void ks (void) {ausgabe(0x6B);}
93
void ls (void) {ausgabe(0x6C);}
94
void ms (void) {ausgabe(0x6D);}
95
void ns (void) {ausgabe(0x6E);}
96
void os (void) {ausgabe(0x6F);}
97
void ps (void) {ausgabe(0x70);}
98
void qs (void) {ausgabe(0x71);}
99
void rs (void) {ausgabe(0x72);}
100
void ss (void) {ausgabe(0x73);}
101
void ts (void) {ausgabe(0x74);}
102
void us (void) {ausgabe(0x75);}
103
void vs (void) {ausgabe(0x76);}
104
void ws (void) {ausgabe(0x77);}
105
void xs (void) {ausgabe(0x78);}
106
void ys (void) {ausgabe(0x79);}
107
void zs (void) {ausgabe(0x7A);}
108
void ae (void) {ausgabe(0xE1);}
109
void nulln (void) {ausgabe(0x30);}
110
void eins (void) {ausgabe(0x31);}
111
void zwei (void) {ausgabe(0x32);}
112
void drei (void) {ausgabe(0x33);}
113
void vier (void) {ausgabe(0x34);}
114
void fuenf (void) {ausgabe(0x35);}
115
void sechs (void) {ausgabe(0x36);}
116
void sieben (void) {ausgabe(0x37);}
117
void acht (void) {ausgabe(0x38);}
118
void neun (void) {ausgabe(0x39);}    
119
void leer (void) {ausgabe(0x20);}
120
void prozent (void) {ausgabe(0x25);}
121
void strich (void) {ausgabe(0x2D);}
122
void doppelpunkt (void) {ausgabe(0x3A);}
123
void punkt (void) {ausgabe(0x2E);}

Ich hab auch diese seite offen um zu vergleichen und vllt mit copy/paste 
es zusammenzustellen. Kann mir jemand sagen was ich noch ändern muss?

Danke
mfg.
Marius

: Bearbeitet durch Moderator
von Hubert G. (hubertg)


Lesenswert?

Verwende die LCD-Lib von Peter Fleury, dann erledigen sich deine 
Probleme von selbst.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marius schrieb:
> Kopfschüttel schrieb:
>> Ein Tip:
>> Wenn du deinen Schaltplan gleich als PNG-Datei erzeugst, wird das nicht
>> so ein Pixelgematsche. Die JPEG-Kompression ist für Linienzeichnungen
>> mit scharfen Kontrasten nunmal denkbar ungeeignet.
> Erm Danke für deinen negativen beitrag?
> Soll das nicht grad egal sein solang man den schaltplan sehen kann?
Nein. Es ist einfach das falsche Format.

> Ich hab jetzt hier den LCD Library den ich hergestellt hab um den LCD in
> 8-bit modus zu betreiben
Das hier steht über jeder Eingabebox:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
    ...
4
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
5
    ...
6
    Formatierung 
7
    [c]C-Code[/c]
8
    ...
9
    Bitte das JPG-Format nur für Fotos und Scans verwenden!
10
    Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Ist es denn soooo schwer?
Kopfschüttel schrieb:
> Wozu wird beim Upload eigentlich der Hinweis angezeigt?
Wozu wird direkt beim Eingabefeld diese Information dargerstellt?

>  lueftersteuerung_backup_C.txt
Gib das nächste Mal der C-Datei auch die Dateiendung *.c
Das macht den Code viel lesbarer. Probiers aus...

von Thomas (kosmos)


Angehängte Dateien:

Lesenswert?

ich würde dir ein 573er Latch empfehlen. Funktioniert wie folgt du legst 
an einen Port deine 8 Bits an, klingelst mit einer Steuerleitung wodurch 
der Latch die Daten an seinen Eingängen übernimmt und an seine 8 
Ausgangspins gibt, danach schaltet man mit einer weiteren Leitung die 
Latcheingänge hochohmig wodurch sie deine Schaltung dann nicht mehr 
beeinflussen.

Nun kannst du deinen kompletten Port wieder für andere Sachen verwenden. 
Und dein LCD erhält die 8 Bits vom Latch, du musst dich dann nur doch um 
die Steuerleitungen kümmern. Ich habe das sonst immer mit einem kleinen 
ATTiny26 so gemacht um trotz 8 Bit Modus nicht alles Pins für das LCD zu 
opfern.

von Rudolph R. (rudolph)


Lesenswert?

Marius schrieb:
> Soll das nicht grad egal sein
> solang man den schaltplan sehen kann?

Vor allem der richtige Schaltplan zu der Frage wäre mal interessant.

von Kopfschüttel (Gast)


Lesenswert?

Marius schrieb:
> Soll das nicht grad egal sein solang man den schaltplan sehen kann?

Gehst zum Autohändler und willst ein AMG. Der stellt dir ein 
Pferdefuhrwerk hin und sagt: "Wieso - fährt doch auch".

Kein weiterer Kommentar

von Schaltplanleser (Gast)


Lesenswert?

Ich will ja nicht kleinlich sein, aber zum richtigen Funktionieren
(-->Funktionssicherheit!) gehört ein Abblock-C an jedem VCC Pin
des Controllers. Da fehlt einer im gezeigten Schaltplan ....

von Rudolph R. (rudolph)


Lesenswert?

Schaltplanleser schrieb:
> Ich will ja nicht kleinlich sein,

Naja, erstmal müsste der richtige Schaltplan da sein.
Aber an dem bisherigen ist noch mehr falsch, ARef gehört auch nicht an 
VCC.

: Bearbeitet durch User
von Marius (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen erstmal,

Danke für die Schönen kommentare, Wie ich glaub ich schon gesagt hab, 
lebe ich seit 3 jahren in Deutschland (aus US hergezogen) mir ist 
bewusst das nicht jeder Deutsche net ist. Aber das man so frech über 
einen forum wo man eigentlich nur hilfe haben möchte echt low. Soll ich 
einfach auf english weiter schreiben? vielleicht versteht ihr das ganze 
besser.

1.
Der Schaltplan der angegeben ist oben als PNG file (sorry for all the 
butthurt who cant handle the file type) IST der Subprint der über eine 
Stiftleiste beim ATmega16 angeschlossen!

2.
Dieser SUBPRINT wird auf die Hauptplatine die ICH selber gemacht hat 
angeschlossen!

3. Die Frage war:
Ich möchte als zusatz aufgabe dazu das ich einen subprint der einen PWM 
signal ausgibt, auch den LCD display Programmieren. Das problem ist. Das 
ich jetzt an PORT B (wo der LCD Angeschlossen ist) den PB3 (wo ein PWM 
signal als ausgang benutzt wird) den LCD in 8-bit Modus nicht möglich!
Ich kann den PB3 nicht frei machen weil der ja hardwäre technisch mit 
den Subprint verbunden ist!

Ich habe Die LCD library der für einen LCD der in 8-bit Modus betrieben 
wird! Ich wollte dieses programm jetzt umschreiben aber ich bekomm das 
nicht hin.

4.
Können jetzt bitte alle die sich über den File format erstmal keine 
kommentare mehr abgeben weil Ich nur eine Lösung haben will!


sorry Rage post ist jetzt vorbei.

Ich wäre jetzt sehr dankebar wenn mir jetzt jemand hilfreich sein 
kann...


mit freundlichen grüßen,
Marius

von Marius (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist zusätzlich noch der Platinen layout von der HAUPTPLATINE.

wenn das auch noch einbischen aufklären kann genau was ich meine.

gruß,
Marius

von Uwe (de0508)


Lesenswert?


: Bearbeitet durch User
von Marius (Gast)


Lesenswert?

Hallo Uwe,
vielen Danke für die links und download. Ich versuch jetzt mal damit was 
zu laufen zu bringen. Ich melde nochmal falls noch fragen da sind.

Vielen Danke Nochmal!!

mit Freundlichen Grüßen,
Marius

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.