Pin Namen/belegung in libraries??

Hallo, Ich habe folgenden Code von einem nicht Arduino Projekt (aber Atmel): Das ganze soll in einen Unterordner in den Arduino\libraries\ Dort gibt es eine .h und eine .c Datei.

  // data port, LCD signals DB4-DB7 have to be connected to P0-P3
#define LCDDATAPORT PORTC
#define LCDDATADIR  DDRC
#define LCDDATAPIN  PINC

  // control port, LCD signals RW, EX, I/OC1, I/OC2
#define LCDCTRLPORT PORTD
#define LCDCTRLDIR  DDRD
//#define LCDCTRLPIN  PIND
#define LCDPIN_RW   PD2
#define LCDPIN_IOC1 PD4
#define LCDPIN_IOC2 PD5
#define LCDPIN_EX   PD3

Port C sind die analog IN Pins, kann ich da den Datenbus eines LCDs anschließen? Zu was änder ich PD2 wenn ich diesen an Digital 2 anschließe? Das ganze nicht in einem Sketch sondern in der .h Datei im Arduino\libraries Ordner.

Vielen Dank!

Ist die Frage so blöd gestellt das keiner was sagen will? Oder kapiert keiner was ich will???

Hallo, ist jetzt nich böse gemeint, aber ich würde da jetzt nicht groß drüber nachdenken, weil es ja schon eine Arduino LCD-library gibt die man verwenden könnte.

Ansonsten:

Port C sind die analog IN Pins, kann ich da den Datenbus eines LCDs anschließen?

Ja

Zu was änder ich PD2 wenn ich diesen an Digital 2 anschließe?

http://itp.nyu.edu/physcomp/uploads/arduino_pinmap.png Eberhard

Hi Also das ist nicht umsonst sondern hat einen sehr guten Grund: Es gib zwar eine LCD-library aber nur für einen HD44780 Chipsatz. Der für den ich den Treiber brauche hat einen Mitsubishi M50530 Chip. Bei Pollin gibt es ein LCD (HLM8070) mit 16x4 Stellen mit diesem Chip für 4[ch8364]. Bei Conrad etc kosten LCDs in dieser größe ~30[ch8364].

Das ist mehr als ein guter Grund! Wenn man 3 LCDs verbaut hat man 80[ch8364] gespart...

Laut deiner Hilfe müsste es:

#define LCDPIN_RW digital pin 2

gehen, tut es aber nicht. Wenn ich es so machen:

#define LCDPIN_RW 2

kann ich es compilieren aber das LCD tut nix.

Weiß keiner Rat?

ich glaube die "PDxy" Beschreibung von den Pins sind über die ArduinoIDE nicht mehr erreichbar. Deine Variante mit digitalwrite pin ist so unsinn.

Könntest Probieren aus nem PD0 ne 1, aus nem PD1 ne 2.... und aus nem 'PDx' nen 'PD"2 hoch x" 'zu machen. Könnte evtl klappen. (Bin aber unsicher, ob die wirklich so definiert sind...)

Musste natürlich aus allen Pindefinitionen machen

@Pumbaa

also du meinst so: PD0 -> 1 PD1 -> 2 usw. also z.b.: #define LCDPIN_RW 2 -> compilieren ok, LCD geht nicht

Geht nicht, da der LCD-Bus an Pin Null anfangen muss (sonst müsste ich noch viel mehr am Treiber ändern). An Port D (digital Pin 0 und 1) ist wahrscheinlich noch zusätzlich das Problem das Rx Tx dort ist und stört (Vermutung). Also wollte ich es an Port C hängen.

Sonst noch Ideen???

ich GLAUBE PB0=1, PB1=2, PB2=4, PB3=8, .=16, 32 64 128.

ok kapiert, was ist aber mit dem verschiedenen Ports? bei was fängt PD, PB, PC an?

das is nur ne vermutung gewesen. Aber wenn sie stimmt, guckste oben in der Pinbelegung. Welcher Arduinopin auf welchen Port und welchem Bit liegt.

PXy=2 hoch y. Also alle genauso, wenn ich recht hab. Was aber nur ne Vermutung ist.

