Forum: Mikrocontroller und Digitale Elektronik DOGM Grafikdisplay Library


von André R. (andr_r23)


Lesenswert?

Suche eine Library für das DOGM Display. Ich habe hier schon einige 
Beiträge gefunden die auch Librarys beinhalten aber ich habe keine 
möglichkeit das Display über Hardware SPI anzusteuern. Gibt es eine Soft 
SPI Library für die Displays? SPI brauche ich schon für mein 
Ethernet......

Danke

von Karl H. (kbuchegg)


Lesenswert?

> aber ich habe keine
> möglichkeit das Display über Hardware SPI anzusteuern.

SPI in Software ist jetzt aber nicht gerade Raketentechnik.

Alle Bits eines Bytes nacheinander auf einen Portpin legen und bei jedem 
Bit einem mal dem Clockpin wackeln.

von André R. (andr_r23)


Lesenswert?

Ja aber wie soll ich das sonst machen wenn ich kein HArdware SPI mehr 
zur verfügung habe?

von Karl H. (kbuchegg)


Lesenswert?

Welchen Teil der Wortkombination "Software SPI" verstehst du nicht.

In Software! Du wirst doch wohl geordnet mit 2 Pins in der richtigen 
Reihenfolge wackeln können! Mehr ist SPI nicht. In dem einen Fall macht 
das die Hardware und in deinem Fall schreibst du eben eine Funktion, die 
in gleicher Weise mit den Pins wackelt.

von spess53 (Gast)


Lesenswert?

Hi

>Ja aber wie soll ich das sonst machen wenn ich kein HArdware SPI mehr
>zur verfügung habe?

Bei einigen AVRs gibt es auch 'USART im SPI-Mode'.

MfG Spess

von André R. (andr_r23)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Welchen Teil der Wortkombination "Software SPI" verstehst du nicht.
>
> In Software! Du wirst doch wohl geordnet mit 2 Pins in der richtigen
> Reihenfolge wackeln können! Mehr ist SPI nicht. In dem einen Fall macht
> das die Hardware und in deinem Fall schreibst du eben eine Funktion, die
> in gleicher Weise mit den Pins wackelt.

Sorry aber ich habe da scheinbar nicht soviel Ahnung wie du. Ich habe 
leider keine Ahnung im C programmieren und verstehe nicht was du meinst 
mit rumwackeln.

von Ben j. (scarab)


Lesenswert?

je nach dem wie die Auflösung des Displays ist empfiehlt es sich schon 
HW-SPI zu nehmen da sich sonst das Bild möglicherweise zu langsam 
aufbaut.

ps: bei einigen Controllern wird gar nicht zwischen spi, uart, usart 
oder i2c unterschieden...z.B. den EFM32

von André R. (andr_r23)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Ja aber wie soll ich das sonst machen wenn ich kein HArdware SPI mehr
>>zur verfügung habe?
>
> Bei einigen AVRs gibt es auch 'USART im SPI-Mode'.
>
> MfG Spess

Ich nutze einen Mega1284P. Habe folgendermaßen angeschlossen:

RST PB3
A0 PB2
SCL PA0
SI PA1
CS PB4

Kann ich da was mit USART machen?

von André R. (andr_r23)


Lesenswert?

Benjamin F. schrieb:
> je nach dem wie die Auflösung des Displays ist empfiehlt es sich schon
> HW-SPI zu nehmen da sich sonst das Bild möglicherweise zu langsam
> aufbaut.
>
> ps: bei einigen Controllern wird gar nicht zwischen spi, uart, usart
> oder i2c unterschieden...z.B. den EFM32

Aber was soll ich den machen wenn ich kein SPI habe. Das mein Ethernet 
schnell und zuverlässiger ist ist VIEL wichtiger.

von Gerhard G. (xmega)


Lesenswert?

Hallo,

wenn du noch eine I2C-Schnittstelle frei hast: DOGXL160, ist mit 400 Khz
noch ausreichend schnell.

http://www.basteln-mit-avr.de/atxmega32a4.html


