LCD Steuerung in AVR C

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallo Freunde,


ich möchte gerne ein LCD Display (16 * 2 / 4 Bit ) ansteuern... In Bascom, ist dies kein Problem!
Leider funktioniert das bei mir in C nicht so wirklich...

hat jemand hier schon Erfahrungen sammeln können, was die Display programmierung in C angeht ?
 
Hallo Janiiix,
Leider funktioniert das bei mir in C nicht so wirklich...

stell doch einfach dein Programm in das Forum und beschreibe uns, wo das Problem liegt. Dann können wir bestimmt besser helfen.

Dirk :ciao:
 
Hallo,

bitte hier in das Forum hochladen, da die aktuelle Quelle vielleicht irgendwann mal nicht mehr vorhanden ist und das Thema dann ggf. für andere User nicht mehr verständlich oder nützlich ist.

Ich habe das Projekt nun mal hochgeladen ...

Anhang anzeigen GccApplication1.zip


Du verwendest noch keine Displayausgabe, du initialisierst das Display lediglich.

Gibt es denn Compiler-Fehlermeldungen?

Hast du in lcd.h folgendes konfigueriert ...

  • LCD Controller KS0073 / HD44780
  • Anzahl der Zeilen, Anzahl der Spalten
  • Verwendete portpins für Control-Bits und Daten-Bits?



EDIT:

Dino war mal wieder schneller ;-)
(.rar werde ich noch als Dateiformat aktivieren)
 
Hallo,

bitte hier in das Forum hochladen, da die aktuelle Quelle vielleicht irgendwann mal nicht mehr vorhanden ist und das Thema dann ggf. für andere User nicht mehr verständlich oder nützlich ist.

Ich habe das Projekt nun mal hochgeladen ...

Anhang anzeigen 6107


Du verwendest noch keine Displayausgabe, du initialisierst das Display lediglich.

Gibt es denn Compiler-Fehlermeldungen?

Hast du in lcd.h folgendes konfigueriert ...

  • LCD Controller KS0073 / HD44780
  • Anzahl der Zeilen, Anzahl der Spalten
  • Verwendete portpins für Control-Bits und Daten-Bits?



EDIT:

Dino war mal wieder schneller ;-)
(.rar werde ich noch als Dateiformat aktivieren)


Ja. ich würde mich aber freuen, wenn sich das noch mal jemand anschaut ! es muss ja an irgendwas liegen... ich habe die Header Datei von Peter F. benutzt!
 
Ja. ich würde mich aber freuen, wenn sich das noch mal jemand anschaut ! es muss ja an irgendwas liegen... ich habe die Header Datei von Peter F. benutzt!

Würde ich ja gerne machen, damit andere und ich es ein bisschen leichter haben, hatte ich zuvor gefragt ...

Gibt es denn Compiler-Fehlermeldungen?

Hast du in lcd.h folgendes konfiguriert ...


  • LCD Controller KS0073 / HD44780
  • Anzahl der Zeilen, Anzahl der Spalten
  • Verwendete portpins für Control-Bits und Daten-Bits?

Ich weiss nun nicht, auf was sich das "ja" bezieht.

Es gibt also Compilerfehlermeldungen und du hast alles initialisiert, was ich oben geschrieben habe?
 
könnt ihr das nicht mehr Kompilieren? geht das nicht ? also ich habe es hier gemacht und es kamen keine Fehler...

ich habe es mit Bascom probbiert (siehe Bild) das zeigt mir das die Pins alle richtig deklariert sind und das es funktionieren müsste...
ich habe ein MSH 1602... dort ist ein KS0066 verbaut oder ähnlich HD....

leider lässt sich das Display nicht mal Initalisieren...
 
könnt ihr das nicht mehr Kompilieren? geht das nicht ? also ich habe es hier gemacht und es kamen keine Fehler...

Das kann man sicherlich, ich wollte erst mal so drüber schauen, deshalb die Frage nach Compiler-Fehlermeldungen. OK, das hast du nun beantwortet, es gibt keine.

ich habe es mit Bascom probbiert (siehe Bild) das zeigt mir das die Pins alle richtig deklariert sind und das es funktionieren müsste...
ich habe ein MSH 1602... dort ist ein KS0066 verbaut oder ähnlich HD....
leider lässt sich das Display nicht mal Initalisieren..

Bascom hat sicherlich nicht den C Code compiliert. Es sind einige Sachen in lcd.h einzustellen, ich weiß nicht, ob du das gemacht hast, bzw. ob alles richtig eingestellt ist.

Unabhängig von lcd.c und lcd.h:
  • Im Atmel Studio den richtigen Controller einstellen
  • da anscheinend delay.h verwendet wird, ist F_CPU definiert?
  • die Fusebits sind richtig?


Leider habe ich gerade super wenig Zeit und kann da im Moment leider nicht näher nachschauen. :-( (deshalb auch den kurz gehaltenen Text von mir). Interessant wäre vielleicht noch, wie du das Display an den Controller angeschlossen hast. Eventuell den Teil aus dem Bascom Programm hierzu in das Forum stellen.
 
Das kann man sicherlich, ich wollte erst mal so drüber schauen, deshalb die Frage nach Compiler-Fehlermeldungen. OK, das hast du nun beantwortet, es gibt keine.



Bascom hat sicherlich nicht den C Code compiliert. Es sind einige Sachen in lcd.h einzustellen, ich weiß nicht, ob du das gemacht hast, bzw. ob alles richtig eingestellt ist.

Unabhängig von lcd.c und lcd.h:
  • Im Atmel Studio den richtigen Controller einstellen
  • da anscheinend delay.h verwendet wird, ist F_CPU definiert?
  • die Fusebits sind richtig?


Leider habe ich gerade super wenig Zeit und kann da im Moment leider nicht näher nachschauen. :-( (deshalb auch den kurz gehaltenen Text von mir). Interessant wäre vielleicht noch, wie du das Display an den Controller angeschlossen hast. Eventuell den Teil aus dem Bascom Programm hierzu in das Forum stellen.


1 / Der Controller wurde richtig ausgewählt... ATMEGA32
2 / habe ich #define F_CPU = 16000000 ( mit und ohne probiert)
3 / Fusebits ? was muss man da noch umstellen? also ich bin mir 100 % sicher das die Frequenz stimmt...

in meinem .rar Archiv war auch ein Bild von Bascom dabei...
 
3 / Fusebits ? was muss man da noch umstellen? also ich bin mir 100 % sicher das die Frequenz stimmt...

Von Werk aus ist nicht der Quarzoszillator als Systemtaktquelle ausgewählt (an dem ein 16MHz Quarz angeschlossen ist), sondern der interne RC Oszillator. Aber das ist erst mal egal. Du hast es wahrscheinlich schon richtig zuvor bei Bascom eingestellt.

Hast du irgendwelche Einstellungen in lcd.h vorgenommen?
 
Ja, ich habe div. Einstellungen vorgenommen!
Ich muss ja meine ganzen Ports zuweisen!

da ich R/W auf Ground habe und nicht an einem Port Pin musste ich noch was dazu schreiben... das haben aber auch schon andere gemacht und das ging wohl...
 
Ja, ich habe div. Einstellungen vorgenommen!
Ich muss ja meine ganzen Ports zuweisen!

da ich R/W auf Ground habe und nicht an einem Port Pin musste ich noch was dazu schreiben... das haben aber auch schon andere gemacht und das ging wohl...

Ich habe das Bild von Bascom nun gesehen, ja deine Einstellungen zu den Portpin-Zuweisungen scheinen zu stimmen. In lcd.c wir ein eigenes delay() verwendet, hier gibt es eine Definition #define XTAL 16000000.

Weiter habe ich jetzt aber nicht danach schauen können.

Wie schon erwähnt, fehlt mir jetzt die Zeit :(. Vielleicht kann aber jemand anderer da mal nach schauen.
 
leider scheint hier keiner gerade Online zu sein...
wann passt es dir denn ?
hast du Facebook?
 
Nun ja, wir machen das alles in der Freizeit!

Viele haben davon leider sehr wenig.



Ich kann mir das am Wochenende noch einmal näher anschauen, testen kann ich leider nicht, da ich die Hardware nicht (fertig aufgebaut) habe. Deshalb kann ich nur Tipps und Hinweise geben :)
 
klar, verstehe ich ! ich würde mich da rüber freuen, wenn du das hin bekommen könntest... ich komme leider nicht weiter... würde aber gerne mal was auf meinen LCD Display via. C sehen !

vielen dank schonmal :)
 
Hallo,

ich habe nun noch mal dein Programm angesehen und auch compiliert.

Für util/delay.h hattest du F_CPU noch nicht definiert, der Compiler hatte hier gewarnt. Das ist aber nicht der Fehler, da in dem Programm kein _delay_ aus delay.h genutzt wird.


Du hattest geschrieben, dass bei deinem Display WR auf GND und nicht einen IO-pin angeschlossen ist. Im Programm (lcd.h) ist das Signal RW übrigens auf LCD_PORT (PORTA, PA5).

Im Programm wird das BUSY Flag abgefragt. Das passiert unter anderem bei lcd_command() und lcd_data() ...


Code:
void lcd_command(uint8_t cmd)
{
    lcd_waitbusy();
    lcd_write(cmd,0);
}

void lcd_data(uint8_t data)
{
    lcd_waitbusy();
    lcd_write(data,1);
}

lcd_command() wird am Ende von lcd_init() aufgerufen. Hier kann es hängen, weil dein Display kein Read unterstützt (RW ist auf GND).

Bei der roten Stelle unten kann es hängen, wenn das "gelesene" Bit 7 LCD_BUSY high ist. Sowohl DB0..3 des AVR wie auch des Displays sind INPUT, hier wird sich also irgendein undefinierter Zustand einstellen.

Code:
static uint8_t lcd_waitbusy(void)

{
    register uint8_t c;
    
    /* wait until busy flag is cleared */
    [B][COLOR=#b22222]while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {}[/COLOR][/B]
    
    /* the address counter is updated 4us after the busy flag is cleared */
    delay(2);

    /* now read the address counter */
    return (lcd_read(0));  // return address counter
    
}/* lcd_waitbusy */

Um das Problem zu umgehen, könntest du versuchen, anstelle hier das BUSY Flag zu lesen und zu prüfen, ein delay zu verwenden. Wie groß dieses sein soll, kann ich nicht sagen, das hängt von deinem Display ab. Wie schon geschrieben, kann ich hier nichts austesten, da ich die Hardware nicht vorliegen habe.

Probiere es testweise vielleicht einfach mal mit _delay_ms(20) aus (wenns nicht funktioniert, verwende auch einfach andere Werte) ...

Code:
void lcd_command(uint8_t cmd)
{
   [COLOR=#0000ff]  _delay_ms(20);[/COLOR]
    lcd_write(cmd,0);
}

void lcd_data(uint8_t data)
{
   [COLOR=#0000ff]  _delay_ms(20);[/COLOR]
    lcd_write(data,1);
}


Hier können aber vielleicht auch andere User etwas dazu sagen, die sich mit alpanumerischen Display mehr auskennen.

Dirk :ciao:


EDIT:

Nach dieser Eintellung solltest du nochmal schauen, du verwendest ein Display mit KS0073?!

#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
 
ich habe es hinbekommen vielen dank für eure Hilfe ;)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)