PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Noch eine Frage zu LCD!



Decca
16.03.2005, 11:48
Hallo @all!

Hatte schon vor zwei Tagen meine Frage zur LCD Ansteuerung gestellt und mir wurde die Seite von Peter Fleury empfohlen. Dort habe ich mir die lcd.h und lcd.c runtergeladen. Nun habe ich in der Bibliothek die
#define LCD_LINES 2
#define LCD_DISP_LENGTH 20 beiden Sachen und den Port
#define LCD_PORT PORTC verändert.
Mein Display betreibe ich im 4-Bit Modus an Port C.
RS =PortC4
R/W=PortC5
E=PortC6
Datenltg.: DB4-DB7=PortC0-PortC3
Datenltg.: DB0-DB3=Masse

Nun habe ich noch in der lcd.c ganz am ende

int main (void){

void lcd_init ( uint8_t dispAttr ) ;
lcd_clrscr();
void lcd_clrscr ( void ) ;
void lcd_puts ( const char * s ) ;

}

das geschrieben. Ich dachte mir das er das Display initialisieren müsste und es gelöscht wird (die eine sichtbare schwarze Zeile) und dann ein s
ausgegeben wird.
Ja leider funktioniert das aber nicht!
Habe ich vergessen was in der lcd.h o. lcd.c zu ergänzen?

MFG Decca

KingNothing
18.03.2005, 17:25
int main (void){

void lcd_init ( uint8_t dispAttr ) ;
lcd_clrscr();
void lcd_clrscr ( void ) ;
void lcd_puts ( const char * s ) ;

}

Du hast das nicht wirklich genau so in der Datei stehen?
Wenn ja solltest du z.B. die Funktion lcd_puts auch richtig aufrufen, und der Variable einen Wert zuweisen o.ä.
Bsp:


lcd_puts("s");

Ausserdem würd ich dir empfehlen eine extra Datei für die Funktion main() anzulegen, also z.B. "main.c",


Ja leider funktioniert das aber nicht!

Welche Fehlermeldung zeigt denn der Compiler?

Decca
20.03.2005, 18:45
Hallo KingNothing!

Hab die Fehler schon korrigiert.
Jetzt:

int main(void)
{


DDRD &=~ (1 << PD2); /* Pin PD2 input */
PORTD |= (1 << PD2); /* Pin PD2 pull-up enabled */


/* initialize display, cursor off */
lcd_init(LCD_DISP_ON);

for (;;)
{

/* clear display and home cursor */
lcd_clrscr();

/* put string to display (line 1) with linefeed */
lcd_puts("LCD Test Line 1\n");

/* cursor is now on second line, write second line */
lcd_puts("Line 2");
/* move cursor to position 8 on line 2 */
lcd_gotoxy(7,1);

/* write single char to display */
lcd_putc(':');
}
}

Ich habe die lcd.c von Peter fleury als include mit eingefügt. Er zeigt mir keine Fehlermeldungen an. Jetzt das merkwürdige, wenn ich program device mache und das Programm auf den mega8 gebe, verschwindet der schwarze Balken und es sind zwei Zeilen ganz ganz schwach zu erkennen,ich denke das wird der Befehl lcd_clrscr(); sein.
Wenn ich aber die Spannung neu am mega8 anlege bleibt der schwarze Balken.
Es erscheint auch kein Zeichen auf dem Display!

MFG Decca

KingNothing
21.03.2005, 15:19
Hmm, ich hab leider kein HD44780 Kompatibles Display hier, sonst würd ichs mal testen,
mir dem schwarzen Balken das hört sich merkwürdig an, vielleicht liegts ja am Kontrast, oder du hast das Display vielleicht falsch angeschlossen?

Decca
21.03.2005, 17:37
Ich habe schon mind. zehn mal überprüft ob das Display richtig angeschlossen ist. Bei mc-projekt.de steht das wenn die Spannung richtig anliegt mind. ein schwarzer Balken zu sehen sein sollte.
Der geht ja auch weg mit clrscr(); ! Aber ich kann sonst nichts übergeben ans Display, zumindest zeigt es mir nichts an.

Kjion
21.03.2005, 21:53
Moin,

nimm mal das lcd_clrscr(); aus der Schleife. Ansonsten wird das Display viel zu oft pro Sekunde gelöscht und man kann gar nix mehr erkennen...

MfG Kjion

Decca
22.03.2005, 18:46
Moin!

Also das Programm sieht jetzt so aus:

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <lcd.h>
#include <lcd2.c>





int main(void)
{



/* initialize display, cursor off */
lcd_init(LCD_DISP_ON_CURSOR_BLINK);

for (;;)
{




/* put string to display (line 1) with linefeed */
lcd_puts("LCD Test Line 1\n");

}
}

