Hi @ll,
Zuerst eine Begrüßung. Dies ist mein erster Beitrag oder vielmehr eine
Frage. Also hallo an alle "Alt Eingesessenen".
Also ich versuche gerade mit einem Arduino Uno ein HDLx-2416 von Avago
zum schwatzen zu überreden. Nur funktioniert das nicht so recht. Das
Drecksding gibt kein Mux von sich. Das schöne an diesen HDLx's ist, sie
gehen nicht so schnell kaputt; das blöde daran, ich glaube langsam,
meiner ist kaputt.
Ich habe mich echt an dieses Datasheet gehalten und ich stelle mal die
kühne Behauptung auf, ich hätte sie verstanden.
Datasheet: http://www.avagotech.com/docs/AV02-0662EN
Aber ich scheine mich entweder zu deppert anzustellen oder mein HDLA ist
tatsächlich kaputt.
Hier ist mein Code, die Pinbelegung habe ich oben in den Code
geschrieben. Vielleicht hat ja jemand so was schon mal gemacht oder hat
Arduino und HDLx zu Hause rumfliegen, um sich meinen Mist mal
anzuschauen.
Vielen Dank im Vorraus.
Gruß
Emanuel
Wahrscheinlich spielst Du auf den "getBit" an, aber tatsächlich ist bool
ein int und mich interessiert nur 0 und 1. Mach ein int aus dem
Rückgabewert und die Sonne lacht wieder.
Oder so, wie es war:
/*
* Returns a bit from a value of a given index
*/
bool isBitHigh(byte val, int index) {
return (val >> index) & 1;
}
Seh ich jetzt nicht als Drama.
Naja, das ist jetzt Testcode in dem man die ganze Zeit rummatscht und
keine Benamung in Formvollendung, das gebe ich zu. Und die Dokumentation
ist auch nicht adequat. Und das es display 2 mal gibt? Schon gut, ja.
Hast ja Recht.
Wenn Du Deinen Code in Ordnung gebracht hast, (hast Du noch nicht)
empfehle ich Dir die timing conventions auf Seite 6 des datasheets. Ist
digitalWrite und ähnliches schnell genug? Hältst Du Reihenfolge und
Zeiten ein?
Ich halte die Zustände ein, jedoch im Nanosekunden Bereich schalte ich
nicht. Ich habe mit den Timings rumgespielt und sie verkürzt und
verlängert. Jedoch mache ich alles in seinem Zeitschritt, wie ich meine.
Ich habe das mit einem analogen Multimeter durchgespielt und angepeilt,
wie lange es dauert bis ein Pin von High auf Low ist. Aber wie sicher
oder genau das letztlich mit dem Multimeter ist, weiß ich nicht und was
anderes habe ich nicht.
So hier nochmal bereinigt:
/////////////////// Arduino UNO:
// Pin 1 = CLR
// Pin 2 = A0
// Pin 3 = A1
// Pin 4 = D0
// Pin 5 = D1
// Pin 6 = D2
// Pin 7 = D3
// Pin 8 = D4
// Pin 9 = D5
// Pin 10 = D6
// Pin 11 = WR
// Pin 12 = BL
// Pin 5V = VDD
// Pin GND = GND
// Clear
int clr = 1;
// Write mode
int wr = 11;
// Display Blank
int bl = 12;
// Adress input
byte a[2];
// Data input
byte d[7];
/*
* Init display
*/
void setup() {
//Serial.begin(9600);
//Serial.println("DISPLAY");
// Reset RAM
pinMode(clr, OUTPUT);
digitalWrite(clr, 0);
delay(100);
digitalWrite(clr, 1);
// Display Ascii Mode
pinMode(bl, OUTPUT);
digitalWrite(bl, 1);
// Do not set to display mode (write to Character-Ram not allowed)
pinMode(wr, OUTPUT);
digitalWrite(wr, 1);
// Init pins D0-D6
for(int i = 0 ;i < 2; i++) {
a[i] = i + 2;
pinMode(a[i], OUTPUT);
digitalWrite(a[i], 0);
}
// Init pins A0-A2
for(int i = 0 ; i < 7; i++) {
d[i] = i + 4;
pinMode(d[i], OUTPUT);
digitalWrite(d[i], 0);
}
}
/*
* Run display output and prints in the first step A-D on the screen
* and after 5 sec the Characters E-H.
*/
void loop() {
// Print A-D
setDisplay(0x41, 0x42, 0x43, 0x44);
delay(5000);
// Print E-H
setDisplay(0x45, 0x46, 0x47, 0x48);
delay(5000);
}
/*
* Displays 4 characters on the HDLx
* @param c0 Character at position 1
* @param c1 Character at position 2
* @param c2 Character at position 3
* @param c3 Character at position 4
*/
void setDisplay(byte c0, byte c1, byte c2, byte c3) {
// From left
setChar(0x0, c0);
setChar(0x1, c1);
setChar(0x2, c2);
setChar(0x3, c3);
}
/*
* Print a single character at the index position
* @param pos Position of the display (Range 0-3)
* @param character The character that is displayed on the HDLx at a
given position
*/
void setCharAt(byte pos, byte character) {
//Serial.print(getBit(pos, 0));
//Serial.print(" ");
//Serial.println(getBit(pos, 1));
// Set character position
digitalWrite(a[0], getBitAtPos(pos, 0));
digitalWrite(a[1], getBitAtPos(pos, 1));
delay(500);
// Set to displays write mode
digitalWrite(wr,0);
// Set the character to the Character-RAM
for(int i = 0; i < 7; i++) {
//Serial.print(getBit(val, i));
//Serial.print(" ");
digitalWrite(d[i], getBitAtPos(character, i));
}
delay(5);
// Set Character-RAM to the display
digitalWrite(wr,1);
delay(500);
//Serial.println();
}
/*
* Returns a bit from a value of a given index.
* @param character displayed character.
* @param index Index position of the bit (Range 0-7)
*/
int getBitAtPos(byte character, int index) {
return (character >> index) & 1;
}
Du solltest auch noch schreiben, was Du mit /CE1 und /CE2 gemacht hast
...
Dann ist da auch noch ein großes Wirrwarr: SetChar und SetCharAt, der
ganze Debug-Code ...
CE1 und CE2 sind egal und können auf Low bleiben. Sie haben eigentlich
keinen Einfluß nach dem Datasheet. Zudem hatte ich das mit CE1 und CE2
bereits ausprobiert.
Also das Display ist nicht kaputt und funkt jetzt.
Der Fehler war, dass man C1, C2 und CUE auf Ground legen muß. Ich dachte
ich kann die einfach unbeschaltet lassen.
Hier der funktionierende Code:
1
/////////////////// Arduino UNO:
2
// Arduino = HDLx
3
// Pin 1 = CLR
4
// Pin 2 = A0
5
// Pin 3 = A1
6
// Pin 4 = D0
7
// Pin 5 = D1
8
// Pin 6 = D2
9
// Pin 7 = D3
10
// Pin 8 = D4
11
// Pin 9 = D5
12
// Pin 10 = D6
13
// Pin 11 = WR
14
// Pin 12 = BL
15
// Pin 5V = VDD
16
// Pin 5V = CU
17
// Pin GND = GND
18
// Pin C1 = GND
19
// Pin C2 = GND
20
// Pin CUE = GND
21
22
// Clear
23
intclr=1;
24
// Write mode
25
intwr=11;
26
// Display Blank
27
intbl=12;
28
// Adress input
29
bytea[2];
30
// Data input
31
byted[7];
32
33
/*
34
* Init display
35
*/
36
voidsetup(){
37
//Serial.begin(9600);
38
//Serial.println("DISPLAY");
39
40
// Reset RAM
41
pinMode(clr,OUTPUT);
42
digitalWrite(clr,0);
43
delay(100);
44
digitalWrite(clr,1);
45
46
// Display Ascii Mode
47
pinMode(bl,OUTPUT);
48
digitalWrite(bl,1);
49
50
// Do not set to display mode (write to Character-Ram not allowed)
51
pinMode(wr,OUTPUT);
52
digitalWrite(wr,1);
53
54
// Init pins D0-D6
55
for(inti=0;i<2;i++){
56
a[i]=i+2;
57
pinMode(a[i],OUTPUT);
58
digitalWrite(a[i],0);
59
}
60
61
// Init pins A0-A2
62
for(inti=0;i<7;i++){
63
d[i]=i+4;
64
pinMode(d[i],OUTPUT);
65
digitalWrite(d[i],0);
66
}
67
delay(10);
68
}
69
70
/*
71
* Run display output and prints in the first step A-D on the screen
72
* and after 5 sec the Characters E-H.
73
*/
74
voidloop(){
75
// Print A-D
76
setDisplay(0x41,0x42,0x43,0x44);
77
delay(5000);
78
79
// Print E-H
80
setDisplay(0x45,0x46,0x47,0x48);
81
delay(5000);
82
}
83
84
/*
85
* Displays 4 characters on the HDLx
86
* @param c3 Character at position 1
87
* @param c2 Character at position 2
88
* @param c1 Character at position 3
89
* @param c0 Character at position 4
90
*/
91
voidsetDisplay(bytec0,bytec1,bytec2,bytec3){
92
// Clean the display
93
//digitalWrite(clr,0);
94
//delay(1);
95
//digitalWrite(clr,1);
96
97
// From left
98
setCharAt(0x3,c0);
99
setCharAt(0x2,c1);
100
setCharAt(0x1,c2);
101
setCharAt(0x0,c3);
102
}
103
104
/*
105
* Print a single character at the index position
106
* @param pos Position of the display (Range 0-3)
107
* @param character The character that is displayed on the HDLx at a given position
108
*/
109
voidsetCharAt(bytepos,bytecharacter){
110
// Set character position
111
digitalWrite(a[0],getBitAtPos(pos,0));
112
digitalWrite(a[1],getBitAtPos(pos,1));
113
114
// Set to displays write mode
115
digitalWrite(wr,0);
116
117
// Set the character to the Character-RAM
118
for(inti=0;i<7;i++){
119
digitalWrite(d[i],getBitAtPos(character,i));
120
}
121
122
// Set Character-RAM to the display
123
digitalWrite(wr,1);
124
}
125
126
/*
127
* Returns a bit from a value of a given index.
128
* @param character displayed character.
129
* @param index Index position of the bit (Range 0-7)
Interessant. Ich hab zwar nicht vor, mir so ein Display zu kaufen, aber
manchmal läuft einem sowas auch zu, gewissermaßen. Da ist es gut zu
wissen, das es dafür schon funktionierenden Code gibt :-)
Hatte gestern interessenhalber mal gegoogelt, alerdings nur youtube
Filmchen, aber keinen Code gefunden.
Gruß Gerald