eDip 240 über SPI ansteuern

#438844
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
#439528
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.
Gast #439539
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?
Angehängte Dateien:
#439585
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.
#439617
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...
Gast #439711
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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren