PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AsuroLCD Library (BETA) released!!!! v0.2b



raid_ox
13.02.2007, 19:20
Hallo Alle,

Hier veröffentliche ich AsuroLCDLib v0.2b

Anwendung: https://www.roboternetz.de/phpBB2/viewtopic.php?t=27620

v0.1 Features:
- Unterstützt PCF8574P (Beispiel: https://www.roboternetz.de/wissen/index.php/LCD-Modul_am_AVR#Ansteuerung_.C3.BCber_I.C2.B2C )
- Flexiblere Pinbelegung (Veränderbar in lib)
- HD447XX kompatibel
- Print Interger
- PrintSetLCD( cursor, line, string );
- PrintAlignLCD( alignment, line, string );
- ClearLCD();
- SetIOLCD jetzt so: (ON/OFF, Pinbits);

v0.2 released!!
features:
- Veränderbare Init
- Kein Zeilensprünge mehr bei längeren String
- SetCursorLCD jetzt mit line und cursor: SetCursorLCD(cursor, line);
- Backlight Support
- PrintWrapLCD
- GetIOLCD

v0.2b features:
- ein bisschen optimiert (inline funktionen weg)
- PrintLCD und PrintWrapLCD zusammengesetzt zu PrintLCD(string, wrap[ON/OFF]);

Feedback please...

@m.a.r.v.i.n: - kannst du mal das mit deinem mehrzeiligen LCD testen?
@m.a.r.v.i.n: - Mit dem Init, kannst du es flexiblerer machen? ich kennt dein LCD nämlich nicht.

Tester, Verbesserungen und Verbesserungvorschläge sind willkommen.

Testprogramm:


#include "lib/i2cmaster.h"
#include "lib/essential.c"
#include "lib/lcd.c"

#define DELAY 1500

int main(void)
{
Init();
i2c_init();
InitLCD();

PrintLCD("LCD Testing...");
Msleep(DELAY);

while(1)
{
ClearLCD();
PrintLCD("Normal");
Msleep(DELAY);
ClearLCD();
PrintSetLCD(3, 0, "Set Cursor");
Msleep(DELAY);
ClearLCD();
PrintSetLCD(0 , 1, "Set Line");
Msleep(DELAY);
ClearLCD();
PrintSetLCD(1 , 1, "Set Cursor Line");
Msleep(DELAY);
ClearLCD();
PrintSetLCD(0 , 0, "Test Int");
SetCursorLCD(9);
PrintIntLCD(10);
Msleep(DELAY);
ClearLCD();
PrintAlignLCD(LEFT , 0, "LEFT");
Msleep(DELAY);
ClearLCD();
PrintAlignLCD(CENTER , 0, "CENTER");
Msleep(DELAY);
ClearLCD();
PrintAlignLCD(RIGHT , 0, "RIGHT");
Msleep(DELAY);
}

return 0;
}



Testprogramm v0.2


#include "lib/i2cmaster.h"
#include "lib/essential.c"
#include "lib/lcd.c"

#define DELAY 1500

int main(void)
{
Init();
i2c_init();
InitLCD();

PrintLCD("LCD Testing...");
Msleep(DELAY);

while(1)
{
ClearLCD();
PrintLCD("Normal");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(3, 0, "Set Cursor");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(0 , 1, "Set Line");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(1 , 1, "Set Cursor Line");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(0 , 0, "Test Int");
SetCursorLCD(9, 0);
PrintIntLCD(10);
Msleep(DELAY);

ClearLCD();
PrintAlignLCD(LEFT , 0, "LEFT");
Msleep(DELAY);

ClearLCD();
PrintAlignLCD(CENTER , 0, "CENTER");
Msleep(DELAY);

ClearLCD();
PrintAlignLCD(RIGHT , 0, "RIGHT");
Msleep(DELAY);

ClearLCD();
SetCursorLCD(1,0);
PrintWrapLCD("WRAPWRAPWRAPWRAPWRAP WRAP");
Msleep(DELAY);
}

return 0;
}


Initialisierung bei v0.2:


////// LCD INIT COMMANDS
// !SEE DATASHEET
// EXAMPLE:
// #define LCD_INIT {(LCD_4BIT | LCD_1LINE | LCD_5x7), COMMAND2, COMMAND3}

#define LCD_INIT {(LCD_4BIT | LCD_1LINE | LCD_5X7)}


v0.2b test:


#include "lib/i2cmaster.h"
#include "lib/essential.c"
#include "lib/lcd.c"

#define DELAY 1500

int main(void)
{
Init();
i2c_init();
InitLCD();

PrintLCD("LCD Testing...", OFF);
Msleep(DELAY);

while(1)
{
ClearLCD();
PrintLCD("Normal", OFF);
Msleep(DELAY);

ClearLCD();
PrintSetLCD(3, 0, "Set Cursor");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(0 , 1, "Set Line");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(1 , 1, "Set Cursor Line");
Msleep(DELAY);

ClearLCD();
PrintSetLCD(0 , 0, "Test Int");
SetCursorLCD(9, 0);
PrintIntLCD(10);
Msleep(DELAY);

ClearLCD();
PrintAlignLCD(LEFT , 0, "LEFT");
Msleep(DELAY);

ClearLCD();
PrintAlignLCD(CENTER , 0, "CENTER");
Msleep(DELAY);

ClearLCD();
PrintAlignLCD(RIGHT , 0, "RIGHT");
Msleep(DELAY);

ClearLCD();
SetCursorLCD(1,0);
PrintLCD("WRAPWRAPWRAPWRAPWRAP WRAP", ON);
Msleep(DELAY);
}

return 0;
}
[/code]

damaltor
13.02.2007, 19:26
na das sieht aber sehr schick aus. was ich evtl noch ändern würde, ist dass die erste zeile "1" ist, das erste zeichen aber "0".
ich würde das allererste zeichen oben links mit "0,0" bezeichen, damit wäre dann die erste zeile die zeile 0.

raid_ox
13.02.2007, 19:31
Stimmt, ich frage mich warum ich so gemacht hat :-k .
!Schon verbessert.

damaltor
13.02.2007, 19:41
was passiert wenn man mehr zeichen in den string gibt als auf die restliche zeile des displays passen? ist überhaupt erfasst (DEFINE) wie viele zeichen das display breit ist? sollte es so gemacht werden, dass die übrigen zeichen dann in der nächsten zeile gedruckt werden?

raid_ox
13.02.2007, 19:45
Hi Dalmator,

die restlichen Zeichen wird einfach nicht gezeigt,
Hmm, ich werde glaube ich noch PrintWrapLCD einfügen, das problem ist, dass ich kein LCD hab zum testen, (Ich habe nur 1-zeiliges LCD)

damaltor
13.02.2007, 19:50
hmm... naja ich vermute da wird sich jemand finden.

m.a.r.v.i.n
13.02.2007, 20:45
Hi,

sieht gut aus. Der Test funktioniert auch mit der 2. Zeile korrekt. Ein längerer String wird beim 2 zeiligen Display bis zum 40. Zeichen einfach abgeschnitten. Ab dem 41. Zeichen taucht der restliche String in der 2. Zeile auf.

Folgende Änderungen habe ich an der Lib für das DOGM162 gemacht.


#define LCD_LINES 2 // Total LCD Lines

#define LRS 6
#define LRW 5
#define LEN 4

void InitLCD(void)
{
SetIOLCD( PORTL & ~LCD_EN ); // Start LCD Control, EN=0
Msleep(1); // Wait LCD Ready

// Initialize LCD
CommandLCD( LCD_8BIT | (LCD_8BIT >> 4) );
CommandLCD( LCD_8BIT | (LCD_4BIT >> 4) );
//==== spezielle Initialisierung fuer DOGM162, 5V===
CommandLCD( 0x29 ); // LCD_4BIT | LCD_2LINE | LCD_5X7| LCD_IS1 ); // Function Set. 4bit Mode, 2 Line LCD, 5x7, Instruction Table 1
CommandLCD( 0x1C ); // LCD_BIAS_1QUARTER // Bias Set 1/4
CommandLCD( 0x52 ); //LCD_BOOSTER_OFF | LCD_CONTRAST_C5 | LCD_CONTRAST_C4 ); // Booster off, Contrast C4, C5
CommandLCD( 0x69 ); //LCD_FOLLOWER_ON | LCD_GAIN_RAB0 ); // Set Voltage follower on and Gain ratio 1
CommandLCD( 0x74 ); //LCD_CONTRAST_C3 | LCD_CONTRAST_C2 | LCD_CONTRAST_C1 ); // Contrast Set C3, C2, C1
//==============================================
CommandLCD( LCD_DISPLAYON ); // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
CommandLCD( LCD_INCREASE ); // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
CommandLCD( LCD_CLEAR ); // Clear Display
Msleep(2); // Wait Initial Complete
}


Ich habe die Ports des PCF8574 etwas anders belegt.
Die Initialisierungswerte habe ich aus dem Datenblatt als Hex Werte übernommen, Die Defines für die einzelnen Bits stehen in Klammern dahinter. Die Defines kann ich noch nachliefern.

damaltor
14.02.2007, 00:25
verrate uns mal wie du die pins belegt hast. dann könnte man evtl eine dog-lcd-lib draus machen.

raid_ox
14.02.2007, 06:16
@dalmator:

Also, wie gesagt ist die Pinbelegung egal.



////// PCF8574p PINS

#define LD4 0 // Pin to Data Bus 4
#define LD5 1 // Pin to Data Bus 5
#define LD6 2 // Pin to Data Bus 6
#define LD7 3 // Pin to Data Bus 7

#define LRS 4 // Pin to RS Pin (Register Select)
#define LRW 5 // Pin to Read/Write Pin
#define LEN 7 // Pin to Enable Pin

raid_ox
14.02.2007, 06:25
@m.a.r.v.i.n: Was ist bei dir Pin15 und PIN16? vllt. könnte man noch die Backlight per software steuern

raid_ox
14.02.2007, 08:18
wie findest du wenn ich die initialisierung so machn würde:



#define LCD_INIT {0x29, 0x1C, 0x52, 0x69, 0x74} // See Datasheet

void InitLCD(unsigned char *init)
{
unsigned char i = 0;

SetIOLCD(OFF, LCD_EN); // Start LCD Control, EN=0
Msleep(1); // Wait LCD Ready

// Initialize LCD
CommandLCD( LCD_8BIT | (LCD_8BIT >> 4) );
CommandLCD( LCD_8BIT | (LCD_4BIT >> 4) );

while(init[i] != 0x00)
{
CommandLCD(init[i]);
i++;
}

CommandLCD( LCD_DISPLAYON ); // Display on/off Control (Entry Display,Cursor off,Cursor not Blink)
CommandLCD( LCD_INCREASE ); // Entry Mode Set (I/D=1 Increment,S=0 Cursor Shift)
CommandLCD( LCD_CLEAR ); // Clear Display
CommandLCD( LCD_HOME ); // Home Cursor
Msleep(1); // Wait Initial Complete
}


und so beim Initialisierung


InitLCD(LCD_INIT);

m.a.r.v.i.n
14.02.2007, 11:11
Hi,



Was ist bei dir Pin15 und PIN16? vllt. könnte man noch die Backlight per software steuern

Beim DOGM sind das die Pins 1,2 und 19,20.
Das Backlight per Software an und auszuknipsen, hatte ich gestern abend noch ausprobiert. Das ging ganz prima mit folgender Änderung:




#define LBL 7 // Pin to enable Backlight
..
#define LCD_LBL (1 << LBL)
..

SetIOLCD(OFF, LCD_BL); // schaltet Backlight an
...
SetIOLCD(ON, LCD_BL); // schaltet Backlight aus


Die Logik ist zwar genau umgekehrt, OFF schaltet an und ON schaltet ab, aber was solls. Den Schaltplan dafür und eine Doku über die LCD Lib stelle ich heute abend ins AsuroWiki.

Die Idee, die Intitialisierung über eine Tabelle zu machen finde ich sehr gut. Das kann man dann ganz leicht für verschiedene Displays anpassen.

damaltor
14.02.2007, 12:43
Na ansonsten definiere doch "AN" und "AUS", diese wörter sind noch nicht belegt. dann kannst du das backlight mit AN einschalten und mit AUS ausschalten.

raid_ox
14.02.2007, 14:53
Hi,

oder man kann auch ne macro oder inline funktion schreiiben



#define BacklightLCD(x) SetIOLCD((x)?0:1)

@m.a.r.v.i.n : kannst du mich bei SourceForge aufnehmen, ich heiße auch da raid_ox

m.a.r.v.i.n
14.02.2007, 15:04
Hi,



kannst du mich bei SourceForge aufnehmen, ich heiße auch da raid_ox


ist erledigt.
Kennst du dich mit SVN oder CVS aus?
Im SVN Repository befindet sich der aktuelle Entwicklungsstand der Asuro Lib.
https://sourceforge.net/svn/?group_id=155217

raid_ox
14.02.2007, 17:31
Ist es eigentlich nur bei DOGM so, dass die logik für backlight umgekehrt ist, oder allgemein so??

m.a.r.v.i.n
14.02.2007, 21:24
Hi,

beim PCF8574 sind nach dem Einschalten erst mal alle Ports auf HIGH. Da der PCF8574 das Backlight nicht treiben kann (~80mA notwendig) schaltet er nur den FET. In meinem Fall ein P-FET. Der P-FET schaltet bei LOW Pegel durch, und sperrt bei HIGH Pegel. Wenn man einen N-FET verwenden würde, wäre es wahrscheinlich umgekehrt. Ich finde es schon OK so, wie es ist, sonst würde das Backlight z.B. beim Flashen leuchten, oder auch wenn ein Programm drauf ist, das nicht das LCD anspricht. Jetzt bleibt das Backlight nach dem Einschalten aus und geht erst bei init_lcd an.

raid_ox
14.02.2007, 21:55
v0.2 released!!
features:
- Veränderbare Init
- Kein Zeilensprünge mehr bei längeren String
- SetCursorLCD jetzt mit line und cursor: SetCursorLCD(cursor, line);
- Backlight Support
- PrintWrapLCD
- GetIOLCD

irgendwie wird die library immer größer, was soll ich machen??

Feedback von Tester bitte!

m.a.r.v.i.n
14.02.2007, 22:43
Hi Raid,

funktioniert alles bestens. Da kann man wirklich nicht meckern.
Auch die Wrap Funktion funktioniert beim 2zeiligen Display.

EDIT:

Die Initialisierung für das DOGM162 lautet vollständig


#define LCD_INIT {LCD_4BIT | LCD_2LINE | LCD_5X7| 1, 0x1C, 0x52, 0x69, 0x74, 0} // DOGM162 2x16 Chars, 5V, See Datasheet

Die 0 am Ende darf man nicht vergessen, sonst geht gar nichts.


irgendwie wird die library immer größer, was soll ich machen??

Evtl. könnte man ähnliche Funktionen wie z.B. PrintWrapLCD und PrintLCD zu einer zusammenfassen, mit zusätzlichen Parameter für Wrap/noWrap.
Das inline bei manchen Funktionen bläht den erzeugten Code natürlich mächtig auf.

raid_ox
16.02.2007, 22:22
New Version...

v0.2b features:
- ein bisschen optimiert (inline funktionen weg)
- PrintLCD und PrintWrapLCD zusammengesetzt zu PrintLCD(string, wrap[ON/OFF]);

Danjo00
17.02.2007, 06:18
Hi
boar wie gehsten ab direkt mal kurtz 3 libs gemacht hammer kann ich nur sagen da soll mal noch einer was dazu gegenteiliges sagen Hut ab