Das ist alles kein Arduinozeug, sondern ist eher "nativer" AVR-Code. Und ich erinnere mich an irgendeinen Thread im engliuschsprachigem Forum, wo schonmal drüber dikutiert wurde, dass die "PD" im Arduino seit irgendeiner Version nimmer funktionieren. Nun will deine Library die aber gerne haben. Und es ist ne chance (und nur ne chance) dass du das einfach so übersetzen kannst.

In deinem Stück Code werden ja auch noch die Ports definiert, an denen die Steuerleitungen fürs LCD hängen.... (DDRC, PORTD, PINC...)

geht leider nicht, kann natürlich aber noch an anderen Sachen hängen....

Ich hab jetzt raus gefunden das ich die PB2 → PINB2 ändern kann ohne das der Compiler meckert.

Der LCD Treiber ist original so wie er auf dem Atmel gelaufen ist, ich habe bloß PBx → PINBx geändert.
Es kompiliert, aber das LCD zeigt nichts an, was muss ich noch ändern???
Helft mir BITTE!

Das ganze als libraries:
m50530.h

#ifndef M50530_H
#define M50530_H
#include <avr/io.h>

  // Data and Control signals can be connected to different ports!

  // data port, LCD signals DB4-DB7 have to be connected to P0-P3
#define LCDDATAPORT PORTC
#define LCDDATADIR  DDRC
#define LCDDATAPIN  PINC

  // control port, LCD signals RW, EX, I/OC1, I/OC2
#define LCDCTRLPORT PORTD
#define LCDCTRLDIR  DDRD


//#define LCDCTRLPIN  PIND
#define LCDPIN_RW   PIND7      //(PORTB & 0X10)      //PD7      //7
#define LCDPIN_IOC1 PIND4//16      //4
#define LCDPIN_IOC2 PIND2      //2
#define LCDPIN_EX   PIND3      //3


  // display commands
#define LCD_CMD_SETFUNCTIONMODE          0xc0  // SF
#define LCD_CMD_SETENTRYMODE             0x40  // SE
#define LCD_CMD_SETDISPLAYMODE           0x20  // SD
#define LCD_CMD_SHIFTCURDISPADDRESS      0x10  // MA
#define LCD_CMD_SETUNDERLINEMODE         0x0C  // SU
#define LCD_CMD_WRITERAMUNDERLINEBIT     0x08  // WU
#define LCD_CMD_SETBLINKINGFREQUENCY     0x04  // SB
#define LCD_CMD_CURSORHOMESTARTADDR      0x03  // MH
#define LCD_CMD_CLEARCURSORDATAADDRHOME  0x01  // CH
#define LCD_CMD_NOOPERATION              0x00  // NOP


  // SF - Set Function Mode constants
#define sfIO8BIT         0x20  // bit 5
#define sfIO4BIT         0x00
#define sfFont5x8        0x10  // bit 4
#define sfFont5x12       0x00
  
  // SD - Set Display Mode constants
#define dmDisplayOn      0x10
#define dmCursorOn       0x08
#define dmUnderline      0x04
#define dmCursorBlink    0x02
#define dmCharacterBlink 0x01

  // SU - Set Underline Mode constants
#define suSetUnderline   0x03
#define suResetUnderline 0x02
#define suNoUnderline    0x00

  // SB - Set Blinking Frequency constants
#define sbSlow           0x00
#define sbNormal         0x01
#define sbFast           0x02
#define sbFastest        0x03

  // SE - Set Entry Mode constants

  // base definitions cursor
#define LCD_EM_CursorRead 0x08
#define LCD_EM_CursorWrite 0x10 
#define LCD_EM_CursorIncrement 0x00
#define LCD_EM_CursorDecrement 0x20

  // base definitions display
#define LCD_EM_DisplayRead 0x01
#define LCD_EM_DisplayWrite 0x02 
#define LCD_EM_DisplayIncrement 0x00
#define LCD_EM_DisplayDecrement 0x04

  // constants for cursor