Gruß xmega

von Stefan (Gast)


Lesenswert?

André R. schrieb:
> Suche eine Library für das DOGM Display.

André R. schrieb:
> Ich habe
> leider keine Ahnung im C programmieren und verstehe nicht was du meinst
> mit rumwackeln.


Ja, dann ist natürlich alles klar. Ich schreibe für dich alles fix und 
fertig, du brauchst nur noch auf das eigens für dich programmieren 
GUI-Button zu drücken und schon macht die Hardware das was du von ihm 
willst. Kein Problem, darf ich ergebenst sonst noch etwas für dich tun?

von Floh (Gast)


Lesenswert?

André R. schrieb:
> Sorry aber ich habe da scheinbar nicht soviel Ahnung wie du. Ich habe
> leider keine Ahnung im C programmieren und verstehe nicht was du meinst
> mit rumwackeln.

Und dann willst du ein Gerät mit Ethernet bauen?
kopfschüttel

von André R. (andr_r23)


Lesenswert?

Floh schrieb:
> André R. schrieb:
>> Sorry aber ich habe da scheinbar nicht soviel Ahnung wie du. Ich habe
>> leider keine Ahnung im C programmieren und verstehe nicht was du meinst
>> mit rumwackeln.
>
> Und dann willst du ein Gerät mit Ethernet bauen?
> *kopfschüttel*

Ethernet funktioniert einwandfrei.

von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:
> Floh schrieb:
>> André R. schrieb:
>>> Sorry aber ich habe da scheinbar nicht soviel Ahnung wie du. Ich habe
>>> leider keine Ahnung im C programmieren und verstehe nicht was du meinst
>>> mit rumwackeln.
>>
>> Und dann willst du ein Gerät mit Ethernet bauen?
>> *kopfschüttel*
>
> Ethernet funktioniert einwandfrei.

Aber nicht weil du es gemacht hast.
Anderer Leute Loorbeeren einheimsen ist immer einfach. Die halbe 
Managerbrut lebt davon.

von Stefan (Gast)


Lesenswert?

André R. schrieb:
> Ethernet funktioniert einwandfrei.

 :-) Typen wie du sind die Gründe, weshalb ich mittlerweile nichts mehr 
open source mache. Null Ahnung von der Materie, auch kein Bock sich 
einzuarbeiten aber trotzdem kostenlose Hilfe einfordern, weil man sich 
selber zu schade ist Energie zu investieren. Armselig...

von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:

> Sorry aber ich habe da scheinbar nicht soviel Ahnung wie du.

Wie funktioniert denn SPI?


Das Byte 0b10010011 soll per SPI ausgegeben werden. Dazu gibt es 2 
Leitungen (eigentlich 3, aber die 3. ist nur die Freigabe für das 
Gerät): MOSI und SCK


     Hier ist das Byte

    0b10010011

             |
             +-----> Das Bit wird auf den MOSI Pin gelegt: der Pin
                     muss also auf 1 gestellt werden.

                     Dann macht der SCK Pin einmal 0->1 und wieder
                     zurück 1->0

            |
            +------> Dann kommt das nächste Bit. Ist wieder 1.
                     Also muss MOSI wieder auf 1 gelegt werden

                     Und wieder macht der SCK Pin: 0->1, 1->0

           |
           +-------> Das nächste Bit. Diesmal eine 0
                     Also muss der MOSI Pin auf 0 gezogen werden

                     Und wieder machr der SCK Pin: 0->1, 1->0

         usw. usw. bis alle 8 Bits durch sind.


Und das wars dann auch schon. Damit ist das Byte draussen.

Ob du die Bits von Rechts nach Links oder von Links nach Rechts 
abarbeiten musst, und ob der SCK 0->1->0  oder 1->0->1 machen muss, 
verrät dir das Datenblatt zum Display.

Das ist doch eine Standardaufgabe für jeden angehenden µC Programmierer: 
Bits extrahieren und Ausgabepins gezielt auf 0 oder 1 zu setzen, bzw. 
mit einem Pin (SCK) einmal 'wackeln'.

