hallo Community, hat jemand von euch Erfahrung mit dem DBOX1-Display von Siemens ==> SDA-5708-24 Ich hab mal schon gegoogled, und folgendes gefunden: http://www.grautier.com/grautier/index.php Mir scheint das Bus-Diagramm des Displays sehr ähnlich dem I2C Bus. Kann es sein, dass sich dieses Display auch mit I2C Controllern ansteuern liese? DATA und CLOCK könnte man vom I2C Bus nehmen, und die -LOAD- dann halt über einen dritten Pin mitgeben? danke im Voraus Michael
>Mir scheint das Bus-Diagramm des Displays sehr ähnlich dem I2C Bus.
Das war eher SPI. Schau dir mal die alten OSRAM "Intelligent Displays"
an (z.B. SCD5583A). Sind quasi identisch.
Ansonsten steht ja auch schon alles in dem Beitrag den du gelinkt hast.
Hallo, danke für den Tip! Ich hab nun einen Treiber gebastelt. Soweit ich das ganze im Datasheet verstanden habe, ist es jetzt in dem Treiber eingepflegt. Verwendet wird der Port-D am PIC18F4550. Compiler verwende ich den CCS. Ich komme einfach nicht klar mit der Ausgabe der Zeichen. Testweise hab ich in den Code unten das 1te Zeichen und hier aus dem Datenblatt den Buchstaben "A" als array "char_A" definiert. Diesen versuche ich auszugeben. Hier der Code:
1 | struct lcd_pin_map { |
2 | BOOLEAN bit7; |
3 | BOOLEAN bit6; |
4 | BOOLEAN bit5; |
5 | BOOLEAN bit4; |
6 | BOOLEAN bit3; |
7 | BOOLEAN bit2; |
8 | BOOLEAN bit1; |
9 | BOOLEAN bit0; |
10 | };
|
11 | |
12 | char char_A[4] = {0x04,0x2A,0x5F,0x71,0x91}; |
13 | int timeval = 1; |
14 | |
15 | #define lcd_reset PIN_D3
|
16 | #define lcd_clk PIN_D2
|
17 | #define lcd_data PIN_D1
|
18 | #define lcd_load PIN_D0
|
19 | |
20 | struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0,0,0,0}; // Set all PINs to output mode |
21 | struct lcd_pin_map const LCD_CLEAR = {0,0,0,0,0,0,1,1}; |
22 | struct lcd_pin_map const LCD_CONFIG = {0,0,0,0,1,1,1,1}; |
23 | |
24 | void lcd_send_byte ( BYTE n ) { |
25 | byte i; |
26 | boolean value; |
27 | |
28 | //Enable data load
|
29 | output_low(lcd_clk); |
30 | delay_us(timeval); |
31 | output_low(lcd_load); |
32 | delay_us(timeval); |
33 | |
34 | for(i=0;i<=7;i++) { |
35 | //test bit of config array
|
36 | value = bit_test(n,i); |
37 | output_bit(lcd_data,value); |
38 | |
39 | //Clock short time high
|
40 | output_high(lcd_clk); |
41 | delay_us(timeval); |
42 | output_low(lcd_clk); |
43 | delay_us(timeval); |
44 | }
|
45 | |
46 | //disable data load
|
47 | output_high(lcd_load); |
48 | delay_us(timeval); |
49 | }
|
50 | |
51 | void lcd_init() { |
52 | set_tris_D(LCD_WRITE); |
53 | delay_us(timeval); |
54 | |
55 | //Initial Reset
|
56 | output_high(lcd_load); |
57 | output_high(lcd_reset); |
58 | output_low(lcd_clk); |
59 | delay_us(timeval); |
60 | output_low(lcd_reset); |
61 | delay_us(timeval); |
62 | output_low(lcd_load); |
63 | delay_us(timeval); |
64 | |
65 | //Display clear
|
66 | lcd_send_byte(LCD_CLEAR); |
67 | |
68 | //Display Configuration
|
69 | lcd_send_byte(LCD_CONFIG); |
70 | |
71 | //Display should be successfully initialized
|
72 | }
|
73 | |
74 | void lcd_putc() { |
75 | byte i; |
76 | |
77 | lcd_send_byte(0xb0); // Hier testweise das 1te Zeichen am Display. |
78 | |
79 | delay_us(timeval); |
80 | |
81 | for(i=0;i<=4;i++) { |
82 | lcd_send_byte(char_a[i]); // Hier wird das Zeichen A ausgegeben |
83 | delay_us(timeval); |
84 | }
|
85 | |
86 | }
|
Ausgeführt wird dann:
1 | lcd_init(); |
2 | |
3 | lcd_putc(); |
Das Display bleibt komplett dunkel. Ich such schon die ganze Zeit nach Fehlern kann aber nix finden. Hat einer von euch einen solchen Treiber schonmal programmiert?
Vileicht hilft dir ja folgendes weiter. Bin selber gerade wieder bei ist schon nen augenblick her das ich des das letzte mal laufen hatte
1 | ;list p=16f627a |
2 | include "p16f627a.inc" |
3 | |
4 | __CONFIG _WDT_OFF & _PWRTE_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF |
5 | |
6 | org 0x00 |
7 | goto main |
8 | org 0x04 |
9 | |
10 | cblock 0x20 |
11 | vfdsend
|
12 | count
|
13 | count1
|
14 | endc
|
15 | |
16 | #define vfdload PORTB,0
|
17 | #define vfddata PORTB,1
|
18 | #define vfdsdclk PORTB,2
|
19 | #define vfdrst PORTB,3
|
20 | #define vfdinit B'11100000' ;Config Register: 11= Control REG, 1=Normal OP, 0=NA, 0=PEAK, 000= Brighness 100%
|
21 | #define vfdcls B'11000000'
|
22 | #define vfddigit1 B'10100000'
|
23 | #define vfddigit2 B'10100001'
|
24 | #define vfddigit3 B'10100010'
|
25 | #define vfddigit4 B'10100011'
|
26 | #define vfddigit5 B'10100100'
|
27 | #define vfddigit6 B'10100101'
|
28 | #define vfddigit7 B'10100110'
|
29 | #define vfddigit8 B'10100111'
|
30 | |
31 | main
|
32 | ; Von Analog auf Digital Schalten |
33 | BSF CMCON, CM0 |
34 | BSF CMCON, CM1 |
35 | BSF CMCON, CM2 |
36 | ; PORTA |
37 | bsf STATUS, RP0 ; auf Bank 1 umschalten |
38 | movlw B'00000000' ; PortB I/O setzen (1=In, 0=Out) (Reinfolge RA7,RA6...) |
39 | movwf TRISA ; PortB I/O setzen |
40 | bcf STATUS, RP0 ; auf Bank 0 schalten |
41 | clrf PORTA ; PortB auf 0 setzen |
42 | ; PORTB |
43 | bsf STATUS, RP0 ; auf Bank 1 umschalten |
44 | movlw B'00000000' ; PortC I/O setzen (1=In, 0=Out) (Reinfolge RB7,RB6...) |
45 | movwf TRISB ; PortC I/O setzen |
46 | bcf STATUS, RP0 ; auf Bank 0 schalten |
47 | clrf PORTB ; PortB auf 0 setzen |
48 | init
|
49 | bsf vfdrst ; vfdrst auf high |
50 | bsf vfdload |
51 | movf vfdinit, w ; Display Inialisieren |
52 | movwf vfdsend |
53 | call vfddatasend |
54 | loop
|
55 | movlw B'10100001' ;Digit 0 |
56 | movwf vfdsend |
57 | call vfddatasend |
58 | movlw B'00011111' ;ROW 0 |
59 | movwf vfdsend |
60 | call vfddatasend |
61 | movlw B'00001110' ;ROW 1 |
62 | movwf vfdsend |
63 | call vfddatasend |
64 | movlw B'00000100' ;ROW 2 |
65 | movwf vfdsend |
66 | call vfddatasend |
67 | movlw B'00000100' ;ROW 3 |
68 | movwf vfdsend |
69 | call vfddatasend |
70 | movlw B'00000100' ;ROW 4 |
71 | movwf vfdsend |
72 | call vfddatasend |
73 | movlw B'00001110' ;ROW 5 |
74 | movwf vfdsend |
75 | call vfddatasend |
76 | movlw B'00011111' ;ROW 6 |
77 | movwf vfdsend |
78 | call vfddatasend |
79 | goto loop |
80 | vfddatasend
|
81 | bcf vfdsdclk |
82 | call delay_200_ns |
83 | bcf vfdload |
84 | call delay_200_ns |
85 | btfsc vfdsend,0 |
86 | bsf vfddata |
87 | btfss vfdsend,0 |
88 | bcf vfddata |
89 | bsf vfdsdclk |
90 | call delay_200_ns |
91 | bcf vfdsdclk |
92 | call delay_200_ns |
93 | btfsc vfdsend,1 |
94 | bsf vfddata |
95 | btfss vfdsend,1 |
96 | bcf vfddata |
97 | bsf vfdsdclk |
98 | call delay_200_ns |
99 | bcf vfdsdclk |
100 | call delay_200_ns |
101 | btfsc vfdsend,2 |
102 | bsf vfddata |
103 | btfss vfdsend,2 |
104 | bcf vfddata |
105 | bsf vfdsdclk |
106 | call delay_200_ns |
107 | bcf vfdsdclk |
108 | call delay_200_ns |
109 | btfsc vfdsend,3 |
110 | bsf vfddata |
111 | btfss vfdsend,3 |
112 | bcf vfddata |
113 | bsf vfdsdclk |
114 | call delay_200_ns |
115 | bcf vfdsdclk |
116 | call delay_200_ns |
117 | btfsc vfdsend,4 |
118 | bsf vfddata |
119 | btfss vfdsend,4 |
120 | bcf vfddata |
121 | bsf vfdsdclk |
122 | call delay_200_ns |
123 | bcf vfdsdclk |
124 | call delay_200_ns |
125 | btfsc vfdsend,5 |
126 | bsf vfddata |
127 | btfss vfdsend,5 |
128 | bcf vfddata |
129 | bsf vfdsdclk |
130 | call delay_200_ns |
131 | bcf vfdsdclk |
132 | call delay_200_ns |
133 | btfsc vfdsend,6 |
134 | bsf vfddata |
135 | btfss vfdsend,6 |
136 | bcf vfddata |
137 | bsf vfdsdclk |
138 | call delay_200_ns |
139 | bcf vfdsdclk |
140 | call delay_200_ns |
141 | btfsc vfdsend,7 |
142 | bsf vfddata |
143 | btfss vfdsend,7 |
144 | bcf vfddata |
145 | bsf vfdsdclk |
146 | call delay_200_ns |
147 | bcf vfdsdclk |
148 | call delay_200_ns |
149 | bsf vfdload |
150 | bsf vfdsdclk |
151 | return
|
152 | delay_200_ns
|
153 | movlw D'5' |
154 | movwf count1 |
155 | delay_200_ns_loop
|
156 | decfsz count1,1 |
157 | goto delay_200_ns_loop |
158 | return
|
159 | end
|
Hallo, Danke für einen Post! Hat mir geholfen, ich hatte einen Fehler im Code, hab mit deiner Hilfe diesen jetzt zum laufen gebracht ;-) Weisst du wie ich nun normale ASCII Zeichen so umwandeln kann, dass ich damit das Display füttere ohne, dass ich jedes Zeichen extra mit einem #define anlegen muss?? danke Michael
Hm im c gab es glaube ich auch Tabellen in asm würde ich des mit der Tabelle im Flash machen und den dementsprechend die 7 x 8bit daraus auslesen. table banksel PCLATH clrf PCLATH banksel PCL addwf PCL, 1 ;A retlw B'00001110' ; 0 retlw B'00010001' ; 1 retlw B'00010001' ; 2 retlw B'00011111' ; 3 retlw B'00010001' ; 4 retlw B'00010001' ; 5 retlw B'00010001' ; 6 ;B retlw B'00011110' ; 0 retlw B'00010001' ; 1 retlw B'00010001' ; 2 retlw B'00011110' ; 3 retlw B'00010001' ; 4 retlw B'00010001' ; 5 retlw B'00011110' ; 6 ................ return
Hallo, danke! hab's mit Tabellen in C gelöst! Ich hab nur etwas bemerkt, wenn ich nun Text anzeigen lasse, ist dieser immer unterschiedlich hell. Die ersten 4 Spalten sind heller als die letzten 4 Spalten. Wenn ich dann mehrmals Strom-Weg, Strom-Dazu und das Display neu mit Daten beschreibe, sind oft die letzen 4 Stellen ganz hell, die ersten 4 garnicht zu sehen, usw... Hast du das auch bemerkt? gruss M
Hi ja des hab ich hier auch bin mir noch nicht sicher woran des liegt versuch mal nach jedem Zeichen die int neu zu setzen man kann je eh jedes zeichen in der heligkeit regeln.
Hallo, ich hab einfach am Anfang zweimal die initialisierungs-Routine ausgeführt, jetzt ist es schön hell ;-) danke jedenfalls M
Wisst Ihr wie ich einen String, zum Beispiel "asdf" so zerteilen kann, dass ich einzelne Zeichen daraus bekomme und dementsprechend für jedes zeichen eine Variable ausgeben kann. ich habe die Tabellen so angelegt:
1 | char char_a[7] = { 0b00001110, |
2 | 0b00010001, |
3 | 0b00010001, |
4 | 0b00011111, |
5 | 0b00010001, |
6 | 0b00010001, |
7 | 0b00010001}; |
8 | |
9 | char char_b[7] = { 0b00011110, |
10 | 0b00010001, |
11 | 0b00010001, |
12 | 0b00011110, |
13 | 0b00010001, |
14 | 0b00010001, |
15 | 0b00011110}; |
16 | |
17 | char char_c[7] = { 0b00001111, |
18 | 0b00010000, |
19 | 0b00010000, |
20 | 0b00010000, |
21 | 0b00010000, |
22 | 0b00010000, |
23 | 0b00001111}; |
24 | // und so weiter bis Z
|
Wie kann ich nun prüfen welche Zeichen der String enthält (Zeichen für Zeichen) und dann aus diesen Tabellen ausgeben?? danke M
Hallo Michael, ich bin heute auf Deinen Beitrag ueber das SDA5708 gestossen und habe versucht Deinen C-Code auf den Arduino zu portieren. Mein Problem ist, dass ich keine Anzeige bekomme. Das Display bleibt dunkel. Kannst Du mir bitte einen Tipp geben, was Du damals gemacht hast, um das Display zum Leben zu erwecken ? Gruss Nucleus
MoinMoin, hier findet man einen funktionierenden C-Code-Schnipsel für das Display: http://bralug.de/wiki/Display_SDA5708 Grüße Uwe
Hallo Uwe, vielen Dank fuer Deinen Hinweis. Ich werde - sofern ich dazu komme - heute Abend mir einmal den besagten Code ansehen. Eventuell finde ich ja das Problem auf Anhieb. Wenn Du Lust und Zeit hast, kannst Du mal in meinen umgefriemelten Code schauen (siehe Anfrage an Michael. Anlage test.pde) Viele Gruesse Frank (nucleus)
Hallo Uwe, sorry, dass ich schon wieder nerve aber ich bekomme den Code einfach nicht zu Laufen. Ich habe mir Dein Template hergenommen und an den Arduino angepasst. Was mach ich falsch? Die Anzeige bleibt einfach schwarz. Ich hoffe, Du kannst mir weiterhelfen. (Den Quellcode habe ich beigelegt) Viele Gruesse Frank (nucleus)
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.