mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DOGM132 SPI ansteuerung


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
weiß jemand wie dieses Display richtig angeschlossen wird ?
Ich habe es wie bei den Examples im Datenblatt  angeschlossen.
SCK --->29 CLK
MISO --> 39 RS
MOSI --> 28 SI
SS -->38 CSB

Irgendwie vermute ich das die Belegung falsch zugeordnet ist.

auf 29 habe ich eine Tackt von ca 500kHz
auf 28 ein Signal

Ich verwende das Programm auf einem ATMEGA8535
Beitrag "Mega32/Mega8 SPI funktioniert nicht"
#include <avr/io.h>

void SPI_MasterInit(void);
void SPI_MasterTransmit(char);


void main(void)
{
for{,,}
{
  SPI_MasterInit();
  while(1)
  {
    SPI_MasterTransmit(0xEE);

  }
}
}


void SPI_MasterInit(void)
{
/* Set MOSI, SCK and /SS output, all others input */
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}


void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand ne Idee, wie habt Ihr das Display verdrahtet ?

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
füge mal als erstes kleine delays ein und mache jeden schritt 
nacheineinander also:

Chipselect, 1ms, datenrein, 1ms, dann a0 , 1ms usw. .. bei mir hat das 
schon geholfen

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nachtrag:

und RS nicht auf miso!!!!!

das ist ein io pin .. also entweder an nen freien io an der cpu oder 
ganz auf VCC per pullup, aber nicht so

MfG

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab mal nachgeschaut:

SI auf MOSI
SCL auf SCK
A0 auf freien I/O
/CS auf freien I/O
/RS auf freien I/O


i/o mit rs immer auf 1 (ausser für nen reset)
i/o mit cs ist 0-Aktiv, sonst 1
A0 wie benötigt

am besten zwischen jedem befehl kurze pause per delay oder wie auch 
immer


zum senden dann:
  unsigned char spidata; //hier das zu sendende datum rein

  SPDR = spidata;  //Daten in SPDR (Write) register schreiben
  
  while(!(SPSR & 0x80));   //Auf fertige Übertragung(Flag) warten
  
  return 0;  //Funktion mit Code 0 verlassen

MfG

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank , werde das heut abend gleich mal testen.

Danke

Autor: Erwin Reuss (er-tronik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe festgestellt, daß es auf jeden Fall notwendig ist, einen 
Display-Reset vor der Initialisierung durchzuführen (also kurz auf Low, 
dann wieder auf High). Hierfür solltest Du auf jeden Fall noch einen 
I/O-Pin spendieren.

RES kann natürlich auch an den MISO-Pin, wenn man die SPI-Schnittstelle 
nicht anderweitig benutzt und knapp an I/O-Pins ist. Das Display liefert 
keine Daten und deshalb bleibt der MISO-Pin in der Regel frei.

Zwischen den Befehlen ist KEIN! Delay notwendig. Alleine die serielle 
Übertragung reicht als Delay für das Display aus (steht auch so im 
Datenblatt).

Erwin

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Micha (Gast)
Datum:
Angehängte Dateien:
  • preview image for A0.png
    A0.png
    3,12 KB, 250 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Super, das Display geht nun so halbwegs. also es zeigt Müll an während 
ich den  AVR Programmiere. Es war die falsche Schaltung ! Die für EA 
DOGMxxx-A.
Ich habe aber ein EA DOGM132B-5.

Jedoch reagiert es Irgendwie nicht auf meine Befehle.

Also Schaltung Display sohlte nun richtig sein. Es  zeigt wires zeug an 
b.z.w. ein komplett weises Bild. Lösche ich den AVR löscht sich auch das 
Display.

Die SPI Schnittstelle am AVR geht, also auf SCK kommt ein Tackt von 8 
Impulsen, und wehrend diesen Impulsen werden passend auf MOSI die Bits 
übertragen.

AO habe ich an SS/PB4 und MISO /PB6 an CS. Diese 2 Schalte ich ein 
b.z.w.
aus (siehe Code).

Ich vermute hier liegt der Fehler!

CS geht laut Datenblatt zu beginn auf 0.
AO wird 1 und 0 zu beginn des Sendens. Siehe Bild.
Ich habe AO auch länger da gelassen, nach dem senden erst eingeschaltet 
...
Alles keine Wirkung.


Was mache ich  noch falsch ?

Wie sende ich Buchstaben oder muß ich jedes Pixel senden.

Wie setze ich ein Pixel?

Autor: Micha (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Programm

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.a

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.ab

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schicke mal ein paar Schnippsel aus meinem Code, damit funktioniert 
es bei mir... keine Delays (nur nach einem Hardware-Reset), SPI-Clock 
4MHz, die Init-Sequenz ist 1:1 aus dem Datenblatt...

static const PROGMEM unsigned char init_seq[]={
    0x0E,  // length of init sequence
    0x40,  // Display start line 0
    0xA1,  // ADC reverse *)
    0xC0,  // Normal COM0~COM31
    0xA6,  // Display normal
    0xA2,  // Set bias 1/9 (Duty 1/33)
    0x2F,  // Booster, Regulator and Follower on
    0xF8,  // Set internal Booster to 3x / 4x
    0x00,
    0x23,  // Contrast set
    0x81,
    0x1F,
    0xAC,  // No indicator
    0x00,  // Display on
    0xAF
};

void glcd_init(void) {
  uint8_t i, length;

  length = init_seq[0];
  GLCD_RESET_lo;
  wait(100);
  GLCD_RESET_hi;

  for (i=0; i<length; i++){
    glcd_command(pgm_read_byte_near(&init_seq[i+1]));

  }
}

void glcd_data(uint8_t data) {
  GLCD_EN_lo;
  GLCD_DATA;
  spi_out(data);
  while (!spiDone);
  GLCD_DATA;
  GLCD_EN_hi;
}

void glcd_command(uint8_t command) {
  GLCD_EN_lo;
  GLCD_COMMAND;
  spi_out(command);
  while (!spiDone);
  GLCD_DATA;
  GLCD_EN_hi;
}

ich lasse A0 während der ganzen Übertragung im jeweiligen Zustand... 
geht lt. Datenblatt auch anders, aber warum soll ich da 
zwischenreinfunken während der Hardware SPI-Teil die Bits rausschiebt... 
ach ja, spiDone sagt mir ob die Übertragung fertig ist oder nicht... 
geht entweder über den Interrupt
ISR(SPI_STC_vect)
 oder auch mit einem Makro zur Abfrage des entsprechenden Flags - wie es 
einem eben gefällt

man kann sicher noch an dem ein oder anderen noch feilen, aber damit 
klapperts einwandfrei, Punkte, Linien, Kreise, Texte etc. über die 
üblichen Verdächtigen - dazu kannst du einfach nochmal die Forumssuche 
bemühen...

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.