von André R. (andr_r23)


Lesenswert?

War ja nur eine Frage, wurde gebeten einem Kollegen das Ding zum Laufen 
zu bringen. Hab ich sonst hier im Forum noch nicht erlebt das so 
unfreundlich auf eine kurze Frage reagiert wird.

Habe nicht gesagt das jemand etwas programmieren soll oder sonstwas. 
Habe wenn ihr lesen könntet oben nur gefragt ob jemand schon eine 
SOFTSPI Library hat oder es eine gibt.

Ihr seid halt im Programmieren toll, andere sind da noch ganz am Anfang, 
ihr seid mit dem Wissen auf die Welt gekommen, andere müssen sich das 
ganze erst erarbeiten.

Leider habe ich erst vor wenigen Wochen angefangen mich damit zu 
beschäftigen ich studiere und arbeite nebenbei und deshalb kann ich da 
nicht sofort voll durchblicken.

Aber ich dachte so läuft das hier... Jeder hilft jedem vielleicht habt 
ihr ja auch irgendwann mal eine Frage zu einem anderen Fachbereich....

von André R. (andr_r23)


Lesenswert?

Stefan schrieb:
> André R. schrieb:
>> Ethernet funktioniert einwandfrei.
>
>  :-) Typen wie du sind die Gründe, weshalb ich mittlerweile nichts mehr
> open source mache. Null Ahnung von der Materie, auch kein Bock sich
> einzuarbeiten aber trotzdem kostenlose Hilfe einfordern, weil man sich
> selber zu schade ist Energie zu investieren. Armselig...

Meine Projekte sind weiterhin Open Source auch wenn es keine uC Projekte 
sind. Das ganze System funktioniert nunmal so.

Und das mit dem kein bock zur einarbeitung ist eine Unterstellung. Es 
ist einfach die Zeit die fehlt und die erfahrung.

von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:
> War ja nur eine Frage, wurde gebeten einem Kollegen das Ding zum Laufen
> zu bringen. Hab ich sonst hier im Forum noch nicht erlebt das so
> unfreundlich auf eine kurze Frage reagiert wird.

Es geht um die Art der Frage und deren Schwierigkeitsgrad. Der 
Schwierigkeitsgrad in einer Software-SPI ist lächerlich gering.

> Ihr seid halt im Programmieren toll, andere sind da noch ganz am Anfang,
> ihr seid mit dem Wissen auf die Welt gekommen,

Oh, nein.
Auch wir mussten uns das alles erarbeiten. Und soll ich dir was sagen: 
Als ich angefangen habe, gab es noch kein Internet. Was dir heute ein 
paar Stunden Online-Recherche kostet, kostete uns Tage oder Wochen. Und 
wir mussten (was wir nicht in Büchern fanden) uns die Dinge selbst 
beibringen. Wir hatten niemanden in einem Forum, der mal kurz mit einer 
Erklärung aushalf. Oft genug hat ein Problem geheißen: Nächtelang 
Handbücher und Manuals zu studieren, ein Testprogramm nach dem anderen 
zu schreiben nur um festzustellen, dass es so nicht geht und irgendetwas 
übersehen wurde - was uns dann gleich wieder an den Schreibtisch 
zurückbrachte um erneut Manualstudium zu betreiben.

Also komm mir bloss nicht mit: "Ich bin ja nicht mit diesem Wissen zur 
Welt gekommen". Da werd ich nämlich sauer.

> Aber ich dachte so läuft das hier... Jeder hilft jedem vielleicht habt
> ihr ja auch irgendwann mal eine Frage zu einem anderen Fachbereich....

So läuft das auch.
Aber von einem Frager wird auch erwartet, dass er selbst was dazu 
beiträgt. Wenn du Hotel Mama suchst, bist du hier falsch.

von usr (Gast)


Lesenswert?

wie wärs mit multiplexen? ethernetcontroller mit cs auswählen und 
schreiben oder display mit cs auswählen ?!? SPI is doch Master/slave 
verfahren ein master mehrere slaves ...

