PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serielles LCD schreibt keinen Text !



oderlachs
12.07.2013, 14:36
Hallo !
Viielleicht ist es ja wieder mein "berühmtes Brett vorm Ko..", aber ich komme mit einem ser. LCD einfach nicht dazu ,dass es Zeichen ausgibt.
Hier die Angaben des Herstellers der seriellen Ansteuerung:

/* ================================================== ======================== */
/* */
/* Vom Hersteller 'Grove' vorgegebene Kommandovariablen */
/* */
/* */
/* ================================================== ======================== */
/* */
/* Initialisations Commands or Responses */
/* */
/* */
/* ================================================== ======================== */

#define UART_READY 0xA3
#define SLCD_INIT_ACK 0xA5
#define SLCD_INIT_DONE 0xAA
#define SLCD_INVALIDCOMMAND 0x46

/* ================================================== ======================== */
/* */
/* WorkingMode Commands or Responses */
/* */
/* */
/* ================================================== ======================== */
//
#define SLCD_CONTROL_HEADER 0x9F
#define SLCD_CHAR_HEADER 0xFE
#define SLCD_CURSOR_HEADER 0xFF
#define SLCD_CURSOR_ACK 0x5A
#define SLCD_RETURN_HOME 0x61
#define SLCD_DISPLAY_OFF 0x63
#define SLCD_DISPLAY_ON 0x64
#define SLCD_CLEAR_DISPLAY 0x65
#define SLCD_CURSOR_OFF 0x66
#define SLCD_CURSOR_ON 0x67
#define SLCD_BLINK_OFF 0x68
#define SLCD_BLINK_ON 0x69
#define SLCD_SCROLL_LEFT 0x6C
#define SLCD_SCROLL_RIGHT 0x72
#define SLCD_NO_AUTO_SCROLL 0x6A
#define SLCD_AUTO_SCROLL 0x6D
#define SLCD_LEFT_TO_RIGHT 0x70
#define SLCD_RIGHT_TO_LEFT 0x71

/* ================================================== ======================== */
/* */
/* ab Firmware 1.0b und höher benutzbar */
/* */
/* */
/* ================================================== ======================== */

#define SLCD_BACKLIGHT_ON 0x81
#define SLCD_BACKLIGHT_OFF 0x80
#define SLCD_POWER_ON 0x83
#define SLCD_POWER_OFF 0x82

/* ================================================== ======================== */
/* */
/* */
/* */
/* */
/* ================================================== ======================== */

Ich habe nun Funktionen geschrieben die damit arbeiten sollten:


/* ================================================== ======================== */
/* */
/* initialisierung des LCD */
/* */
/* ================================================== ======================== */
void lcd_begin(void)
{
usart_init();
wait_lcd(2000);
putchar(0x9F); // send CMD-Header
putchar(0x82); // send Power OFF
wait_lcd(1000); //1000ms
putchar(0x9F); // send CMD-Header
putchar(0x81); // send Backlight ON
wait_lcd(1000);
putchar(0x9F); // send CMD-Header
putchar(0xA3); // send LCD Init
wait_lcd(2000);

//wait_lcd(500);
}
/* ================================================== ======================== */



LCD lässt sich ein und ausschalten auch die Beleuchtung, gar kein Thema nun die Schreibfunktion:


/* ================================================== ======================== */
/* */
/* schreibe Text auf Display */
/* */
/* */
/* ================================================== ======================== */
void write_display(char *str)
{
putchar(0xFE); // send Char-Header
while(*str)
{
puts(*str); // sende Stringzeichen
str++;
}


}
//************************************************** **************************
//puts funktion hier:
//************************************************** **************************
/* ================================================== ======================== */
/* */
/* Sende String ohne CR/LF */
/* */
/* */
/* ================================================== ======================== */

void puts( char *s )
{
while( *s )
putchar( *s);
s++;
}
//************************************************** ****************************
putchar hier:
//************************************************** ****************************
/* ================================================== ======================== */
/* */
/* Sende Char ohne CR/LF */
/* */
/* */
/* ================================================== ======================== */
void putchar( char c )
{
while( (UCSRA & 1<<UDRE) == 0 );
UDR = c;
}

//************************************************** ****************************


Hier das Testprogr ohne Headerdetails


