Forum: Mikrocontroller und Digitale Elektronik eDip 240 über SPI ansteuern


von Markus H. (harterm)


Lesenswert?

Hallo,

ich versuche ein eDip 240 TP Display von Electronic Assembly über SPI 
anzusteuern und bekomme es nicht hin. Da ich noch nicht so fit bin in 
dem Bereich hoffe ich auf eure Hilfe.

Das erste Problem ist, dass mein Microcontroller ADUC 7026 von Analog 
Devices mit 3,3V betrieben wird, das Display aber mi 5V. Nun hab ich 
verschiedene Angaben dazu gefunden, die einen sagen es wäre kein 
Problem, da das Display ab 0,6xVDD als high erkennt und das dann mit 3v 
passen müsste. Andererseits laufen ein Teil ´der Ausgänge auch mit 2,5V. 
Andere sagen ich rauche komplizierte Pegelwandlerchips? Kennt sich hier 
jemand damit aus?

Ich Versuche den Controller mit C und Keil uVision 3 zu programmieren. 
Nun wäre ein Beispielprogramm für die Datenübertragung sehr hilfreich da 
ich bis jetzt noch sehr auf dem trockenen sitze und keine Daten gesendet 
bekomme. Hat hier jemand schonmal sowas geschrieben?

Wäre über Hilfe wirklich dankbar, bin schon seit drei Wochen am 
versuchen und hatte sehr wenig erfolg.

Herzliche Grüße

Markus

von Markus H. (harterm)


Lesenswert?

Hat niemand ein fertiges SPI Datenübertragungsprotokoll? Kann ja auch 
von einem anderen Chip sein, ich kanns dann umschreiben.

von Metaller (Gast)


Lesenswert?

Leider kann ich Dir z.B. nicht helfen, aber ich kann Dir sagen, dass das 
LCD super mit der RS232- und I2C-Schnittstelle läuft. Wenn das Display 
am SPI-Bus betreiben würde, dann würde es zu sehr verlangsamen. Du 
weißt, dass der Bustakt nicht schneller als 100kHz bzw. 400kHz mit 
Wartezyklus sein darf?

von Manfred B. (vorbeigeschlendert)


Lesenswert?

@Metaller
du verwechselst gerade nicht I2C und SPI?
SPI = schnell, I2C = nicht so rasend flott

von Markus H. (harterm)


Lesenswert?

Ich habe es zuerst mit dem SPI Bus probiert weil ich nicht 
herausgefunden habe wie ich die RS 232 Schnittstelle benutzen muss an 
dem ARM und die Schnittstelle eventuell später im Projekt für die 
Datenübertragung auf den PC benötigen könnte. I2C sah mir auf der ersten 
Blick zu kompliziert aus.

Abgesehen von dem oben beschriebenen pegelproblem bekomme ich die Daten 
auch noch nicht richtig gesendet.

von Metaller (Gast)


Angehängte Dateien:

Lesenswert?

@Manfred B.
> du verwechselst gerade nicht I2C und SPI?
Nein das tue ich nicht, aber wie es mir scheint kennst Du das Display 
nicht ;)

@Markus
> I2C sah mir auf der ersten Blick zu kompliziert aus
Es sieht nur so aus ist es aber nicht. Im Anhang findest Du ein 
einfaches I2C Softwareprotokoll für ein AVR.

> ich die Daten auch noch nicht richtig gesendet
Hast Du auch schon versucht mit abgeschaltetem Protokoll Daten zu 
senden?

von Manfred B. (vorbeigeschlendert)


Lesenswert?

Das hat ja erst mal nichts mit dem Display zu tun?

I2C läuft mit 100kBit/s, 400kBit/s bzw. 3.4MBit/s (aber hier wird's 
schon haarig...)
SPI locker einige MBit/s

von Markus H. (harterm)


Lesenswert?

@Metaller
Danke für den Code, leider kann ich kein Assembler Programmieren und ich 
benutze einen ARM7 Chip. Aber vielleicht kann ich einige anhaltspunkte 
herauslesen wie so ein Protokoll eigentlich aussieht. Bisher habe ich 
versucht jeden schritt einzeln zu machen und die Daten testweise direkt 
ins Senderegister zu schreiben. Irgendwas passiert auch aber ich denke 
wenn ich so weiter mache bin ich nächstes Jahr noch am rumprobieren.