von Helmut (Gast)


Lesenswert?

Einmal gegooglet, ca 30s: http://avr.myluna.de/doku.php?id=de:dogm-class
Geht scheinbar über Soft-Spi mit 25 fps. Ein wenig Zeit und man kann 
diese Lösung sicher auch nach C oder einer anderen Sprache überführen.

Helmut

von André R. (andr_r23)


Lesenswert?

Das habe ich vorhin auch schon gefunden. Vielen Dank für den Hinweis und 
den Link. Danke

von Ben j. (scarab)


Lesenswert?

André R. schrieb:
> Benjamin F. schrieb:
>> je nach dem wie die Auflösung des Displays ist empfiehlt es sich schon
>> HW-SPI zu nehmen da sich sonst das Bild möglicherweise zu langsam
>> aufbaut.
>>
>> ps: bei einigen Controllern wird gar nicht zwischen spi, uart, usart
>> oder i2c unterschieden...z.B. den EFM32
>
> Aber was soll ich den machen wenn ich kein SPI habe. Das mein Ethernet
> schnell und zuverlässiger ist ist VIEL wichtiger.

Also ich kenne mich mit Ethernet nicht aus aber laut Atmel-Website hat 
der Mega1284P 3x SPI, brauch man die alle für Ethernet?
Ansonsten wie schon gesagt I²C Display besorgen, oder eins parallel 
anschließen wenn du noch genug Pins hast.

von André R. (andr_r23)


Lesenswert?

Bei mir steht nichts von 3xSPI. Hab auch nochmal nachgeschaut da ist nur 
die Rede von einem SPi serial Port.

von spess53 (Gast)


Lesenswert?

Hi

>Bei mir steht nichts von 3xSPI. Hab auch nochmal nachgeschaut da ist nur
>die Rede von einem SPi serial Port.

Hat er aber -> 1xSPI und 2x UART im SPI-Mode.

MfG Spess

von Stefan (Gast)


Lesenswert?

André R. schrieb:
> Bei mir steht nichts von 3xSPI. Hab auch nochmal nachgeschaut da ist nur
> die Rede von einem SPi serial Port.

Ohne jetzt bösartig zu sein, aber eine Frage habe ich dann doch noch: du 
studierst doch hoffentlich keine E-Technik sondern Informatik, oder? Das 
würde sich dann mit meinen Erfahrungswerten decken. Lieber nach einer 
Lib fragen als selber zu schreiben, Datenblätter nicht lesen können, 
sich auf zu wenig Zeit berufen, etc.

Wie gesagt, nicht böse gemeint, denn soetwas wird in den letzten 
Jahrzehnten anscheinend von den Unis "anerzogen".

von André R. (andr_r23)


Lesenswert?

Als Maschinenbauer habe ich mit solchen Dingen halt kaum Kontakt...

von Kevin K. (nemon) Benutzerseite


Lesenswert?

Gerade SPI bietet einem doch über die Chip-Select-Leitung die 
Möglichkeit, die SCK, MOSI und MISO-Leitungen an mehrere Geräte zu legen 
und den Master dann den gewünschten Chip über die zugehörige 
Select-Leitung zu selektieren. Sollte deutlich einfacher sein, als ein 
SoftwareSPI (für den TE zumindest).

von Stefan (Gast)


Lesenswert?

André R. schrieb:
> Als Maschinenbauer habe ich mit solchen Dingen halt kaum Kontakt...

Na klar, und ich habe Philosophie und Sozialwissenschaften studiert :-)

von holger (Gast)


Lesenswert?

>Gerade SPI bietet einem doch über die Chip-Select-Leitung die
>Möglichkeit, die SCK, MOSI und MISO-Leitungen an mehrere Geräte zu legen
>und den Master dann den gewünschten Chip über die zugehörige
>Select-Leitung zu selektieren.