#define emCursorNoChange       0x00
#define emCursorIncRead        LCD_EM_CursorIncrement | LCD_EM_CursorRead
#define emCursorIncWrite       LCD_EM_CursorIncrement | LCD_EM_CursorWrite
#define emCursorIncReadWrite   LCD_EM_CursorIncrement | LCD_EM_CursorRead | LCD_EM_CursorWrite
#define emCursorDecRead        LCD_EM_CursorDecrement | LCD_EM_CursorRead
#define emCursorDecWrite       LCD_EM_CursorDecrement | LCD_EM_CursorWrite
#define emCursorDecReadWrite   LCD_EM_CursorDecrement | LCD_EM_CursorRead | LCD_EM_CursorWrite

  // constants for display start address                                                
#define emDisplayNoChange      0x00
#define emDisplayIncRead       LCD_EM_DisplayIncrement | LCD_EM_DisplayRead
#define emDisplayIncWrite      LCD_EM_DisplayIncrement | LCD_EM_DisplayWrite
#define emDisplayIncReadWrite  LCD_EM_DisplayIncrement | LCD_EM_DisplayRead | LCD_EM_DisplayWrite
#define emDisplayDecRead       LCD_EM_DisplayDecrement | LCD_EM_DisplayRead
#define emDisplayDecWrite      LCD_EM_DisplayDecrement | LCD_EM_DisplayWrite
#define emDisplayDecReadWrite  LCD_EM_DisplayDecrement | LCD_EM_DisplayRead | LCD_EM_DisplayWrite


//extern int LCDIsBusy(void);
extern void LCDSend(unsigned char AControl, unsigned char AData);
extern void LCDInit(void);
extern void LCDSetCursorPos(const unsigned char y, const unsigned char x);
extern void LCDWrite(const char * c);
extern void LCDWritePGM(const char * c);

  // schreibt das übergebene Zeichen an die aktuelle Cursor-Position
#define LCDWriteChar(c)            LCDSend(_BV(LCDPIN_IOC2), c)

  // setzt den Display-Modus
  // man verwende die oben deklarierten Konstanten ;)
//#define LCDSetDisplayMode(mode)    LCDSend(0, mode | 32)

  // setzt den Cursor an die angegebene Adresse
//#define LCDSetCursorAddress(address)   LCDSend((1<<LCDPIN_IOC1) | (1<<LCDPIN_IOC2), address)

#define cls(void)      LCDSend(0, LCD_CMD_CLEARCURSORDATAADDRHOME);
#endif

m50530.cpp

#include "m50530.h"
#include <util/delay.h>
#include <avr/pgmspace.h>

void LCDToggleEX(void)
{
  //_delay_us(5);

  LCDCTRLPORT |= _BV(LCDPIN_EX);
  
  _delay_us(2);  // 10

  LCDCTRLPORT &= ~_BV(LCDPIN_EX);

  //_delay_us(5);
}

int LCDIsBusy(void)
{
  unsigned char lInpData = 0;
  int lBusyFlag = 0;
  int l4BitFlag = 0;

    // data port set up to input
  LCDDATADIR &= 0xf0;
  
    // set RW signal
  LCDCTRLPORT |= _BV(LCDPIN_RW);

    // delay?
  //_delay_us(5);  

    // set EX signal
  LCDCTRLPORT |= _BV(LCDPIN_EX);

    // delay?
  //_delay_us(2); // 10

    // read 1st nibble
  lInpData = LCDDATAPIN;

    // clear EX signal
  LCDCTRLPORT &= ~_BV(LCDPIN_EX);

  lBusyFlag =  ( lInpData & (1 << 3) );
  l4BitFlag = !( lInpData & (1 << 2) );

    // delay?
  //_delay_us(5);  

    // read 2nd nibble
  if ( l4BitFlag )
  {
      // set EX signal
    LCDCTRLPORT |= _BV(LCDPIN_EX);

      // delay?
    //_delay_us(2);  // 10

      // read 2nd nibble
    LCDDATAPIN;

      // clear EX signal
    LCDCTRLPORT &= ~_BV(LCDPIN_EX);
  }

  //_delay_us(10);

    // clear RW signal
  LCDCTRLPORT &= ~_BV(LCDPIN_RW);

    // set data port back to output
  LCDDATADIR |= 0x0f;
    // clear data outputs
  LCDDATAPORT &= 0xf0;

  return lBusyFlag;
}

