Vorneweg: Ich habe nur ein Datasheet, welches mittels Google-Translator
aus dem chinesischen übersetzt worden ist ( siehe Nachbarthread
Beitrag "Re: Datasheet TM1650" ).
Wie fast schon erwartet ist das mal wieder dort eine "schwere Geburt" wo
ich sie nicht erwartet hätte.
Ich steuere den TM1650 über einen STM8S103 und mittels Bitbanging an.
Erster Fallstrick war, dass im Gegensatz zu dem auch von mir verwendeten
TM1637 die serielle Kommunikation bei der seriellen Übertragung mit MSB
zuerst erfolgt.
Ein weiterer Fallstrick war, dass im Datasheet nirgendwo etwas davon
steht, dass SDA und SCL einen Pull-Up Widerstand benötigen (die habe ich
nun auch).
Das Ansteuern der 7-Segmentanzeige funktioniert nun auch. Leider konnte
ich nicht, wie ich das bspw. bei einem I2C System SDA steuern in dem
eine logische 1 dadurch angelegt wird, dass ich den I/O Pin auf Eingang
stelle (und somit eine logische 1 über den Pull-Up Widerstand generiert
wird), sondern muß beim Anfahren beide I/O Pins als Ausgang
konfigurieren.
Wie gesagt, LED-Ansteuerung klappt wie sie soll.
Allerdings habe ich jetzt ein Problem beim Auslesen angeschlossener
Tasten: Ich kann zwar Scancodes eindeutig den Tasten zuordnen, aber die
Scancodes sind nicht die, die im Datasheet angegeben sind (siehe
Bildanhang). Von daher gehe ich davon aus dass wohl etwas falsch läuft.
Zudem macht der Chip in Verbindung mit meiner (wohl fehlerhaften)
Funktion etwas merkwürdiges:
Bei einer gedrückten Taste liefert der Chip bspw. 0x91. Wird die Taste
losgelassen wird bei einem erneuten Lesen der Scancode 0x90 geliefert.
Bei einer anderen Taste bei gedrückter Taste 0x93 und danach dauerhaft
0x92 geliefert, etc.
Bei jeder Taste die gedrückt wird ist danach der Scancode genau der Wert
der vormals gedrückten Taste -1.
Jetzt habe ich versucht (auch entgegen dem Datasheet) mit verschiedenen
Kombinationen von Start- und Stop-Conditions sowie mit Acknowledge zu
"spielen" jedoch immer mit demselben Ergebnis. Entweder kann man gar
nichts lesen (0xFF), manchmal hängt der TM1650 sich auf oder eben mit
oben beschriebenem Verhalten.
1 | uint8_t tm1650_readkey(void)
|
2 | {
|
3 | uint8_t data;
|
4 | uint8_t i;
|
5 |
|
6 | data= 0;
|
7 |
|
8 | sda_input_init();
|
9 |
|
10 | for(i= 0; i< 8; i++)
|
11 | {
|
12 |
|
13 | scl_clr();
|
14 | puls_len();
|
15 |
|
16 | if(is_sda()) data|= (1 << i);
|
17 |
|
18 | scl_set();
|
19 | puls_len();
|
20 |
|
21 | }
|
22 |
|
23 | scl_set();
|
24 | puls_len();
|
25 | scl_clr();
|
26 | puls_len(); // Zeit fuer den Acknowledge
|
27 | sda_init();
|
28 |
|
29 | return data;
|
30 | }
|
31 | .
|
32 | .
|
33 | .
|
34 | uint8_t k;
|
35 |
|
36 | while(1)
|
37 | {
|
38 | tm1650_start();
|
39 | tm1650_write(0x49);
|
40 | tm1650_stop();
|
41 | tm1650_start();
|
42 | k= tm1650_readkey();
|
43 | tm1650_stop();
|
44 | tm1650_sethex(k);
|
45 | delay(50);
|
46 | }
|
47 |
|
48 | Die gelieferten Scancodes der Tasten sind mit dieser Funktion:
|
49 |
|
50 | 0x91 0x93 0x95 0x97 0x9b 0x9d
|
51 | 0xb1 0xb3 0xb5 0xb7 0xbb 0xbd
|
52 | 0xd1 0xd3 0xd5 0xd7 0xdb 0xdd
|
53 | 0xf1 0xf3 0xf5 0xf7 0xfb 0xfd
|
54 |
|
55 | Beholfen habe ich mich mit dieser Kruecke hier, aber das gefaellt mir nicht
|
56 | wirklich (da ich wie gesagt, gerne die Scancodes aus dem Datasheet haben
|
57 | moechte):
|
58 |
|
59 | if (data & 1)
|
60 | {
|
61 | hin= ((data >> 5) & 0x3)+1;
|
62 | hin= (hin << 4);
|
63 | lon= ((data & 0x0f) >> 1)+1;
|
64 | data= hin | lon;
|
65 | }
|
66 | else { data= 0; }
|
67 |
|
68 | Liefert Scancodes dann von 0x11..0x16, 0x21..0x26 etc.
|
Funktionen für _start, _stop, _write funktionieren Augenscheinlich, weil
ich das zum einen mit dem LA überprüft habe und und zum Anderen die
Ausgabe auf der 7-Segmentanzeige ja funktioniert. Ebenso zeigt _sethex
genau das an, was es anzeigen soll (füttert man zuvor Variable k mit
einem konstanten Wert, wird dieser auch korrekt angezeigt).
Natürlich "könnte" ich für das, was ich machen will, auch mit dem oben
beschriebenen Verhalten leben, allerdings würde ich zum einen gerne
wissen was da falsch ist und zum anderen habe ich die Befürchtung, wenn
ich einen TM1650 Chip aus einer anderen Charge einsetze, dieser dann
wieder ein anderes Verhalten zeigt.
Vergleiche ich meine Funktion bspw. mit einer aus os.mbed.com, dann habe
ich dort dieselben Abläufe.
Hat jemand den TM1650 schon selbst eingesetzt und hierbei nicht einfach
nur eine Arduino-Library eingebunden und verwendet und kann mir sagen,
wie man zu den im Datasheet angegebenen Scancodes kommt ?