Genau. Ich habe gerade ne Schaltung am laufen wo eine
SD-Karte, ein VS1001 und ein DOGM Display an einem
SPI laufen. Das ist gar kein Problem. Beim abspielen
von MP3 Dateien von der SD hört man nicht mal den
kleinsten Knackser wenn das Display komplett neu beschrieben
wird. Das Displayupdate dauert bei 8MHz SPI Takt etwas mehr
als eine Millisekunde. Das Display wird nur alle
250ms neu beschrieben. Ich hätte wohl auch kein Problem
da noch einen ENC28J60 für eine Ethernetverbindung dran
zu pappen. Und eine Schaltung mit nur einem ENC28J60 hätte
wohl kaum ein Problem wenn man für ein Display die Verbindung
mal für ein paar Millisekunden unterbricht.

von André R. (andr_r23)


Lesenswert?

Also, ich bin schon nen Stück weiter. Habe das auf SoftSPI umgeschrieben 
und hoffe das es soweit richtig ist. Das Problem was ich habe ist 
allerdings, dass sich mein Sensor komplett aufhängt wenn ich irgendwas 
mit dem Display mache. Die Init läuft er durch aber zeigt nichts an. 
Wenn ich dann nen clear display mache stürzt er ab. Habe mit 
Debugausgaben versucht die Lösung zu finden aber finde sie einfach 
nicht. Er durchläuft laut meinen Debugausgaben über uart ohne Probleme 
den ganzen clear prozess und reinigt angeblich jeden Pixel genau wie er 
es soll vom programmablauf. nachdem er fertig ist und das clear display 
fertig ist geht garnichts mehr. Ich kann keinerlei eingaben mehr über 
UART machen....

Ich habe mal das was ich umgeschrieben habe unten drangehangen. 
Vielleicht fällt irgendjemandem auf die schnelle etwas ein. Wird 
vermutlich etwas triviales sein. Den Timer habe ich auskommentiert, da 
ich die PWM Dimmmethode nicht brauche. Ist der Timer evtl wichtig für 
andere anwendungen beim radig display? Habe versucht das ganze 
selbsterklärend zu schreiben aber wie oben bereits beschrieben ich bin 
schlecht im programmieren.

DANKE
1
 void display_init() 
2
{
3
  //Set TIMER0 (PWM OC2 Pin)
4
  //BRIGHTNESS_PWM_DDR |= (1<<BRIGHTNESS_PWM_PIN);//PWM PORT auf Ausgang (OC2)
5
  //TCCR2 |= (1<<WGM21|1<<WGM20|1<<COM21|1<<CS20);  
6
  //OCR2 = 50;
7
  //set outputs AO und RESET
8
  DDR_A0  |= (1<<DISPLAY_A0);             
9
  DDR_RST |= (1<<PIN_RST);
10
  
11
  //Set SPI PORT
12
  DDRB |= (1<<DISPLAY_CLK)|(1<<DISPLAY_SDO)|(1<<DISPLAY_CS);
13
  PORTB |= (1<<DISPLAY_CS);
14
  
15
  //Reset the Display Controller
16
  PORT_RST &= ~(1<<PIN_RST);                   
17
  PORT_RST |= (1<<PIN_RST);
18
  asm("nop");
19
  
20
  //sent 11 init commands to Display
21
  for (unsigned char tmp = 0;tmp < 11;tmp++)
22
  {
23
    display_write_byte(CMD,DISPLAY_INIT[tmp]);
24
  }
25
  display_clear();
26
  
27
  return;
28
}
29
#############################################################
30
#############################################################
31
32
33
void display_write_byte(unsigned cmd_data, unsigned char data) 
34
{
35
  DISPLAY_CSPORT &= ~(1<<DISPLAY_CS);
36
  if(cmd_data == 0){DISPLAY_A0PORT |= (1<<DISPLAY_A0);}
37
  else{DISPLAY_A0PORT &= ~(1<<DISPLAY_A0);}
38
    
39
    for (int i=0;i<8;i++){
40
      if (data&0x80) DISPLAY_SDOPORT|=(1<<DISPLAY_SDO);
41
      else       DISPLAY_SDOPORT &=~(1<<DISPLAY_SDO);
42
    _delay_us(20);
43
    DISPLAY_CLKPORT&=~(1<<DISPLAY_CLK);
44
    data<<=1;    
45
    _delay_us(20);
46
    DISPLAY_CLKPORT|=(1<<DISPLAY_CLK);
47
    //_delay_us(100);
48
  }
49
  DISPLAY_CSPORT |= (1<<DISPLAY_CS);
50
}
51
#############################################################
52
#############################################################
53
54
void display_clear(){
55
  unsigned char page, col;
56
  
57
  for(page=0;page<8;page++){
58
    display_go_to(1,page);
59
  
60
    for (col=0;col<132;col++){
61
      display_write_byte(0,0x00);
62
    }
63
  }
64
}