void LCDSend(unsigned char AControl, unsigned char AData)
{
  unsigned char lHN = ( AData & 0xf0 ) >> 4;
  unsigned char lLN = ( AData & 0x0f );
  
  while ( LCDIsBusy() ) 
    ;

  LCDCTRLPORT &= ~(_BV(LCDPIN_RW) | _BV(LCDPIN_IOC1) | _BV(LCDPIN_IOC2) | _BV(LCDPIN_EX));
  LCDCTRLPORT |= AControl;

  LCDDATAPORT &= 0xf0;
  LCDDATAPORT |= lHN;

  LCDToggleEX();

  LCDDATAPORT &= 0xf0;
  LCDDATAPORT |= lLN;
  
  LCDToggleEX();

  LCDDATAPORT &= 0xf0;
  LCDCTRLPORT &= ~AControl;

  //_delay_us(20);
}

void LCDInit(void)
{
    // port setup
  LCDDATADIR |= 0x0f;
  LCDCTRLDIR |= _BV(LCDPIN_RW) | _BV(LCDPIN_IOC1) | _BV(LCDPIN_IOC2) | _BV(LCDPIN_EX);
  
    // SF - Set Function Mode
      //  >> 4 Bit I/O, 5x8 Font, 1/32 duty
      //      >> 4 lines x 40 words, 96 words CG RAM
  LCDSend( 0, LCD_CMD_SETFUNCTIONMODE | sfIO4BIT | sfFont5x8 | 0x0B );

    // SE - Set Entry Mode
  LCDSend( 0, LCD_CMD_SETENTRYMODE | emCursorIncWrite );

    // SU - Set Underline Mode
  LCDSend( 0, LCD_CMD_SETUNDERLINEMODE | suNoUnderline );

    // SB - Set Blinking Frequency
  LCDSend( 0, LCD_CMD_SETBLINKINGFREQUENCY | sbNormal );

    // SD - Set Display Mode
  LCDSend( 0, LCD_CMD_SETDISPLAYMODE | dmDisplayOn /*| dmCursorOn*/ | dmCursorBlink);

    // CH - Clear Cursor of DD RAM display data home & display start address home
  LCDSend( 0, LCD_CMD_CLEARCURSORDATAADDRHOME ); 

  _delay_ms(2);
}

  // setzt den Cursor an die angegebene Position (y = Zeile, x = Spalte)
void LCDSetCursorPos(const unsigned char y, const unsigned char x)
{
    // Adresse aus x und y berechnen
    // Adressen sind wie folgt: Zeile 0 = 0; Zeile 1 = 40; Zeile 2 = 80; Zeile 3 = 120; Zeile 4 = 160; Zeile 5 = 64+24; Zeile 6 = 128+24; Zeile 7 = 192+24
  unsigned char address = x + (y*40);

  LCDSend(_BV(LCDPIN_IOC1)|_BV(LCDPIN_IOC2), address);
}

  // schreibt die übergebene Zeichenkette an die aktuelle Cursor-Position
void LCDWrite(const char * c)
{
  while (*c) 
    LCDWriteChar(*c++);
}

  // schreibt die übergebene Zeichenkette aus dem Programmspeicher 
  // an die aktuelle Cursor-Position
void LCDWritePGM(const char * c)
{
  uint8_t b;

  while ( (b = pgm_read_byte(c++)) )
        LCDWriteChar(b);
}

Hallo bingo,

Bist du inzwischen weiter gekommen? Ich habe das Selbe Display vorliegen.

Gruß nonesense

nein, ich habe ein anderes Display günstig bekommen...

wenn du es versuchen willst versuche:

  • den Code an C++ / mit Header-Datei richtig anzupassen (hat nix mit Arduino zu tun nur Systematisch die Syntax überprüfen ob es konform ist)
  • den Read/Write-Pin überprüfen (ich hatte ihn auf Masse), es gibt aber auch Treiber die daran festellen ob das LCD bussy ist.

viel Erfolg!!

hi
habs hinbekommen nach langem testen.
habe mal den geänderten Quelltext und die Testroutine angehängt

m50030.h

#ifndef M50530_H
#define M50530_H
#include <avr/io.h>

  // Data and Control signals can be connected to different ports!

  // data port, LCD signals DB4-DB7 have to be connected to P0-P3
