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
> 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 ?
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???
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.