von Stefan (Gast)


Lesenswert?

Prüfe noch mal die CLK-Polarität...

von André R. (andr_r23)


Lesenswert?

Hab CLK einfach mal umgedreht und geht auch nicht.

von Ben j. (scarab)


Lesenswert?

André R. schrieb:
> Den Timer habe ich auskommentiert, da
> ich die PWM Dimmmethode nicht brauche. Ist der Timer evtl wichtig für
> andere anwendungen beim radig display?

benötigt
1
_delay_us(20);
 vielleicht den Timer?

von André R. (andr_r23)


Lesenswert?

Ne eigtl nicht, die _delay_us kommt aus der util/delay.h und ist ein 
aktives Warten wird kein Timer für benutzt.

von André R. (andr_r23)


Lesenswert?

So, alles läuft, problem war, dass ich ein Datenrichtungsregister falsch 
gesetzt hatte.

Die korrigierte Version für alle die es interressiert und kein Hardware 
SPI benutzen wollen hier nochmal die beiden funktionen die ihr ändern 
müsst. Das Display läuft zumindest vom Gefühl ohne 
Geschwindigkeitsunterschied zum SPI obwohl der Webserver und nen ganzer 
anderer Haufen wie mehrere 24Bit AD Wandlungen etc auch ständig und ohne 
Pause durchlaufen. Kein Flackern Text ist sofort auf dem Bild.
1
  void display_write_byte(unsigned cmd_data, unsigned char data) 
2
{
3
  //uart_puts("2");
4
  DISPLAY_CSPORT &= ~(1<<DISPLAY_CS);
5
  if(cmd_data == 0){DISPLAY_A0PORT |= (1<<DISPLAY_A0);}
6
  else{DISPLAY_A0PORT &= ~(1<<DISPLAY_A0);}
7
    
8
    for (int i=0;i<8;i++){
9
      if (data&0x80) DISPLAY_SDOPORT|=(1<<DISPLAY_SDO);
10
      else       DISPLAY_SDOPORT &=~(1<<DISPLAY_SDO);
11
    _delay_us(20);
12
    DISPLAY_CLKPORT&=~(1<<DISPLAY_CLK);
13
    data<<=1;    
14
    _delay_us(20);
15
    DISPLAY_CLKPORT|=(1<<DISPLAY_CLK);
16
    _delay_us(100);
17
  }
18
  DISPLAY_CSPORT |= (1<<DISPLAY_CS);
19
}
20
21
void display_init() 
22
{
23
24
  DDR_A0  |= (1<<DISPLAY_A0);             
25
  DDR_RST |= (1<<PIN_RST);
26
  DDR_CS  |= (1<<DISPLAY_CS);
27
  DDR_SDO |= (1<<DISPLAY_SDO);
28
  DDR_CLK |= (1<<DISPLAY_CLK);
29
  DISPLAY_CSPORT  |= (1<<DISPLAY_CS);
30
  PORT_RST &= ~(1<<PIN_RST);
31
  _delay_us(100);                   
32
  PORT_RST |= (1<<PIN_RST);
33
  asm("nop");
34
35
  for (unsigned char tmp = 0;tmp < 10;tmp++)
36
  {
37
    display_write_byte(CMD,DISPLAY_INIT[tmp]);
38
  }
39
  display_clear();
40
  return;
41
}

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