#define LCDDATAPORT PORTB
#define LCDDATADIR  DDRB
#define LCDDATAPIN  PINB

  // control port, LCD signals RW, EX, I/OC1, I/OC2
#define LCDCTRLPORT PORTD
#define LCDCTRLDIR  DDRD


//#define LCDCTRLPIN  PIND
#define LCDPIN_RW   4      
#define LCDPIN_IOC1 7  
#define LCDPIN_IOC2 5      
#define LCDPIN_EX   6      


  // display commands
#define LCD_CMD_SETFUNCTIONMODE          0xc0  // SF
#define LCD_CMD_SETENTRYMODE             0x40  // SE
#define LCD_CMD_SETDISPLAYMODE           0x20  // SD
#define LCD_CMD_SHIFTCURDISPADDRESS      0x10  // MA
#define LCD_CMD_SETUNDERLINEMODE         0x0C  // SU
#define LCD_CMD_WRITERAMUNDERLINEBIT     0x08  // WU
#define LCD_CMD_SETBLINKINGFREQUENCY     0x04  // SB
#define LCD_CMD_CURSORHOMESTARTADDR      0x03  // MH
#define LCD_CMD_CLEARCURSORDATAADDRHOME  0x01  // CH
#define LCD_CMD_NOOPERATION              0x00  // NOP


  // SF - Set Function Mode constants
#define sfIO8BIT         0x20  // bit 5
#define sfIO4BIT         0x00
#define sfFont5x8        0x10  // bit 4
#define sfFont5x12       0x00
  
  // SD - Set Display Mode constants
#define dmDisplayOn      0x10
//#define dmDisplayOn      16
#define dmCursorOn       0x08
#define dmUnderline      0x04
#define dmCursorBlink    0x02
#define dmCharacterBlink 0x01

  // SU - Set Underline Mode constants
#define suSetUnderline   0x03
#define suResetUnderline 0x02
#define suNoUnderline    0x00

  // SB - Set Blinking Frequency constants
#define sbSlow           0x00
#define sbNormal         0x01
#define sbFast           0x02
#define sbFastest        0x03

  // SE - Set Entry Mode constants

  // base definitions cursor
#define LCD_EM_CursorRead 0x08
#define LCD_EM_CursorWrite 0x10
#define LCD_EM_CursorIncrement 0x00
#define LCD_EM_CursorDecrement 0x20

  // base definitions display
#define LCD_EM_DisplayRead 0x01
#define LCD_EM_DisplayWrite 0x02
#define LCD_EM_DisplayIncrement 0x00
#define LCD_EM_DisplayDecrement 0x04

  // constants for cursor
#define emCursorNoChange       0x00
#define emCursorIncRead        LCD_EM_CursorIncrement | LCD_EM_CursorRead
#define emCursorIncWrite       LCD_EM_CursorIncrement | LCD_EM_CursorWrite
#define emCursorIncReadWrite   LCD_EM_CursorIncrement | LCD_EM_CursorRead | LCD_EM_CursorWrite
#define emCursorDecRead        LCD_EM_CursorDecrement | LCD_EM_CursorRead
#define emCursorDecWrite       LCD_EM_CursorDecrement | LCD_EM_CursorWrite
#define emCursorDecReadWrite   LCD_EM_CursorDecrement | LCD_EM_CursorRead | LCD_EM_CursorWrite

  // constants for display start address                                                
#define emDisplayNoChange      0x00
#define emDisplayIncRead       LCD_EM_DisplayIncrement | LCD_EM_DisplayRead
#define emDisplayIncWrite      LCD_EM_DisplayIncrement | LCD_EM_DisplayWrite
#define emDisplayIncReadWrite  LCD_EM_DisplayIncrement | LCD_EM_DisplayRead | LCD_EM_DisplayWrite
#define emDisplayDecRead       LCD_EM_DisplayDecrement | LCD_EM_DisplayRead
#define emDisplayDecWrite      LCD_EM_DisplayDecrement | LCD_EM_DisplayWrite
#define emDisplayDecReadWrite  LCD_EM_DisplayDecrement | LCD_EM_DisplayRead | LCD_EM_DisplayWrite


