roboguy
05.05.2006, 09:30
Von Zeit zu Zeit komme ich dazu, mich mit meinem privaten Mega128-Projekt zu beschäftigen. Das Board ist soweit fertig und funktioniert. Für die Visualisierung und lokale Eingabe möchte ich das RN KEY&LCD-Modul verwenden. Auch das läuft soweit.
Ich habe die beigefügten Ansteuerroutinen unter BASCOM mit meinem eigenen Board ausprobiert - alles klappt wunderbar. Ich kann die Displayinhalte löschen, Cursor ein-/ausschalten und positionieren, Texte schreiben usw.
Jetzt bin ich daran gegangen, das Ganze unter C zu programmieren.
Ich habe (versucht), die BASCOM-Prozeduren ín C umzusetzen. In meinem Hauptptogramm wird zuerst die I2C initialisiert, dann das RNKEYLCD-Display gelöscht und ein String hineingeschrieben. Das schien auch zu funktionieren, im Display erschien mein String - bis mir dann auffiel, dass einiges, was ich eigentlich wollte, nicht passierte: die Displaybeleuchtung blieb an, der Cursor sollte nicht angezeigt werden, blinkte aber fröhlich vor sich hin.
Ich habe mir daraufhin eine Routine für das Positionieren des Cursors genauer angesehen und damit herumgespielt: es klappt einfach nicht und ich habe keine Idee, woran es liegt.
Unter BASCOM sieht die Cursorpositionierung so aus:
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)
Local Befehle As String * 4
Befehle = Chr(27) + Chr(79) + Chr(spalte) + Chr(zeile)
I2csend Rnkeylcd_slaveid_write , Befehle , 4
End Sub
Unter WINAVR habe ich folgendes Konstrukt erstellt:
#define RNKEYLCD_CTRL_CHAR 0x1B
#define RNKEYLCD_GOTO_CHAR 0x4F
...
...
static void rnlcd_gotoxy(uint8_t col, uint8_t row)
{
uint8_t command[4];
command[0] = RNKEYLCD_CTRL_CHAR;
command[1] = RNKEYLCD_GOTO_CHAR;
command[2] = col + 48; //convert digit to ascii value
command[3] = row + 48; //convert digit to ascii value
i2cMasterSendNI(RNKEYLCD_SLAVEID_WRITE, 4, command);
}
Die i2cMasterSendNI(..) entstammt der normalen I2C.h, die bei WINAVR mit installiert wird. Diese Routine funktioniert auch prinzipiell, denn diese Abfolge
uint8_t vers_info[] = "Version 0.1 ";
...
static void rnlcd_write(uint8_t stringlength, uint8_t *string)
{
i2cMasterSendNI(RNKEYLCD_SLAVEID_WRITE, stringlength, string);
}
int main(void)
{
uint8_t i;
...
i = (uint8_t) strlen(vers_info);
rnlcd_write(i,vers_info);
...
}
schreibt mir brav in mein Display den String mit der Versionsinfo, d.h. die I2C-Kommunikation scheint zu funktionieren.
Ich bin mit meinem Latein am Ende.
Hat jemand eine Idee?
Ich habe die beigefügten Ansteuerroutinen unter BASCOM mit meinem eigenen Board ausprobiert - alles klappt wunderbar. Ich kann die Displayinhalte löschen, Cursor ein-/ausschalten und positionieren, Texte schreiben usw.
Jetzt bin ich daran gegangen, das Ganze unter C zu programmieren.
Ich habe (versucht), die BASCOM-Prozeduren ín C umzusetzen. In meinem Hauptptogramm wird zuerst die I2C initialisiert, dann das RNKEYLCD-Display gelöscht und ein String hineingeschrieben. Das schien auch zu funktionieren, im Display erschien mein String - bis mir dann auffiel, dass einiges, was ich eigentlich wollte, nicht passierte: die Displaybeleuchtung blieb an, der Cursor sollte nicht angezeigt werden, blinkte aber fröhlich vor sich hin.
Ich habe mir daraufhin eine Routine für das Positionieren des Cursors genauer angesehen und damit herumgespielt: es klappt einfach nicht und ich habe keine Idee, woran es liegt.
Unter BASCOM sieht die Cursorpositionierung so aus:
Sub Rnlcd_cursor(byval Spalte As Byte , Byval Zeile As Byte)
Local Befehle As String * 4
Befehle = Chr(27) + Chr(79) + Chr(spalte) + Chr(zeile)
I2csend Rnkeylcd_slaveid_write , Befehle , 4
End Sub
Unter WINAVR habe ich folgendes Konstrukt erstellt:
#define RNKEYLCD_CTRL_CHAR 0x1B
#define RNKEYLCD_GOTO_CHAR 0x4F
...
...
static void rnlcd_gotoxy(uint8_t col, uint8_t row)
{
uint8_t command[4];
command[0] = RNKEYLCD_CTRL_CHAR;
command[1] = RNKEYLCD_GOTO_CHAR;
command[2] = col + 48; //convert digit to ascii value
command[3] = row + 48; //convert digit to ascii value
i2cMasterSendNI(RNKEYLCD_SLAVEID_WRITE, 4, command);
}
Die i2cMasterSendNI(..) entstammt der normalen I2C.h, die bei WINAVR mit installiert wird. Diese Routine funktioniert auch prinzipiell, denn diese Abfolge
uint8_t vers_info[] = "Version 0.1 ";
...
static void rnlcd_write(uint8_t stringlength, uint8_t *string)
{
i2cMasterSendNI(RNKEYLCD_SLAVEID_WRITE, stringlength, string);
}
int main(void)
{
uint8_t i;
...
i = (uint8_t) strlen(vers_info);
rnlcd_write(i,vers_info);
...
}
schreibt mir brav in mein Display den String mit der Versionsinfo, d.h. die I2C-Kommunikation scheint zu funktionieren.
Ich bin mit meinem Latein am Ende.
Hat jemand eine Idee?