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
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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.