extern int LCDIsBusy(void);
extern void LCDSend(unsigned char AControl, unsigned char AData);
extern char LCDInit(void);
extern void LCDSetCursorPos(const unsigned char y, const unsigned char x);
extern const char LCDWrite(const char * c);
extern void LCDWritePGM(const char * c);

  // schreibt das übergebene Zeichen an die aktuelle Cursor-Position
#define LCDWriteChar(c)           LCDSend(_BV(LCDPIN_IOC2), c)

  // setzt den Display-Modus
  // man verwende die oben deklarierten Konstanten ;)
#define LCDSetDisplayMode(mode)    LCDSend(0, mode | 32)

#define LCDSetEntryMode(mode)         LCDSend(0, mode)

  // setzt den Cursor an die angegebene Adresse
//#define LCDSetCursorAddress(address)   LCDSend((1<<LCDPIN_IOC1) | (1<<LCDPIN_IOC2), address)

#define cls(void)      LCDSend(0, LCD_CMD_CLEARCURSORDATAADDRHOME);
#endif

m50530.cpp

#include "m50530.h"
#include <util/delay.h>
#include <avr/pgmspace.h>

void LCDToggleEX(void)
{
  //_delay_us(5);

  LCDCTRLPORT |= (_BV(LCDPIN_EX));
  
  _delay_us(2);  // 10 2

  LCDCTRLPORT &= ~(_BV(LCDPIN_EX));

  //_delay_us(5);
}

int LCDIsBusy(void)
{
  unsigned char lInpData = 0;
  int lBusyFlag = 0;
  int l4BitFlag = 0;

    // data port set up to input
  LCDDATADIR &= 0xf0;
  
    // set RW signal
  LCDCTRLPORT |= _BV(LCDPIN_RW);
 
    // delay?
  //_delay_us(5);  

    // set EX signal
  LCDCTRLPORT |= _BV(LCDPIN_EX);

    // delay?
  //_delay_us(2); // 10

    // read 1st nibble
  lInpData = LCDDATAPIN;

    // clear EX signal
  LCDCTRLPORT &= ~_BV(LCDPIN_EX);

  lBusyFlag =  ( lInpData & (1 << 3) );
  l4BitFlag = !( lInpData & (1 << 2) );

    // delay?
  //_delay_us(5);  

    // read 2nd nibble
  if ( l4BitFlag )
  {
      // set EX signal
    LCDCTRLPORT |= _BV(LCDPIN_EX);

      // delay?
    //_delay_us(2);  // 10

      // read 2nd nibble
    LCDDATAPIN;

      // clear EX signal
    LCDCTRLPORT &= ~_BV(LCDPIN_EX);
  }

  //_delay_us(10);

    // clear RW signal
  LCDCTRLPORT &= ~_BV(LCDPIN_RW);

    // set data port back to output
  LCDDATADIR |= 0x0f;
    // clear data outputs
  LCDDATAPORT &= 0xf0;

  return lBusyFlag;
}

void LCDSend(unsigned char AControl, unsigned char AData)
{
      //Serial.println(AControl);
  unsigned char lHN = ( AData & 0xf0 ) >> 4;
  unsigned char lLN = ( AData & 0x0f );
  
  while ( LCDIsBusy() )
    ;

  LCDCTRLPORT &= ~(_BV(LCDPIN_RW) | _BV(LCDPIN_IOC1) | _BV(LCDPIN_IOC2) | _BV(LCDPIN_EX));
  LCDCTRLPORT |= AControl;

  LCDDATAPORT &= 0xf0;
  LCDDATAPORT |= lHN;

  LCDToggleEX();

  LCDDATAPORT &= 0xf0;
  LCDDATAPORT |= lLN;
  
  LCDToggleEX();

  LCDDATAPORT &= 0xf0;
  LCDCTRLPORT &= ~AControl;

  _delay_us(20);
  //return LCDDATAPORT;
}