Es bleibt aber alles beim alten. Wenn ich das Programm überspiele verschwindet der schwarze Balken und es sind zwei ganz schwache Balken zu sehen. Die Kontrasteinstellung funktioniert, weil wenn der schwarze Balken zu sehen ist kann ich den Kontrast einstellen.

michaelb
06.06.2005, 20:55
Hi Decca,
hat sich das Problem gelöst?
Gruß Michi

pebisoft
07.06.2005, 07:26
sag mal, was hast du für eine. for-schleife.
das display geht ja gleich wieder aus. setzt diese init mal rein "lcd_init(LCD_DISP_ON)" und mache eine wihle-schleife mit eine delay-pause am ende.
mfg pebisoft

michaelb
07.06.2005, 11:56
Hi Pebisoft,
ich glaube des bringt wenig den Thread zum Leben zu erwecken da Decca bestimmt nicht so bald das hier liest! Seine letzter Beesuch war im März!
Gruß Michi
P.S. Nochmal Danke für die Quelltexte hab jetzt erfolgreich ein LCD zum laufen gebracht! Klappt prima!

Decca
30.07.2005, 12:38
Hallo.

Das neue Semester hatte angefangen. Deswegen kam ich nicht dazu mich meinem LCD zu widmen. Naja jetzt hab ich´s wieder vor mir zu liegen und die Probleme sind immer noch die alten. Es wird nur ein schwarzer Balken angezeigt.
Es wird anscheinend nicht ein mal initialisiert. Ich dachte es liegt am Batron Controller Typ SPLC780, aber die initialisierung ist gleich dem HD44780.
Nach zahlreichen Versuchen mit der Lib von Peter Pfleury weis ich nicht woran es liegen könnte.
Nochmal ein paar Eckdaten:
Display: BT 22005
Anschlüße am ATMEGA8:
PortC 6=E
PortC 5=R/W
PortC 4=RS
PortC (0-3)=DB(4-7) 4-Bit-Modus

Wenn jemand von euch mir ein Testprogramm mit Lib und allen was zum laufen dazugehürt per Mail (decca@gmx.net) oder posten könnte wäre das echt super. Dann könnte ich meine Programme vergleichen und Fehler finden. Hoffe ich zumindest.

Danke
Gruß Decca

SprinterSB
30.07.2005, 13:08
Hast du mal das Fuse-Bit RSTDSBL gecheckt?
Nur so ne Idee, PprtC.6 ist ja auch Reset...

HD44780 kann man in 2 verschiedenen Modi betreiben (abgesehen von 4/8 Bit), vielleicht ist da ja ein Fehler in der Initialisierung oder der Controller unterstützt den Modus nicht.

Zu Fleurys LCD-Routinen kann ich nix sagen (ich hab meine eigenen), aber nach dem Schreiben würd ich warten. LCDs sind ja recht langsam, also eher so:

int main(void)
{
/* initialize display, cursor off */
lcd_init(LCD_DISP_ON_CURSOR_BLINK);

/* put string to display (line 1) with linefeed */
lcd_puts("LCD Test Line 1\n");

for (;;);
}

Decca
30.07.2005, 13:21
DANKE,DANKE,DANKE,DANKE,DANKE,DANKE,DANKE,DANKE,DA NKE,DANKE,DANKE,DANKE,DANKE,DANKE,DANKE,DANKE,DANK E,DANKE,DANKE,DANKE,DANKE!!!

Es hat die ganze Zeit am Fuse Bit gelegen, da wäre ich nie drauf gekommen.
Was habe ich denn damit jetzt aktiviert?
Wird das jetzt als normaler Ausgang genutzt?

Vielen Dank!

Decca
30.07.2005, 13:30
Also mein Display funktioniert, aber jetzt klappt die Programmierung über den parallel Port nicht mehr.
Ausserdem kann ich die Fuse Bit´s mit yaap auch nicht mehr einlesen.
Kann man das trotzdem noch rückgängig machen?

SprinterSB
30.07.2005, 13:40
OOooops...
Dieses Bit ist etwas heikel, es kann nur mit parallel-programmier-Modus rückgesetzt werden, also nicht über das SPI, über den die ISP meist läuft (egal ob über COM- oder parallel Port), weil ISP den RESET-Pin benötigt um den Controller zu resetten.
Das steht im Handbuch etwas versteckt.

Ich bin davon ausgegangen, daß du parallel programmierst, weil du ja den PortC.6 benutzt. :-b

Immerhin bist du einen Schritt weiter, auch wenns jetzt net mehr zurück geht.