Forum: Mikrocontroller und Digitale Elektronik EADIP204 per SPI ansteuern


von Marcel K. (viewer)


Angehängte Dateien:

Lesenswert?

Hallo Forumgemeinde,

ich habe bereits vor einigen Wochen mein EADIP204 im 4-Bit Mode zum 
laufen gebracht. Jetzt möchte ich das Display per SPI- Mode ansteuern.
Ich habe gar keine Erfahrung mit SPI und bin deshalb noch Neuling auf 
diesem Bereich.

Ich habe folgenden Code:

void spi_init(void)
{
  // SPIE     = ??
  // SPE       = SPI Enabled
  // DORD ->    0 = the MSB first
  //            1 = the LSB first
  // MSTR ->    0 = Slave  Mode
  //            1 = Master Mode
  // CPOL ->    0 = SCK idel 0 Volt
  //            1 = SCK idel 5 Volt
  // CPHA ->    0 = sobald Flankenwechsel kommt
  //            1 = Flankenwechsel und kurze Zeit und beim nächsten FW 
reagieren

  SPCR = ((0<<SPIE) | (1<<SPE) | (1<<DORD) | (1<<MSTR) | (1<<CPOL) | 
(1<<CPHA) | (1<<SPR1) | (0<<SPR0));

  // MOSI = PB5
  // SCK  = PB7
  DDRB = (1<<DDB5)|(1<<DDB7);
}

void lcd_init(void)
{

  /*
  __delay_cycles();
  --> 10000 sind etwa 2,5 ms
  --> 100000 sind etwa 25 ms
  */

  spi_putchar(0xF8);  // 1111 1000 Startframe RW = 0, RS = 0

  spi_putchar(0x20);  // 0010 0000 higher Nibbel 0x2 für extended 
Funkction Set RE = 1

  spi_putchar(0x40);  // 0100 0000 lower Nibbel 0x4 für extended 
Function Set RE = 1

  __delay_cycles(10000);// wait

  spi_putchar(0x00);  // 0000 0000 higher Nibbel für 5 dot, normal 
cursor und 4 Lines

  spi_putchar(0x90);  // 1001 0000 lower Nibbel für 5 dot, normal cursor 
und 4 Lines

  __delay_cycles(10000);// wait

  spi_putchar(0x20);  // 0010 0000 higher Nibbel 0x2 für extended 
Funkction Set RE = 0

  spi_putchar(0x00);  // 0100 0000 lower Nibbel 0x4 für extended 
Function Set RE = 0

  __delay_cycles(10000);// wait

  spi_putchar(0x00);  // 0000 0000 higher Nibbel 0x0 für Display Control 
Display, Cursor und blink = on

  spi_putchar(0xF0);  // 1111 0000 higher Nibbel 0xf für Display Control 
Display, Cursor und blink = on

  __delay_cycles(10000);// wait

  spi_putchar(0x20);  // 0010 0000 higher Nibbel 0x2 für extended 
Funkction Set RE = 1

  spi_putchar(0x40);  // 0100 0000 lower Nibbel 0x4 für extended 
Function Set RE = 1

  __delay_cycles(10000);// wait

  spi_putchar(0x00);  // 0000 0000 higher Byte 0x0 für entry Mode inc. 
und disabled shift

  spi_putchar(0x60);  // 0110 0000 higher Byte 0x0 für entry Mode inc. 
und disabled shift

  __delay_cycles(10000);// wait

  spi_putchar(0x20);  // 0010 0000 higher Nibbel 0x2 für extended 
Funkction Set RE = 0

  spi_putchar(0x00);  // 0100 0000 lower Nibbel 0x4 für extended 
Function Set RE = 0

  __delay_cycles(10000);// wait

  spi_putchar(0x00);  // 0000 0000 higher Nibbel 0x0 für lcd clear
  spi_putchar(0x10);  // 0001 0000 lower Nibbel 0x1 für lcd clear

   __delay_cycles(10000);// wait

  spi_putchar(0x00);  // 0000 0000 higher Nibbel 0x0 für cursor home
  spi_putchar(0x20);  // 0010 0000 lower Nibbel 0x1 für cursor home


}


void main(void)
{
 spi_init();
 lcd_init();
 __enable_interrupt();
  while (1)
  { }

}


Ich denke schon das ich das lcd_init richtig geschrieben habe. Ich habe 
auch mit einem billigen Oszi mal die Signale geprüft.

Das Bild_01 zeigt: grün SCLK, gelb SID
Allerdings zeigt das Bild_02: grün SCLK, gelb SOD

Das sieht doch schon komisch aus, oder?? Müsste das nicht genau das 
gleiche sein wie bei SID??
Ich habe die drei Leitungen mit 10kOhm am Mega16 (4MHz). CS vom Display 
liegt auf Masse.

Hat vielleicht irgendjemand eine Idee wieso das Display nicht 
initialisiert wird??

Danke für eure Hilfe und Grüße,

Marcel

von Marcel K. (viewer)


Angehängte Dateien:

Lesenswert?

Hoppla, hier noch mal das Bild_01!!

von holger (Gast)


Lesenswert?

>  spi_putchar(0x00);  // 0100 0000 lower Nibbel 0x4 für extended
>Function Set RE = 0

Das entspricht ja genau dem Wert von 0x00.
Zieht sich komplett durch deinen Code.
NICHTS an das Display zu senden ist eine gute Idee ?

von Marcel K. (viewer)


Lesenswert?

Hallo Holger,
danke schon mal für deine Antwort!!

Was soll ich den an das Display schicken?? Ich kann doch nicht die 
"0-Nibbel" einfach weg lassen, oder???

von holger (Gast)


Lesenswert?

Beitrag "LCD EA DIP204 KS0073 4-Bit, 8-Bit und serielle C-Routinen"

Hab ich selbst noch nicht probiert, aber ich denke
es lohnt sich da mal ein bisschen zu lesen.

von Marcel K. (viewer)


Lesenswert?

HI,
ich kenne diesen Code, habe ihn auch schon studiert, allerdings komme 
ich nicht wirklich so klar damit. Ich denke mir halt das mein Code noch 
übersichtlich ist. Außerdem benutze ich IAR und da hätte ich ne lange 
Arbeit bis alle Fehler ausgebessert sind. Aber trotzdem danke für den 
Link!!!

Grüße, Marcel

von gast (Gast)


Lesenswert?

Hallo Marcel,

ich habe mal gelesen das man dem Display einige Zeit zum einschalten 
geben sollte. Also ein { __delay_cycles(100000);// wait } in der Init 
wäre auf jeden Fall mal nicht schlecht.

Ich bin mir nicht ganz sicher, aber LSB muss als erstes gesendet werden. 
Das hast du zwar eingestellt, aber hast du das auch berücksichtigt?? Ich 
kenne das Display nicht aber vielleicht solltest du mal das ganze anders 
herum probieren: 0000 D0 D1 D2 D3; 0000 D4 D5 D6 D7!!

Nach spezial Kommandos soll man auf jeden fall 2ms warten!!

Vielleicht gehts ja damit??

(schau auch mal hier:
http://propellerforum.sps-welt.de/viewtopic.php?t=26
)

Grüße.......

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.