char LCDInit(void)
{
    // port setup
  LCDDATADIR |= 0x0F;
  LCDCTRLDIR |= _BV(LCDPIN_RW) | _BV(LCDPIN_IOC1) | _BV(LCDPIN_IOC2) | _BV(LCDPIN_EX);
  
  // SF - Set Function Mode
      //  >> 4 Bit I/O, 5x8 Font, 1/32 duty
      //      >> 4 lines x 40 words, 96 words CG RAM
  LCDSend( 0, LCD_CMD_SETFUNCTIONMODE | sfIO4BIT | sfFont5x8 | 8 ); //geändert von 0x0b zu 8
  
    // SE - Set Entry Mode
  LCDSend( 0, LCD_CMD_SETENTRYMODE | emCursorIncWrite | emDisplayNoChange );

    // SU - Set Underline Mode
  LCDSend( 0, LCD_CMD_SETUNDERLINEMODE | suNoUnderline );

    // SB - Set Blinking Frequency
  LCDSend( 0, LCD_CMD_SETBLINKINGFREQUENCY | sbNormal );

    // SD - Set Display Mode
  LCDSend( 0, LCD_CMD_SETDISPLAYMODE | dmDisplayOn | dmCursorOn | dmCursorBlink);

    // CH - Clear Cursor of DD RAM display data home & display start address home
  LCDSend( 0, LCD_CMD_CLEARCURSORDATAADDRHOME );

  _delay_ms(2);
  return 't';
}

  // setzt den Cursor an die angegebene Position (y = Zeile, x = Spalte)
void LCDSetCursorPos(const unsigned char y, const unsigned char x)
{
    // Adresse aus x und y berechnen
    // Adressen sind wie folgt: Zeile 0 = 0; Zeile 1 = 40; Zeile 2 = 80; Zeile 3 = 120; Zeile 4 = 160; Zeile 5 = 64+24; Zeile 6 = 128+24; Zeile 7 = 192+24
  //unsigned char address = x + (y*40);
      unsigned char address = x + ((y % 4) << 6);
      if (y > 3)
            address += 24;

  LCDSend(_BV(LCDPIN_IOC1)|_BV(LCDPIN_IOC2), address);
}

  // schreibt die übergebene Zeichenkette an die aktuelle Cursor-Position
const char LCDWrite(const char * c)
{
      const char* bla = c;
  while (*c)
    LCDWriteChar(*c++);
  return *bla;
}

  // schreibt die übergebene Zeichenkette aus dem Programmspeicher
  // an die aktuelle Cursor-Position
void LCDWritePGM(const char * c)
{
  uint8_t b;

  while ( (b = pgm_read_byte(c++)) )
        LCDWriteChar(b);
}

und die Testroutine für die Arduino IDE

sketch.pde

#include <Libraries\m50530.cpp>

void setup()
{
  
  Serial.begin(9600);
  
// wait for power up
      delay(250);
      // LCD initialisieren
      LCDInit();
        // Modus des LCDs ändern
      LCDSetEntryMode( 80 | 64 );
      // Cursor einschalten
      LCDSetDisplayMode(dmDisplayOn | dmCursorOn | dmCursorBlink | dmCharacterBlink);
}

void loop()
{
  //Konfiguration vor jedem Loop
  LCDSend( 0, LCD_CMD_SETFUNCTIONMODE | sfIO4BIT | sfFont5x8 | 8 );
  LCDSend( 0, LCD_CMD_SETENTRYMODE | emCursorIncWrite | emDisplayNoChange );
  LCDSetDisplayMode(dmDisplayOn | dmCursorOn | dmCursorBlink | dmCharacterBlink);
  
  //Text bei jedem Loop
        LCDSetCursorPos(0,0);
        LCDWrite((const char*)"LCD - 24x8 characters");
      LCDSetCursorPos(5,0);
      LCDWrite((const char*)"Samsung 2138a");
        LCDSetCursorPos(4, 0);
      LCDWrite((const char*)"test successful");
        LCDSetCursorPos(7, 21);
      LCDWrite((const char*)":-)");
  delay(2);
  digitalWrite(13, HIGH);
}

SUPER!!!!

Sei doch so nett und tu ihn in den Arduino Playground raufladen mit kurzer Beschreibung. Da sind sämtliche Treiber gesammelt. Das habe ich auch mit meinem Display gemacht (es ist zwar ein Standard, hat aber 2 Enable Eingänge).

Bei Gelegenheit muss ich mir dein Code genauer ansehen... hast du viel verändert?

Auch wenn's jetzt zu spät ist. Die Pinbelegung gibt's hier http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1267893499/6

Oder in der Datei arduino-0018/hardware/arduino/cores/arduino

Gruß, Udo