Forum: Mikrocontroller und Digitale Elektronik DOGM204A Tot?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von feg_zeven (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jungs.


Sitze gerade an der Programmierung eines LCD der DOGM-Reihe. Speziell 
handelt es sich um ein 204A mit dem SSD1803-Controller. Ich bekomme dem 
Display einfach kein Leben eingehaucht.
Mein erster Versuch, das Display mit I2C anzusteuern schlug fehl. Jetzt 
wollte ich es mal über SPI probieren aber es funzt auch nicht. Habe 
schon zwei unterschiedliche Initialisierungssequenzen ausprobiert - 
Leider ohne Erfolg.
Hat jemand Erfahrung oder ähnliche Probleme mit dem Display?
Hier auch mal mein Code:
#include <asf.h>
#include "Clock.h"
#include "ssd1803a.h"
#include <util/delay.h>


#define F_CPU 32000000UL



#define CONTRSTART 35
#define CONTRSPAN  15


int main(void)
{
  Clock_init();      // Clock  ein
  
  PORTE_DIRSET  =   PIN2_bm;;
  PORTE_OUTCLR  =    PIN2_bm;
  
  SSD1803A_SPI_Init();    // SPIC init
  _delay_ms(10);
  SSD1803A_init_reg ();    // LCD ILI9325C init
  _delay_ms(10);
  
  SetContrast(35);

  SetPostion(LINE1);
  WriteString("Hello World");
  SetPostion(LINE2);
  WriteString("4 Lines 20 chars");
  SetPostion(LINE3);
  WriteString("3. Zeile");
  SetPostion(LINE4);
  WriteString("Def 8 own char:  ");
  WriteChar(0);
  WriteChar(2);



  while(1)
  {
    PORTE_OUTTGL  =    PIN2_bm;  //Blink an LED
    _delay_ms(500);
    
    WriteIns(0xFF);



  }
}

Die Inititlaisierung:
void SSD1803A_init_reg (void)
{
  
  LCD_Reset();
    
    //************* Start Initial Sequence **********//
    //init Display

/*
    WriteIns(0x3A);  //8-Bit data length extension Bit RE=1; REV=0
    WriteIns(0x09);  //4 line display
    WriteIns(0x06);  //Bottom view
    WriteIns(0x1E);  //Bias setting BS1=1
    WriteIns(0x39);  //8-Bit data length extension Bit RE=0; IS=1
    WriteIns(0x1B);  //BS0=1 -> Bias=1/6
    WriteIns(0x6E); //Devider on and set value
    WriteIns(0x57); //Booster on and set contrast (BB1=C5, DB0=C4)
    WriteIns(0x72); //Set contrast (DB3-DB0=C3-C0)
    WriteIns(0x38); //8-Bit data length extension Bit RE=0; IS=0
  */
  //0x3A, 0x0B, 0x06, 0x3D, 0x6E, 0x54, 0x7C, 0x38, 0x0F, 0x01
    
 
    //init Display
    WriteIns(0x3A);  //8-Bit data length extension Bit RE=1; REV=0
    WriteIns(0x0B);  //4 line display
    WriteIns(0x06);  //Bottom view
    WriteIns(0x3D);  //Bias setting BS1=1
    WriteIns(0x6E);  //8-Bit data length extension Bit RE=0; IS=1
    WriteIns(0x54);  //BS0=1 -> Bias=1/6
    WriteIns(0x7C); //Devider on and set value
    WriteIns(0x0F); //Booster on and set contrast (BB1=C5, DB0=C4)
    WriteIns(0x72); //Set contrast (DB3-DB0=C3-C0)
    WriteIns(0x01); //8-Bit data length extension Bit RE=0; IS=0
  
    
   ClrDisplay();
    DisplayOnOff(DISPLAY_ON | CURSOR_ON | BLINK_ON);

      
    }

Die Schreib-Funktion:
void WriteData(char data)
{
  SET_SSD1803A_E_LOW    
  
  SPIC_DATA=0xFA;//Send 5 synchronisation bits, RS = 0, R/W = 0
  Spic_Busy();
  SPIC_DATA=(data & 0x0F);//send lower data bits
  Spic_Busy();
  SPIC_DATA=((data>>4) & 0x0F);//send higher data bits
  Spic_Busy();
  SSD1803A_E_HIGH  
}
}


Vom Code her müsste es doch eigentlich klappen oder sieht jemand einen 
Fehler?

Verschaltet habe ich es wie auf dem Bild im Anhang. An SO, SI und SCLK 
sind Pull-Up-Widerstände angebracht.

Noch ein anderes Problem: Das 500ms-Delay in der While-Schleife im 
Hauptprogramm ist von viel zu kurzer Dauer. Das tatsächliche Delay 
beträgt schätzungweise 50ms. Ich schätze das alle anderen Delays in den 
Funktionen ebenfalls viel zu kurz sind. F_CPU ist ja eigentlich im 
Hauptprogramm definiert und entspricht auch dem eingestellten Takt... 
Woran könnte das liegen?

Viele Grüße

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
feg_zeven schrieb:
> Woran könnte das liegen?

Welcher Compiler wird verwendet?

von Frank K. (fchk)


Bewertung
0 lesenswert
nicht lesenswert
feg_zeven schrieb:

> Noch ein anderes Problem: Das 500ms-Delay in der While-Schleife im
> Hauptprogramm ist von viel zu kurzer Dauer. Das tatsächliche Delay
> beträgt schätzungweise 50ms. Ich schätze das alle anderen Delays in den
> Funktionen ebenfalls viel zu kurz sind. F_CPU ist ja eigentlich im
> Hauptprogramm definiert und entspricht auch dem eingestellten Takt...
> Woran könnte das liegen?

F_CPU muss definiert sein, bevor Du delay.h einbindest. Am Besten packst 
Du das #define ganz an den Anfang.

fchk

von feg_zeven (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ah ok Danke. Probiere ich dann gleich mal aus. :)

Was das Display angeht hat niemand eine Idee?

von feg_zeven (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert nun. Konnte heute mithilfe eines Oszi die Signalverläufe 
anschauen und so konnten einige Fehler in der verwendeten SPI-Bibliothek 
zum SSD1803 aufgespürt werden.


viele 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.