Forum: Mikrocontroller und Digitale Elektronik Frage zu DOGXL Display


von jack bauer (Gast)


Lesenswert?

Hi ich habe hier in Forum ein interessantes Beispiel gefunden wie man 
einen DOGXL Display mit einem AVR Controller betreibt. Hier ist der 
Link: Beitrag "Nochmal Hilfe zum DOGXL"

Allerdings wenn ich mir den Code so angucke und auch das Datenblatt: 
http://www.lcd-module.de/deu/pdf/grafik/dogxl160-7.pdf

Frage ich mich wie ich jetzt Pixel an den Display schicke wenn er den 
Befehl SPI_Senden verwendet. Toggelt er doch den CD Pin vom Display. 
Aber der wird doch laut Datenblatt verwendet um zu bestimmen, ob ein 
Command oder Daten gesendet werden.

Ich glaube ich habe da nur ein kleines Verständnisproblem. Könnt ihr mir 
da weiter helfen? Muss ich noch eine Funktion schreiben die explizit 
Daten an das display schickt? Denn die Funktion SPI_Senden scheint ja 
scheinbar nur für Commands zu sein.

Vielen Dank schonmal für eure Hilfe

von Achim M. (minifloat)


Lesenswert?

http://www.mikrocontroller.net/search?query=DOG*&forums[]=1&forums[]=19&forums[]=9&forums[]=10&forums[]=2&forums[]=4&forums[]=3&forums[]=6&forums[]=31&forums[]=17&forums[]=11&forums[]=8&forums[]=14&forums[]=12&forums[]=7&forums[]=5&forums[]=15&forums[]=13&forums[]=18&forums[]=16&max_age=-&sort_by_date=0

Nirgendwo die Antwort dabei?

jack bauer schrieb:
> Toggelt er doch den CD Pin vom Display.
> Aber der wird doch laut Datenblatt verwendet um zu bestimmen, ob ein
> Command oder Daten gesendet werden.

Command: Achtung, es kommen Pixeldaten!
Data: 255,34,223,44,234,234,234

Wenn das Display vorher noch auf einem anderen Kommando hängt, macht man 
das eben so. mf

von jack bauer (Gast)


Lesenswert?

Also muss ich das Toggeln und danach die entsprechende Datenrichtung 
angeben?

Ich habe mir auch mal das MSP430 Projekt das der Hersteller zur 
Verfügung stellt angeguckt. Da wird beispielsweise nicht getoggelt 
sondern nur die Datenrichtung angegeben und dann per SPI geschickt. So 
ist das uach für mich verständlich.

Ich habe mal das Projekt teilweise von MSP430 für meinen ATmega 
umgeschreiben aber es funktioniert nicht. Hier ist mein Code hat einer 
von euch eine Idee? Die SPI Funktionen habe ich den Datenblatt meines 
Controllers entnommen.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
5
#define F_CPU 1000000UL
6
7
#define CD PB4 //orange
8
#define DISPLAY_PORT PORTB
9
10
//display commands
11
#define Set_Com_End_H                 0xF1
12
#define Set_Com_End_L                 0x67
13
#define Set_LCD_Mapping_Control       0xC0
14
#define Set_Scroll_Line_LSB           0x40
15
#define Set_Scroll_Line_MSB           0x50
16
#define Set_Panel_Loading             0x2B
17
#define Set_LCD_Bias_Ratio            0xEB
18
#define Set_Vbias_Potentiometer_H     0x81
19
#define Set_Vbias_Potentiometer_L     0x5F
20
#define Set_RAM_Address_Control       0x89
21
#define Set_Display_Enable            0xAF
22
#define Set_All_Pixels_On             0xA5
23
#define System_Reset                  0xE2
24
#define Page_Address                  0x60
25
#define Column_LSB0                   0x00
26
#define Column_MSB0                   0x10
27
28
int main(void)
29
{
30
  _delay_ms(10);
31
  
32
  sei();
33
  
34
  init_io();
35
  
36
  spi_init();
37
  
38
  display_init();
39
  
40
    while(1)
41
    {
42
    //display_cmd(Set_All_Pixels_On);
43
    _delay_ms(1000);
44
    display_clear();
45
    _delay_ms(1000);
46
    }
47
}
48
49
//functions
50
//spi functions
51
void spi_init()
52
{
53
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);
54
}
55
56
void spi_send(unsigned char data)
57
{
58
  SPDR = data;
59
  while(!(SPSR & (1 << SPIF)));
60
}
61
62
//display
63
void display_init()
64
{
65
  unsigned char i;
66
  unsigned char init_instructions[11] = {0xf1, 0x67, 0xc0, 0x40, 0x50, 0x2b, 0xeb, 0x81, 0x5f, 0x89, 0xaf};
67
    
68
  for(i = 0; i < 11; i++)
69
  {
70
    display_cmd(init_instructions[i]);
71
  }    
72
}
73
74
void display_cmd(unsigned char cmd)
75
{
76
  DISPLAY_PORT &= ~(1 << CD);
77
  spi_send(cmd);
78
}
79
80
void display_data(unsigned char data)
81
{
82
  DISPLAY_PORT |= (1 << CD);
83
  spi_send(data);
84
}
85
86
void display_set_page_address(unsigned char pa)
87
{
88
  display_cmd(Page_Address + pa);
89
}
90
91
void display_set_column_address(unsigned char ca)
92
{
93
  unsigned char H = 0x00;
94
  unsigned char L = 0x00;
95
  
96
  L = (ca & 0x0f);
97
  H = (ca & 0xf0);
98
  H = (H >> 4);
99
  
100
  display_cmd(Column_LSB0 + L);
101
  display_cmd(Column_MSB0 + H);
102
}
103
104
void display_clear(void)
105
{
106
  unsigned char fill = 0x00;
107
  unsigned char p, c;
108
  
109
  for(p = 0; p < 26; p++)
110
  {
111
    for(c = 0; c < 160; c++)
112
    {
113
      display_set_page_address(0x00 + p);
114
      display_set_column_address(0x00 + c);
115
      
116
      display_data(fill);
117
    }
118
  }
119
  
120
}
121
122
123
//io;
124
void init_io(void)
125
{
126
  DDRB = 0xB0;
127
  PORTB = 0x00;
128
}

von Gerhard G. (g_g)


Lesenswert?

Hallo,


jack bauer schrieb:
> Frage ich mich wie ich jetzt Pixel an den Display schicke wenn er den
> Befehl SPI_Senden verwendet. Toggelt er doch den CD Pin vom Display.
> Aber der wird doch laut Datenblatt verwendet um zu bestimmen, ob ein
> Command oder Daten gesendet werden.

Deinen Code etwas vereinfacht.

PORTB &= ~(1<<PB2);             //CD --> low (Command)
SPI_Senden(0x6C);               //Page Address = 12 (Command)
_delay_us(10);
SPI_Senden(0x15);               //Column Address = 80 (Command)

_delay_us(10);
PORTB |= (1<<PB2);              //CD --> high (Data)
SPI_Senden(0b00011011);    // Testbild vier Pixelin der Displaymitte


Solange du Command sendest, kann PORTB &= ~(1<<PB2); so bleiben,
Auch wenn du zwei Command hintereinander sendest!

Beim ersten senden von Data musst du den Port umschalten
PORTB |= (1<<PB2);

Du darfst den Port wiederrum so lassen, bis ein neuer Command kommt!

Es ist also nicht " toggeln", sondern in der richtigen Abfolge "CD" ein- 
oder ausschalten.

Es ist also so wie du schon vermutest hast, umschalten zwischen Command 
und Data.



Gruß G.G.

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.