Forum: Mikrocontroller und Digitale Elektronik dbox1-display


von Michael W. (mwulz)


Lesenswert?

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

von Jörg S. (joerg-s)


Lesenswert?

>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.

von Michael W. (mwulz)


Lesenswert?

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?

von K. J. (Gast)


Lesenswert?

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

von Michael W. (mwulz)


Lesenswert?

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

von K. J. (Gast)


Lesenswert?

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

von Michael W. (mwulz)


Lesenswert?

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

von K. J. (Gast)


Lesenswert?

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.

von Michael W. (mwulz)


Lesenswert?

Hallo,

ich hab einfach am Anfang zweimal die initialisierungs-Routine 
ausgeführt, jetzt ist es schön hell ;-)

danke jedenfalls
M

von Michael W. (mwulz)


Lesenswert?

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

von Frank O. (nucleus)


Angehängte Dateien:

Lesenswert?

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

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

hier findet man einen funktionierenden C-Code-Schnipsel für das Display:
http://bralug.de/wiki/Display_SDA5708

Grüße Uwe

von Frank O. (nucleus)


Lesenswert?

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)

von Frank O. (nucleus)


Angehängte Dateien:

Lesenswert?

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