int main (void)
{
lcd_begin();
write_display("Test");
wait_lcd(2000);
SerialLCD_noBacklight();
}

Ich weiss nicht mehr wie ich dem Teil beibiegen soll endlich Zeichen auszugeben, es ist nicht defekt !! // Mit Arduino-Example getestet = OK!!
Hat wer bitte eine Idee ???
Gruss

Gerhard

sternst
12.07.2013, 15:09
void write_display(char *str)
{
putchar(0xFE); // send Char-Header
while(*str)
{
puts(*str); // sende Stringzeichen
str++;
}

}


void puts( char *s )
{
while( *s )
putchar( *s);
s++;
}
1) puts() enthält wegen einer fehlenden Klammerung eine Endlosschleife.

2) Wenn puts() einen String ausgeben soll, warum rufst du die Funktion dann in write_display() in einer Schleife mit einzelnen Zeichen auf?


Und ganz grundsätzlich: Niemals die Warnungen des Compilers ignorieren!

oderlachs
12.07.2013, 21:34
Danke !

zu 1. wüßte ich gern welche Klammer fehlen soll..

zu 2. solch ein mist ist ein schreibfehler soll natürlich putchar anstatt puts dort heissen.. Danke für den Hinweis !
Gerhard

sternst
12.07.2013, 22:54
zu 1. wüßte ich gern welche Klammer fehlen soll..Du hast doch im Prinzip den gleichen Code auch in write_display. Vergleiche das doch mal. Außerdem wäre eine vernünftige Einrückung auch dabei hilfreich, das Problem in der Funktion zu erkennen.

oderlachs
13.07.2013, 07:21
Hallo schon erkannt die while {}... ;)
Danke
Gerhard

Klebwax
13.07.2013, 07:42
Auch wenn ich mich wiederhole: im Debugger wäre das Problem schnell erkannt worden.

Ja, einrücken im Code ist sehr hilfreich. Das erledigen aber die meisten IDEs mit einem Mausclick.

MfG Klebwax

oderlachs
13.07.2013, 08:15
Ja einrücken hin , einrücken her...:
ich erstelle ein neues Projekt mit dem AVR-Studio..übernehme das dann als Projekt ins PSPad, weil ich da besser mit dem Lesen/Schreiben hinkomme, wegen der schlechten Augen. wenn ich das Projekt im AVR Studio wieder aufrufe ist oftmals die Formatierung hinnüber, wer weiss warum.. ebenso wird im PSPad die Formbearbeitung im AVR Studio anders angezeigt. Ansonsten mache ich mir schon die Mühe übersichtlich zu schreiben.

Das mit dem Debugger muss ich noch lernen, weissnoch nicht wie das geht.

Gruss Gerhard

sternst
13.07.2013, 08:28
übernehme das dann als Projekt ins PSPad, weil ich da besser mit dem Lesen/Schreiben hinkomme, wegen der schlechten Augen.???

Auch im Studio kannst du natürlich Art und Größe des Fonts beliebig einstellen.

oderlachs
13.07.2013, 08:51
???

Auch im Studio kannst du natürlich Art und Größe des Fonts beliebig einstellen.

Das weiss ich, aber ich habe trotzdem Probleme, darum meine "eigene Methode" und ich fahre damit eigentlich ganz gut.
Aber daran scheitert das ser. LCD proj bestimmt nicht.

Gerhard

Klebwax
13.07.2013, 13:03
Ja einrücken hin , einrücken her...:
.
.
Ansonsten mache ich mir schon die Mühe übersichtlich zu schreiben.

Übersichtlich ist nicht der Punkt:

void puts( char *s )
{
while( *s )
putchar( *s);
s++;
}

Diesen Code in der IDE formatieren lassen:

25994

Dann fällt einem auf, daß die IDE anders einrückt, und die fehlenden Klammern könnte man selbst finden.

MfG Klebwax

oderlachs
15.07.2013, 20:25
Sorry ich war im Kurzurlaub ohne Inet...
Aber wie ich der AVR Studio das automatische Formatieren des Sourcecodes beibringen kann, das habe ich noch nicht rausgefunden.
..noch nicht..ich Probiere mal noch ein bischen ob ich es herrausfinde...
Danke
Gerhard