Forum: Mikrocontroller und Digitale Elektronik TM1650 und STM8


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

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 ?

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.