mikrocontroller.net

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


Autor: Markus Harter (harterm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Harter (harterm)
Datum:

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

Autor: Metaller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Manfred B. (vorbeigeschlendert)
Datum:

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

Autor: Markus Harter (harterm)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Metaller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus Harter (harterm)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Markus Harter (harterm)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.