mikrocontroller.net

Forum: Compiler & IDEs prüfen ob LCD-Display angeschlossen


Autor: Erik H. (agutanus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Programm zur Lüftersteuerung geschrieben, was auch an sich 
super läuft.
Allerdings ist das ganze darauf ausgelegt ohne Display zu laufen, da 
dieses lediglich zum Ändern der Einstellungen benötigt wird.

Sobald ich aber den µC ohne Display starte passiert einfach nichts! Ich 
nehme an, dass in den Funktionen zum Initialisieren des Displays 
irgendwelche Warteschleifen auf Antwort warten und so das Programm 
aufhalten.

Jetzt suche ich eine Möglichkeit zu erkennen, ob das Display 
angeschlossen ist, um eventuell beim Starten alle Display-Befehle zu 
deaktivieren.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erik H. schrieb:

> Sobald ich aber den µC ohne Display starte passiert einfach nichts! Ich
> nehme an, dass in den Funktionen zum Initialisieren des Displays
> irgendwelche Warteschleifen auf Antwort warten und so das Programm
> aufhalten.

Warteschleifen nicht.

Du benutzt die LCD Routinen vom Peter Fleury.
Die lesen aktiv das Busy Flag aus und warten solange bis das LCD 
antwortet.
Zuständig ist die zentrale Routine lcd_waitbusy(void).
Die ersetzt du einfach durch eine delay Funktionalität, die ein paar ms 
wartet.

Du kannst dann zwar vom LCD nichts mehr auslesen, da man das aber 
meistens sowieso nicht macht, ist das kein großer Verlust.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Die ersetzt du einfach durch eine delay Funktionalität, die ein paar ms
> wartet.

Besser noch: das erste Busywait wird gepollt mit zeitlicher
Überwachung.  Wenn es nach endlicher Zeit (also ein gutes Stück
mehr als das, was laut Datenblatt normal wäre) immer noch nicht
"unbusy" ist, dann wird in der Applikation ein Flag gesetzt, dass
das LC-Display nicht angeschlossen ist, und künftig keine weiteren
Ausgabeversuche mehr gemacht.

Autor: Erik H. (agutanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dl8dtl: sowas in der Art hatte ich mir auch gedacht!
Im Programm laufen fast alle Ausgaben über 2 bis 3 Funktionen. Ich werde 
dort einfach das "Display-Flag" abfragen und dann gegebenenfalls die 
Ausgabe überspringen.

unter "lcd_waitbusy()" ist diese Schleife zu finden:
/* wait until busy flag is cleared */
    while ( (c=lcd_read(0)) & (1<<LCD_BUSY)) {}

könnte ich das so lösen?:
/* check for display */
    uint8_t counter = 0; 
    while ( ((c=lcd_read(0)) & (1<<LCD_BUSY)) && (counter < 50) )
    {
        delay(100);
        counter++;
    }
    // nach 5 ms keine Antwort erhalten: ohne Display fortfahren
    if(counter == 50)
        display_flag = 0;   // mit 1 initialisiert

Ich habe gerade kein Datenblatt zur Hand um eine geeignete Zeit heraus 
zu suchen, aber 5 ms Wartezeit erscheint mir lang genug.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erik H. schrieb:
> @dl8dtl: sowas in der Art hatte ich mir auch gedacht!
> Im Programm laufen fast alle Ausgaben über 2 bis 3 Funktionen. Ich werde
> dort einfach das "Display-Flag" abfragen und dann gegebenenfalls die
> Ausgabe überspringen.

Wenn du schon in die Fleury Funktionen eingreifst, dann würde ich die 
Abfrage auf LCD vorhanden auch in diese Funktionen hineinziehen.
Ist schöner und universeller, als deinen Anwendungscode mit Abfragen zu 
spicken. Und: da kannst die Abfrage nicht vergessen.

> könnte ich das so lösen?:

klingt fürs erste vernünftig

> zu suchen, aber 5 ms Wartezeit erscheint mir lang genug.

klingt gut.

Autor: Erik H. (agutanus)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab die lcd.h und lcd.c für meine Zwecke angepasst:
in der lcd_init-Funktion ist nun folgende Abfrage enthalten
/* check if display is connected */
    uint8_t counter = 0;
    while ( ((c=lcd_read(0)) & (1<<LCD_BUSY)) && (counter < 50) )
    {
        delay(100);
        counter++;
    }
    if(counter == 50)    // busy-flag not cleared after 5 ms
    {
        lcd_flag = 0;    // no display connected
        return;
    }

in allen von mir benutzten Funktionen folgende Abfrage:
(put_c, put_s, gotoxy, clrscr)
    if(lcd_flag == 0)
        return;

lcd_flag ist in der lcd_edit.h (letzte Zeile) initialisiert.

Autor: Erik H. (agutanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
mir ist noch was eingefallen:
das Display hat doch sicherlich Pullup oder Pulldown-Widerstände an den 
Datenleitungen. Wenn dann noch ein 1 MOhm Widerstand an einen µC-Pin 
(Datenleitung) an das entgegengesetzte Potenzial gelegt wird könnte man 
noch vor der Display-Initialisierung den Zustand abfragen um zu 
erkennen, ob eines angeschlossen ist.

Autor: Erik H. (agutanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach fast 3 Stunden Fehlersuche und vergeblichen Tests konnte ich noch 
immer nicht herausfinden, warum die oben beschriebene Schleife (check if 
display is connected) niemals den 50. Durchlauf erreicht...

Auf jeden Fall habe ich es dann innerhalb einer halben Stunde nach der 
im letzten Beitrag beschriebenen Methode probiert - und es funktioniert 
perfekt!
Die RS und RW-Pins sind beim Anschließen des Displays immer HIGH. Habe 
also den RS-Pin mit 1 MOhm gegen Masse geschaltet, sodass ich vor der 
Display-Initialisierung einfach dessen Status abfrage und in "lcd_flag" 
speichere. Jede lcd-Funktion enthält dann noch die Abfrage
if(lcd_flag == 0)
   return;
sodass diese Funktionen bei Aufruf direkt wieder verlassen werden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.