@Manfred
Wenn ich das so richtig verstanden habe dann kann der Controller vom 
Display nur 100KHz Takt vertragen, deshalb ist SPI hier nicht so 
schnell. Aber ich denke das wird nicht das große Problem sein.

Ich kann auch theoretisch I2C oder RS232 verwenden, Display und Chip 
können alles drei, hab halt nur mit SPI angefangen weil es mir am 
einfachsten erschien. Ich denke wenn ich das sendeprotokoll und das 
Pegelproblem im Griff hab kann das doch auch nicht so schwierig sein, 
überall steht was für ein einfaches system SPI sei.

von Manfred B. (vorbeigeschlendert)


Lesenswert?

wenn ich das richtig rauslese (Datenblatt Seite 6) kannst du durchaus 
ein einzelnes Datum mit bis zu 3MHz reinschiessen, danach braucht der 
Displaycontroller halt ein Päuschen vom 100us...

Dein ADUC7019 hat ja Hardware SPI? Dann würd ich das darüber machen... 
ich sehe gerade der hat auch 2xI2C (nobel :-) ) hmmm dann kommt es 
darauf an was noch alles dranhängt... aber mir ist SPI sympatischer...

von Markus H. (harterm)


Lesenswert?

@Manfred
Wie gesagt ich will eigentlich auch lieber SPI nutzen und ja der Bus ist 
Hardwaremäßig dabei. Ich denke, dass die Geschwindikeit keine so große 
Rolle spielen wird, aber es ist gut wenn es schnell gehen kann falls es 
mal eng wird. Wie steuer ich denn die Zeiten? Wo stelle ich ein wann er 
wieviele Pausen machen soll?

von Martin (Gast)


Lesenswert?

Hallo,

das eDIP240 läßt sich auch problemlos über eine Software emulierte SPI 
ansteuern. Das erledigen bei mir lcd_putc und lcd_getc. Die einelnen 
Kommandos lege ich vorher in einen Buffer.

Wie z.B.      edip_cmd1("ZF",3);   // Set Font 3

Gruß, Martin


void lcd_putc(uint8 d)
{
  uint8 i;

  LCD_CS_CLR;
  for(i=0;i<8;i++)
  {
    if(d & 0x80)  LCD_MOSI_SET;
      else        LCD_MOSI_CLR;
     d <<= 1;
    LCD_CLK_SET;
    LCD_CLK_SET;
    LCD_CLK_SET;
    LCD_CLK_CLR;
  }
  LCD_CS_SET;
}

uint8 lcd_getc(void)
{
  uint8 i,b;

  LCD_CS_CLR;
  for(i=0;i<8;i++)
  {
    b <<= 1;
    LCD_CLK_SET;
    LCD_CLK_SET;
    LCD_CLK_SET;
    if(LCD_MISO)  b |= 0x01;
      else        b &= ~0x01;
    LCD_CLK_CLR;
    LCD_CLK_CLR;
    LCD_CLK_CLR;
  }
  LCD_CS_SET;
  LCD_CLK_CLR;
  return(b);
}

void edip_cmd1(const char *s,uint8 b0)
{
  uint8 p;

  p = edip_buf_wr;
  edip_buf[edip_buf_wr++] = 0x11;    // <DC1>
  edip_buf[edip_buf_wr++] = 4;      // LEN = 4
  edip_buf[edip_buf_wr++] = 0x1B;    // ESC
  edip_buf[edip_buf_wr++] = s[0];    // X
  edip_buf[edip_buf_wr++] = s[1];    // X
  edip_buf[edip_buf_wr++] = b0;      //
  edip_append_checksum(p);          // Checksum
  edip_buf_wr++;
}

void edip_append_checksum(uint8 p)
{
  uint8  sum,len,i;

  sum = 0;
  len = edip_buf[p+1];
  for(i=0;i<len+2;i++)
  {
    sum += edip_buf[p+i];
  }
  edip_buf[p + len + 2] = sum;
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.