mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EA-DOG S 102 Ansteuerung


Autor: Steven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Versuche nun schon seit einigen Tagen das im Betreff genannte Display in 
Betrieb zu nehmen. Bislang jedoch leider ohne Erfolg.

Das Display habe ich wie im Datenblatt beschrieben mit einem ATMega16 
verbunden:

ATMega  I DOGS102
________I_________
MOSI    I SDA
SCK     I SCK
PB0     I CD


CS0 liegt auf GND und RST auf VCC.
Sonstige Kondensatoren und Stromanschlüsse sind auch wie im Datenblatt 
beschrieben angeschlossen.

Nun bin ich mir recht sicher dass ich hardwaretechnisch alle richtig 
gemacht habe.

Ich habe folgenden C-Code compiliert und auf den Controller geschrieben. 
Erwartet habe ich nun eigentlich einen schwarzen Balken von 1 * 8 Pixel.
Vielleicht kann mal wer über den Code blicken und sieht vielleicht auf 
Anhieb meinen/ meine Fehler.

(Auch ein Delay von etwa 30ms nach jedem gesendeten Byte brachte keinen 
Erfolg.)

#include<avr/io.h>

void SPI_MasterInit(void) //SPI Intialisierungsbeispiel aus ATMega16-Datenblatt
  {    // MOSI, SCK und PB0 als Ausgang
      DDRB |= ((1<<7)|(1<<5)|(1<<0));
    // SPI Konfiguration (Richtiger SPI-mode?)
      SPCR |= (1<<6) | (1<<4) | (1<<3)|(1<<2); // SPI-Enabled, Mastermode, SPI-mode
      SPSR = (1<<0);
}

void sendCommand(char command)
  {   
     // PB0 auf low -> Command!
      PORTB &= ~(1<<0);
    //Daten in SPI Data-Register
      SPDR = command;
    //Warten bis Byte komplett gesendet
      while(!(SPSR &(1<<SPIF)));
  }

void sendData(char data)
  {
    //PB0 auf high -> Data!
      PORTB |= (1<<0);
    //Daten in SPI Data-Register
      SPDR = data;
    //Warten bis komplett gesendet
      while(!(SPSR &(1<<SPIF)));
  }

void DisplayInit(void)    //Initialisierungsbeispiel aus DOG102-6 Datenblatt
  {
    sendCommand(0x40); // 
    sendCommand(0xA1);//
    sendCommand(0xC0);//
    sendCommand(0xA4);//
    sendCommand(0xA6);//

    sendCommand(0xA2);//
    sendCommand(0x2F);//
    sendCommand(0x27);//
    sendCommand(0x81);//
    sendCommand(0x10);//

    sendCommand(0xFA);//
    sendCommand(0x90);//
    sendCommand(0xAF);//

    
  }

int main(void) 
  {
     //SPI initialisieren
      SPI_MasterInit();   
    //Display initialisieren
      DisplayInit();
    //Balken von 8*1 Pixel in Column 0, Page 0
      sendData(0xFF); 
    //Show SRAM content
      sendCommand(0xA4); // Daten anzeigen!




    while(1);  //Endlosschleife
    
  }



MfG

Steven

Autor: olikraus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Steven

Mir sind zwei Sachen aufgefallen:

1. Die Chip-Select Leitung dauerhaft auf GND zu legen ist riskant.
Über die fallende Flanke an der CS0 Leitung wird das Kommunikations-
register im DOGS zurückgesetzt. In der Tat ist die Frage, ob nicht
nach dem Reset hier eine fallende Flanke notwendig ist, um
überhaupt mit dem DOGS kommunizieren zu können.

2. Soweit ich das sehe fehlt in der sende-Routine das Auslesen des 
Datenregisters zum Zurücknehmen des Interrupt-Flags.

siehe Zeile 270 hier:
http://code.google.com/p/dogm128/source/browse/lib...
Das dogm128 projekt unterstützt auch das dogs102 modul...

Grüße,
Oli

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlt auch das Reset Timing! Siehe Datenblatt Seite 33, in etwa so:

1. Power On
2. Set RST to LOW
3. Wait >= 1 ms
4. Set RST to High
5. Wait >= 5 ms
6. Start commands....

Bei meinen Routinen reicht bei 5. auch 1 ms wait.

Wenn Du also RST auf High hast, hat der LCD Controller evtl zu wenig 
Zeit sich zu initialisieren und wird daher die ersten Kommandos der 
Initialisierung gar nicht mitbekommen.

Gruss
Roman

