www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EADIP204 per SPI ansteuern


Autor: Marcel K. (viewer)
Datum:
Angehängte Dateien:

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

Autor: Marcel K. (viewer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla, hier noch mal das Bild_01!!

Autor: holger (Gast)
Datum:

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

Autor: Marcel K. (viewer)
Datum:

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

Autor: holger (Gast)
Datum:

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

Autor: Marcel K. (viewer)
Datum:

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

Autor: gast (Gast)
Datum:

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

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.