Autor: Steven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also als erstes möchte ich mal ein riesiges Dankeschön an euch 
loswerden!
Sehr freundliche und kompetente Hilfe die ihr zwei mir hier gegeben 
habt.

Habe eure Anregungen in mein Programm einfließen lassen und siehe da -
mit dem folgenden Code werden immerhin schon mal die Daten die ich sende 
fehlerfrei angezeigt. Der Rest des Displays ist zwar noch Pixelsalat, 
was aber durch Überschreiben des gesamten Displayinhalts in den Griff zu 
bekommen sein sollte.
Direkt nach der Programmierung des ATMegas wird leider kein 
Displayinhalt dargestellt, was aber vermutlich daran liegen sollte, dass 
der ISP-Programmer den Displaycontroller etwas durcheinander bringt, da 
die beiden ja am selben SPI-BUS hängen.

Was mich gerade aber etwas verwundert ist, dass die gesendeten Daten 
auch ohne den Befehl "show SRAM content"(0xA4) angezeigt werden.
Werde mir im Datenblatt die Befehlstabelle wohl nochmal zu Gemüte führen 
müssen.

#include<avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>

#define CHIPSELECT     PORTB &= ~(1<<1);
#define CHIPUNSELECT  PORTB |=  (1<<1);

#define DATA       PORTB |= (1<<0);
#define COMMAND      PORTB &= ~(1<<0);

#define RESETHIGH    PORTB |= (1<<2);  
#define RESETLOW    PORTB &= ~(1<<2);


void SPI_MasterInit(void)
  {  //Dieser Programmabschnitt scheint funktionsfähig zu sein,
}

unsigned char spi_out(char b)
{
    //Byte senden
      SPDR = b;
    //Warten bis Sendevorgang komplett
      while(!(SPSR &(1<<SPIF)));
    //SPIF löschen durch lesen von SPDR
      return SPDR;

}

void sendCommand(char command)
  {    CHIPSELECT;      
       COMMAND;
    //Byte senden
      spi_out(command);
      CHIPUNSELECT;    
  }

void sendData(char data)
  {     CHIPSELECT;
      DATA;
    //Byte senden
      spi_out(data);
      CHIPUNSELECT;
  }

void DisplayInit(void)
  {   //Display reset
    RESETLOW;
    _delay_ms(1);
    RESETHIGH;
    _delay_ms(5);  
    
    //Display init

    sendCommand(0x40);
    sendCommand(0xA1);
    sendCommand(0xC0);
    //sendCommand(0xA4);
    sendCommand(0xA6);

    sendCommand(0xA2);
    sendCommand(0x2F);
    sendCommand(0x27);
    sendCommand(0x81);
    sendCommand(0x10);

    sendCommand(0xFA);
    sendCommand(0x90);
    sendCommand(0xAF);



    
  }

int main(void) 
  {   SPI_MasterInit();
    DisplayInit();
    /*Ein Paar Daten testweise senden.
    Erwartung: Schwarzes Kästechen von 5*8 Pixeln in der
    oberen linken Ecke*/
    
    sendCommand(0b00000000);
    sendCommand(0b00010000);
    sendData(0xFF);
    sendCommand(0b00000001);
    sendCommand(0b00010000);
    sendData(0xFF);
    sendCommand(0b00000010);
    sendCommand(0b00010000);
    sendData(0xFF);
    sendCommand(0b00000011);
    sendCommand(0b00010000);
    sendData(0xFF);
    sendCommand(0b00000100);
    sendCommand(0b00010000);
    sendData(0xFF);
    //SRAM Inhalt darstellen!
    //sendCommand(0xA4);   //Merkwürdig!

    while(1);
    
  }


MfG
Steven

Autor: olikraus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Steven

Prima, wenn wir Dir soweit helfen konnten.

Meiner Erfahrung nach muss man nicht vor jedem Byte an dem Chip Select 
ziehen. Es reicht, wenn man das beispielsweise vor dem neu-Zeichnen des 
Bildschirminhalts macht.

Was die Störungen des ISPs betrifft, hilft ein einfacher pull-up an der 
Chip-Select Leitung. Wenn der ATMEGA programmiert wird, gehen nämlich 
die Ports alle auf LOW, was das Display fälschlicherweise als 
Chip-Select interpretiert. Damit versucht das Display dein Hex-File als 
Daten oder Commandos zu interpretieren.

Siehe Schaltplan und Beschreibung hier:

https://code.google.com/p/dogm128/wiki/dogm132_atm...

Widerstand R5 (etwas schwer erkennbar) dient genau diesem Zweck den 
Pixelsalat durch den ISP zu verhindern.

Grüße,
Oli

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.