Forum: Mikrocontroller und Digitale Elektronik Pollin Touchpad MODEL TM1001A


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nervbold (Gast)


Lesenswert?

Hallo,
Pollin bietet sehr kostengünstig dieses Touchpad an: Touchpad mit 
Synaptics-Chip (T1001) und 8-poligem Flexprint-Anschluss. Maße (LxBxH): 
62x50x4,7 mm. Keine weiteren Daten verfügbar.

Hab mir mal eins bestellt und hab jetzt das Problem dass mir wirklich 
jegliche Daten fehlen.
Synaptics stellt solche Dinger her, die Seriennummer passt aber nicht 
besonders in die Reihe (das einzige wo passt ist TM für Touchpad-modul).

Hat das Ding mal wer angesteuert oder kann mir irgendwer sagen wo man 
dazu nen Datenblatt herkriegt?
über den Chip der da druff ist habbich rausgefundne dass es 4 Pins gibt: 
GND, VDD, und zwei Datenleitungen wovon eine über einen 
Pullupwiderstandauf VDD gezogen wird (vermutlich also ein 
Bidirektionaler Datenpin?).

Synaptics schreibt über die eigenen Touchpads dass sie über 
PS2/ADB/RS232 angesprochen werden (je nach model).
Da wäre meiner Meinung nach das passendste ADB aber da antwortet das 
Gerät nicht. Übehraupt sagt das Ding extrem wenig und tut überhaupt 
nichts:-P (nagut solls ja auch erst auf Abfrage).

Also es ist ein Chip von Synaptics druff aber der chip zur Kommunikation 
ist ein PIC16C58A (über den habe ich die Pinbelegung gemessen).

Auf der Platine ist nen Aufkleber:
TM1001AL 1. 4ALU1C PT51045VJ133E
(falls damit wer was anfangen kann).
Mir wäre schon extrem geholfn wenn mir wer sagen könnte wer das ding 
aufn markt geworfen hat.

Kann es sein dass das Ding über USB anzusteuern ist?
LG

von Klugscheiss (Gast)


Lesenswert?

Schon mal dran gedacht, dass das Teil eine PS2-Maus ersetzen könnte ? 
Und eine Forensuche mit 'Touchpad' wirkt auch Wunder ...

von Nervbold (Gast)


Lesenswert?

Jop dran gedacht habbich tatsächlich schon öfters habbich vergessen zu 
sagen hab das ding schon an nen uralt laptop angeschlossen das ding wird 
nicht erkannt.
Und die Forensuche hilft insofern Wunder dass man nix zu dem Touchpad 
findet das ich hier liegen habe (es sei denn jemand hat sich in der 
Nummer vertan).
Ich will nicht irgendein Touchpad ansteuern sondern genau dieses hier 
weil es schön billig ist^^
LG

von Klugscheiss (Gast)


Lesenswert?

Und alles schön auf dem Silbertablett serviert oder wie ?
Nun ja, wenn Du nicht in der Lage bist die hier reichlich vorhandenen 
Informationen abzugreifen solltest Du ein eine der Ecken des Touchpad 
ein Loch bohren, 'nen Bindfaden durchfriemeln (ACHTUNG! DURCHMESSER 
BEACHTEN!) und an den Autorückspiegel, soweit vorhanden, hängen.
Mann, mann, mann, Du fasst doch auch nicht an die Pole einer 9V-Batterie 
um festzustellen ob sie voll ist, oder ? Schon mal die beiden 
Datenleitung per Ozsi angeguckt, mit am Touchpad angeschlossenen 
Betriebsspannung versteht sich ?

von Nervbold (Gast)


Lesenswert?

Also erstmal: silbertablett ist nicht wie man ja sieht: ich habe etwa 6 
Stundne das halbe inet nach Datenblättern durchsucht. Weder für den 
Synaptics Chip fiundet man was sinnvolles noch in irgendeiner weise was 
über die existens dieses Touchpads (außer bei pollin).

Außerdem habe ich wie gesgat schon ne ganze Menge ausprobiert etc.

"Schon mal die beiden
Datenleitung per Ozsi angeguckt, mit am Touchpad angeschlossenen
Betriebsspannung versteht sich ?"
Nicht nötig; wie oben beschrieben tut das Ding von sich aus NICHTS!
Außerdem habbich kein Oszi....

Die Idee mit dem Loch ist aber auch nicht schlecht^^

von Nervbold (Gast)


Lesenswert?

Aso und gegen PS2 spricht doch eigentlich dass das Gerät nur einen 
Pullup hat. PS2 sieht so weit ich weiß an beiden Datenleitungen (data + 
clock) einen vor oder täusch ich mich?

von Klugscheiss (Gast)


Lesenswert?

Ja, nee, ist klar. Ich glaube das führt hier zu nichts. Letzter Tip: 
Lies' Dir noch mal meinen ersten Beitrag durch und beherzige diesen ggf.

von John S. (linux_80)


Lesenswert?

<SENF>
Ich hab noch ein T1002SU, mit etwas mehr drumrum, das schaut von der 
weite auch so aus wie das hier.
Das konnte ich mal rauspiepsen:
1
Verbindung auf Touchmodul zu PIC
2
1 Vdd
3
2   (U2 PIC Pin18 RA1)
4
3   (U2 PIC Pin17 RA0)
5
4 Taste R von Tastenmodul (Low aktiv)  (U1 Pin32)
6
5 Taste L (Low aktiv)  (U1 Pin31)
7
6 Vss/Gnd
8
7 ?, schaut nach nix aus ;)
9
8 ?
10
11
U1 = T1002, U2 = PIC16C58A-04

Und PS2 ist es nicht, denn ich hab das einfach mit den 2 Pins an nen 
alten PC gehängt, dann geht der PC nicht mehr, egal wie rum die beiden 
Pins verkabelt werden :/
Pins wackelten keine wenn man Spannung drauf gibt.
Der Anschluss zum Mainboard ist dann auch nur noch 6 polig.
</SENF>

von Nervbold (Gast)


Lesenswert?

Hallo,
vielen Dank für Deine Antwort!

2   (U2 PIC Pin18 RA1)
3   (U2 PIC Pin17 RA0)

Dies ist genau wie bei meinem. Am PIC sind RA0 und RA1 die Inputs.
Tastermodule hat meins nicht soweit ich weiß.
Hast Du eine Ahnung welcher Hersteller das ist?
LG

von John S. (linux_80)


Lesenswert?

Weiss ich nicht, hatte das Teil mal vom Flohmarkt mitgenommen, war schon 
aus dem Laptopgehäuse ausgesägt, incl. Tasten :)

von Nervbold (Gast)


Lesenswert?

Lol aus einer uralt Readme von Synaptics hab ich folgendes:
Improved support for older (model TM1001) TouchPad hardware.
Die Readme ist aus dem Jahre 1996:-) also scheint das ding tatsächlich 
ein Uraltes Modell von Synaptics zu sein...
Aber Datenblätter gabs damals wohl noch nicht schade:-P

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Eventuell mal die Firma freundlich anschreiben und ggf einen 
interessierten Studenten mimen.

von John S. (linux_80)


Lesenswert?

Auf den ICs an meinem Touch steht 9537.

von Benedikt K. (benedikt) (Moderator)


Lesenswert?

Ja, das Touchpad ist uralt, aber bei dem Preis ist das egal. Ich habe 
auch schon versucht das zum Laufen zu bekommen.
Es gibt 3 Leitungen die über 5,1k Pullups an 5V und über 51k zum PIC und 
zum ASIC gehen. Wenn man diese Leitungen auf Low zieht, beginnt der ASIC 
diese Leitungen wie wild zu toggeln. Am Ausgang kommt aber kaum was 
davon an, aufgrund des 51k Serienwiderstands. Daher tippe ich auf 
Tastereingänge für die Maustasten, die z.b. gemultiplexed mit dem ASIC 
geteilt werden.
Die beiden mit IO bezeichneten Pins gehen direkt an den PIC. Hier 
vermute ich PS2 oder sonst ein Interface. Diese Leitungen sind aber nur 
Tristate, hier tut sich nix, selbst wenn Pullups gegen 5V angeschlossen 
werden. Eigentlich hätte ich erwartet, dass das Touchpad direkt anfängt 
zu senden, so wie dies bei PS2 üblich ist.

Die Belegung die ich ermittelt habe:
1 5V
2 IO1
3 Key1
4 GND
5 Key2
6 IO2
7 Key3
8 GND

von Nervbold (Gast)


Lesenswert?

Hey,
bin ich ja doch nicht allein mit meinem Problem:-P
Also deine Pinbelegung entspricht der die ich rausgefundne habe wobei 
ich den 3 Tasterpins keine Bedeutung zugesprochen hatte (bisher).


Also in der uralt-readme stehen nur die Protokolle PS2/Seriell. Ich gehe 
mal davon aus dass dann das ADB rausfällt oder? kann sein dass synaptics 
die ADB's erst später rausgeworfen hat.

In der Datei ist auch von "Treibern" die Rede. brauchte man früher für 
PS/2 Treiber? (keine Ahnung wie das vor Urzeiten aussah).

LG

von Nervbold (Gast)


Lesenswert?

"kann sein dass synaptics die ADB's erst später rausgeworfen hat."
.. kann aber auch sein dass ich "auf dem Markt geworfen hat" gemeint 
hab:-P
LG

von Sebastian (Gast)


Lesenswert?

Sicher, daß es nicht PS/2 ist? Ich würde mir mal das (im Netz an 
diversen Stellen dokumentierte) Initialisierungsverhalten von 
PS/2-Mäusen anschauen.

von Benedikt K. (benedikt) (Moderator)


Lesenswert?

Sebastian schrieb:
> Sicher, daß es nicht PS/2 ist?

Ich bin ziemlich sicher, dass die beiden Pins die ich als IO bezeichnet 
habe, kein normales PS2 sein (es könnte natürlich auch sein, dass meine 
Anschlussbelegung komplett falsch ist...)

> Ich würde mir mal das (im Netz an
> diversen Stellen dokumentierte) Initialisierungsverhalten von
> PS/2-Mäusen anschauen.

z.B hier:
http://www.computer-engineering.org/ps2mouse/

Bei allen Beschreibungen die ich gesehen habe, muss sich die Maus zuerst 
melden, so wie auch in dem Beispiel auf obiger Seite:

Mouse: AA  Self-test passed
Mouse: 00  Mouse ID

Genau das sendet z.B. auch die Maus die ich wegen dem PS2 Kabel 
geschlachtet habe.
Das Touchpad macht dagegen nach dem Einschalten rein gar nichts und 
funktioniert natürlich auch nicht am PC.

von Sebastian (Gast)


Lesenswert?

Stimmt. "The device always generates the clock signal." Ich hatte das 
falsch in Erinnerung. Aber vielleicht verhält sich ein "Kombigerät" 
(RS232 und PS/2) anders, zumindest bis das benutzte Interface erkannt 
wurde?

von Benedikt K. (benedikt) (Moderator)


Lesenswert?

Ich habe keine Ahnung woran das Kombigerät den Unterschied erkennt, denn 
in beiden Fällen müsste die Maus sich zuerst melden (bei PS2 mit dem 
0xAA, bei der COM Port Maus mit einem 'M').
Da es 3 gleiche Eingänge gibt (mit je einem 5,1k Pullup und einem 51k 
Serienwiderstand), (und eine 3 Tasten Maus zur damaligen Zeit bei 
Touchpads eher wenig Sinn macht), könnte einer davon CTS oder sowas 
sein, was normalerweise bei einer RS232 Maus als Spannungsversorgung 
benutzt wird. Diese Leitung wurde vom Treiber auf Low gezogen (da RS232 
invertiert ist und die Leitung dann auf +12V liegen würde). Allerdings 
habe ich eigentlich schon alles durchprobiert, leider erfolglos.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Lesenswert?

Hmm. ADB scheint es dann wohl nicht zu sein, das hat nur eine 
kombinierte Takt- und Datenleitung. Und ein Mac-Touchpad hat nur eine 
Taste. Also ein Eingang zu viel.

von Mitbastler (Gast)


Lesenswert?


von Benedikt K. (benedikt) (Moderator)


Lesenswert?

Beides ist leider schon bekannt.
Das Problem ist, dass das Touchpad derart alt ist. Der erste Link 
beschreibt die 4er Generation der ASICs (die glaube ich noch aktuell 
ist), das älteste was in der Datei von Synaptics auftaucht ist der T1002 
ASIC. Auf dem Pollin Touchpad ist der Vorgänger davon, der T1001 
verbaut.
Die Belegung im Datenblatt hat sich zwischen 1001 und 1002 leider 
geändert.
Die Pins von dem PIC die bei der 1002er Version verwendet werden, sind 
Pin 17 und 18. Das sind auch die Pins die ich bei dem 1001er als IO 
bezeichnet habe.

In der PDF steht "Second Edition". Die First Edition könnte eventuell 
die gesuchten Infos beinhalten...

von Benedikt K. (benedikt) (Moderator)


Lesenswert?

Ich habe gerade mal das TM1002 Touchpad rausgekramt und angeschlossen: 
Das läuft wunderbar an PS2.
Bei dem sind Pin 18 vom PIC PS2 DATA und Pin 17 PS2 CLOCK.
Für das TM1001 würde das also bedeuten Pin 6 wäre DATA und Pin 2 wäre 
CLOCK.

von Fabian S. (jacky2k)


Lesenswert?

Hallo,
habe das Gerät heute auch von Pollin bekommen. Habe dann im Netz das 
hier gefunden:
The Combo TouchPad module should be wired to a DB-9 female connector; 
the signals TxD, RxD, DTR, RTS, CTS, and GND should be wired between the 
two connectors as indicated in Figures 4-1 and 4-2. To support 
plug-and-play, DTR and DSR should be wired together on the connector. 
The DB-9 connector can be plugged directly into a computer’s RS-232 port 
for Serial TouchPad operation. (Note that the CTS pin must be wired from 
pin 8 of the DB-9 connector to pin 7 of the module connector, even 
though the CTS signal is marked “not used” in Figure 4-1. The CTS wire 
will be unused when operating in Serial mode but it is needed to supply 
power in PS/2 mode.)

Die Pinbelegungen kommen zwar nicht hin, aber hilft das evtl dennoch 
weiter?
Das ganze kommt von hier: 
http://www.aquaphoenix.com/hardware/ledlamp/reference/synaptics_touchpad_interfacing_guide.pdf

von Fabian S. (jacky2k)


Angehängte Dateien:

Lesenswert?

Ich habe grade eine interessante Entdeckung gemacht, kann sie allerdings 
nicht zuordnen :)
Und zwar habe ich GND und Vdd angeschlossen, alle anderen Pins NC 
gelassen.
Jetzt kann ich mitdem Ossi an Pin 3, 5 und 7 (sprich den angeblichen 
KeyX Pins) ein digitales Signal sehen. Es ist zwar sehr schwach 
(schwankt um ca. 0.5V bei 5V rum). Interessant ist, dass sich das Signal 
verändert wenn ich meinen Finger auf das Feld lege. Und es nimmt 
nochmals eine andere Form an, wenn ich ihn bewege. Die Veränderun ist 
allerdings nur minimal.
Hat das vorher schon mal jemand gesehen?
Der rot markierte Pegel geht dann auch auf den niedrigen Wert wenn ich 
mein Finger drauf lege, wenn ich ihn bewege wird der Ausschlag wieder 
etwas breiter, aber immernoch kleiner als der da jetzt.
Edit: noch was: wenn ich Pin2 mit nem 10k gegen GND ziehe höhrt das 
Signal auf!

von Benedikt K. (benedikt) (Moderator)


Lesenswert?

Fabian S. schrieb:

> Hat das vorher schon mal jemand gesehen?

Ja, das liegt daran, dass sich die Eingänge wohl Leitungen mit dem ASIC 
Teilen. Da aber die weiter oben beschriebene 5,1k Pullup - 51k 
Serienwiderstand Kombination zwischen den Leitungen und dem PIC/ASIC 
liegen. Daher meine Vermutung dass diese Eingänge sind für die Taster: 
Ist der ASIC auf Tristate, wird der Maustaster eingelesen, ansonsten die 
Signale vom ASIC. Das würde auch einigermaßen Sinn machen.
Ähnliche Signale findet man übrigens an den meisten anderen Pins die vom 
ASIC zum PIC gehen.
Auch interessant: Die Signale an den Leitungen die zum Touchfeld gehen. 
Da sieht man an den Flanken deutlich wenn man mit dem Finger drüber 
fährt.

von Fabian S. (jacky2k)


Lesenswert?

Klingt logsich. Aber warum hörts auf, wenn ich Pin 2 auf GND ziehe?

von Helmchen74 (Gast)


Lesenswert?

Hi Nervbold,
habe evtl. einen interessanten Link gefunden - allerdings nur grob 
überflogen, sind m.E. aber die Informationen für dich drin:

http://www.aquaphoenix.com/hardware/ledlamp/reference/synaptics_touchpad_interfacing_guide.pdf

Viel Erfolg,
Helmchen74

von Maxwell (Gast)


Lesenswert?

Hallo,

das Datenblatt vom Helmchen74 sieht ja ganz interessant aus.
Hat hier schon jemand das Touchpad erfolgreich in Betrieb genommen ?
Bei den Preis kann man ja echt nicht widerstehen.
Überlege mir das Teil in Verbindung mit einer programmierbaren Logik zu 
verwenden.

LG

Maxwell

von Franky (Gast)


Lesenswert?

Hallo zusammen,
falls noch jemand Interesse hat. Ich hab mich mit dem Touchpad mal über 
den Jahreswechsel beschäftigt und es an einem AT90S2313 zum Laufen 
gebracht. Das TP wird mit dem "Apple Desktop Bus" (ADP) Protokoll 
angesteuert.

Hier die Pinbelegung:
1 5V
2 ADB
3 ?
4 GND
5 ?
6 ?
7 BUTTON 1 / nach Masse schalten
8 GND

Weitere Info's gibt es hier:
http://www.snark.de/mac/tpad/
http://developer.apple.com/legacy/mac/library/technotes/hw/hw_01.html


Falls jemand tiefer einsteigen möchte.
Das TP läuft standardmäsig im normalen Mausmodus. Interessanter ist 
allerding der Absolutmodus. Dort kann die Position des Fingers in X und 
Y Richtung und die abgedeckte Fläche (ein, zwei oder drei Finger) 
abgefragt werden.
Das TP lässt sich durch folgende Operationen in diesen Modus schalten:

ADP Register 3
Byte 1 auf 0x63
Byte 2 auf 0x04

ADP Register 1
Byte 7 auf 0x00

Hab mir gleich mal 10 TP's bestellt, falls das Echo den Lagerbestand von 
Pollin übersteigt ;-).

Gruß
Frank

von Klaus R. (klaus2)


Lesenswert?

Sehr gut Franky - jetzt muss ich die 3 Dinger doch mal wieder 
rauskramen, die ich mal "vorsichtshalber" bestellt hab :)

Wird es da deinerseits codetechnisch eine "Orientierungshilfe" geben? :)

Klaus.

von Franky (Gast)


Lesenswert?

Hallo Klaus,
hier der Teil, der für das Auslesen und Schreiben der ADB Regsiter 
zuständig ist. Hab das nur mal auf die schnelle geschrieben, deshalb 
nicht sehr gut kommentiert. Hoffe du kommst damit klar. 
"BITS(XXXX,XXXX)" ist bei mir ein Makro. Kannst die Werte ja in HEX 
eingeben.
1
#define ADB_BIT 1<<PB0  // ADB
2
#define ADB_PIN PINB 
3
#define ADB_POUT PORTB 
4
#define ADB_PDIR DDRB
5
6
// ADB Befehle
7
#define COM_TALK0 BITS(0011,1100) //Adresse 3, Talk, Register0
8
#define COM_TALK1 BITS(0011,1101) //Adresse 3, Talk, Register1
9
#define COM_LISTEN1 BITS(0011,1001) //Adresse 3, Listen, Register1
10
#define COM_TALK2 BITS(0011,1110) //Adresse 3, Talk, Register2
11
#define COM_TALK3 BITS(0011,1111) //Adresse 3, Talk, Register3
12
#define COM_LISTEN3 BITS(0011,1011) //Adresse 3, Listen, Register3
13
14
// Register auslesen / schreiben
15
u08 adb(u08 command){
16
  u08 bitpos;
17
  u08 z_byte;
18
  u08 anzahl_out;
19
  //Teilerwerte TC0     
20
  #define ADB_VORTEILER_A TIMER_VT_64
21
  #define ADB_VORTEILER_A_BIT TIMER_VT_64_B
22
  #define ADB_VORTEILER_B TIMER_VT_8
23
  #define ADB_VORTEILER_B_BIT TIMER_VT_8_B
24
  #define ADB_IMPULS_LANG TAKT/ADB_VORTEILER_B*65/1000000
25
  #define ADB_IMPULS_KURZ TAKT/ADB_VORTEILER_B*35/1000000
26
  #define ADB_IMPULS_ATT TAKT/ADB_VORTEILER_A*800/1000000
27
  #define ADB_IMPULS_SYNC TAKT/ADB_VORTEILER_B*70/1000000
28
  #define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_B*250/1000000
29
  #define ADB_IMPULS_PAUSE TAKT/ADB_VORTEILER_B*200/1000000
30
31
  ADB_PDIR |= ADB_BIT; // Ausgang 0
32
  ADB_POUT &= ~ADB_BIT; 
33
  
34
  ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
35
  ADB_POUT |= ADB_BIT; 
36
37
  //Attention Signal
38
  TCCR0 = ADB_VORTEILER_A_BIT;    
39
  TCNT0 = 0; // Zähler auf null setzen  
40
  ADB_PDIR |= ADB_BIT; // Ausgang 0
41
  ADB_POUT &= ~ADB_BIT; 
42
  while (TCNT0 < ADB_IMPULS_ATT);
43
44
  //Sync Impuls
45
  TCCR0 = ADB_VORTEILER_B_BIT;    
46
  TCNT0 = 0; // Zähler auf null setzen  
47
  ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
48
  ADB_POUT |= ADB_BIT; 
49
  while (TCNT0 < ADB_IMPULS_SYNC);
50
51
  for(bitpos=128;bitpos;bitpos>>=1){  //Command ausgeben
52
    TCNT0 = 0;
53
    ADB_PDIR |= ADB_BIT; // Ausgang 0
54
    ADB_POUT &= ~ADB_BIT; 
55
    if(command&bitpos) 
56
      while (TCNT0 < ADB_IMPULS_KURZ);
57
    else 
58
      while (TCNT0 < ADB_IMPULS_LANG);
59
    ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
60
    ADB_POUT |= ADB_BIT; 
61
    while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
62
  }
63
  // STOP BIT (0)
64
  TCNT0 = 0;
65
  ADB_PDIR |= ADB_BIT; // Ausgang 0
66
  ADB_POUT &= ~ADB_BIT; 
67
  while (TCNT0 < ADB_IMPULS_LANG);
68
  ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
69
  ADB_POUT |= ADB_BIT; 
70
  while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
71
72
  
73
  anzahl_out = 0;
74
  if(command == COM_LISTEN3)
75
    anzahl_out = 2;
76
  else if(command == COM_LISTEN1)
77
    anzahl_out = 8;
78
    
79
  if(anzahl_out){
80
    TCNT0 = 0;
81
    while (TCNT0 < ADB_IMPULS_PAUSE);
82
83
    // START BIT (1)
84
    TCNT0 = 0;
85
    ADB_PDIR |= ADB_BIT; // Ausgang 0
86
    ADB_POUT &= ~ADB_BIT; 
87
    while (TCNT0 < ADB_IMPULS_KURZ);
88
    ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
89
    ADB_POUT |= ADB_BIT; 
90
    while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
91
92
    for(z_byte=0;z_byte<anzahl_out;z_byte++){
93
      for(bitpos=128;bitpos;bitpos>>=1){  //Daten ausgeben
94
        TCNT0 = 0;
95
        ADB_PDIR |= ADB_BIT; // Ausgang 0
96
        ADB_POUT &= ~ADB_BIT; 
97
        if(adb_werte[z_byte]&bitpos) 
98
          while (TCNT0 < ADB_IMPULS_KURZ);
99
        else 
100
          while (TCNT0 < ADB_IMPULS_LANG);
101
        ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
102
        ADB_POUT |= ADB_BIT; 
103
        while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
104
      }
105
    }
106
    // STOP BIT (0)
107
    TCNT0 = 0;
108
    ADB_PDIR |= ADB_BIT; // Ausgang 0
109
    ADB_POUT &= ~ADB_BIT; 
110
    while (TCNT0 < ADB_IMPULS_LANG);
111
    ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
112
    ADB_POUT |= ADB_BIT; 
113
    while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
114
  }
115
  else{
116
    // Warten auf Daten sonst Abbruch
117
    TCNT0 = 0;
118
    do{  
119
      if(TCNT0 > ADB_IMPULS_TLT){
120
        return(0);
121
      }
122
    }while(ADB_PIN & ADB_BIT);
123
    while(!(ADB_PIN & ADB_BIT)); // Start Bit
124
    z_byte = 0;
125
    while(z_byte < 8){
126
      adb_werte[z_byte] = 0;
127
      for(bitpos=128;bitpos;bitpos>>=1){  //Bits einlesen
128
        TCNT0 = 0;
129
        // Abbruch wenn keine weiteren Bytes übertragen werden.
130
        do{ 
131
          if(TCNT0 > ADB_IMPULS_KURZ+ADB_IMPULS_LANG){
132
            return(z_byte);
133
          }
134
        }while(ADB_PIN & ADB_BIT);
135
        TCNT0 = 0;
136
        while(!(ADB_PIN & ADB_BIT));
137
        if(TCNT0 < (ADB_IMPULS_KURZ+ADB_IMPULS_LANG)/2)
138
          adb_werte[z_byte] += bitpos;
139
      }
140
      z_byte++;
141
    }
142
  }
143
  return(z_byte);
144
}

von Klaus R. (klaus2)


Lesenswert?

Das sieht gut aus, vielen Dank - muss ich nur noch das gut versteckte 
Touchpadtütchen wiederfinden! :)

Aber ich geh lieber erstmal rodeln...

Klaus.

von Hauke (Gast)


Lesenswert?

Hallo Franky,
Ich finds super, dass du deinen Sourcode mit uns teilst, allerdings muss 
ich sagen, hab ich da noch nicht so viel von verstanden :-(
Das liegt mit Sicherheit gröstenteils daran, dass ich von der Materie 
noch nicht so viel Ahnung hab, deswegen hab ich ein paar konkrete 
Fragen, zu deinem Code:

Ist das eine Funktionsdefinition? Eine Headerdatei? z_byte wird 
zurückgegeben, aber was genau steht da drin?
Ich geb zu ich bin ein Noob, besonders was ADB angeht, aber wie genau 
muss ich vorgehen, wenn ich das Pollin touchpad mit einem Avr auslesen 
möchte?

Ich bin für jede hilfe dankbar...
hauke

von Klaus R. (klaus2)


Lesenswert?

Hast du schonmal I2C am AVR genutzt?

Klaus.

von Frank H. (franky1969)


Lesenswert?

Hallo zusammen,
freut mich dass es doch noch ein paar Mitstreiter gibt. Habe den Code 
nochmals überarbeitet und gekürzt. Hoffe Ihr kommt klar damit. Es wird 
nur ein Standardport benutzt der zwischen Ausgang und Eingang mit Pull 
Up umgeschaltet wird. Mit I2C hab ich noch keine Erfahrungen. wird aber, 
denke ich, nicht funktionieren da das Protokoll mit verschiedenen 
Pulsweiten arbeitet und nur eine bidirektionale Leitung verwendet wird.

Viel Spaß damit
Frank
1
#define TAKT 7372800  //Quarzfrequenz
2
3
//Vorteiler Timer 0 und 1 bei 2313, 8515, Mega8 (nicht Timer 2)
4
#define TIMER_VT_1_B BITS(0000,0001)  
5
#define TIMER_VT_8_B BITS(0000,0010)  
6
#define TIMER_VT_64_B BITS(0000,0011)
7
#define TIMER_VT_256_B BITS(0000,0100)
8
#define TIMER_VT_1024_B BITS(0000,0101)
9
10
#define TIMER_VT_1 1  
11
#define TIMER_VT_8 8  
12
#define TIMER_VT_64 64
13
#define TIMER_VT_256 256
14
#define TIMER_VT_1024 1024
15
16
// PORT B
17
#define ADB_BIT 1<<PB0  // ADB
18
#define ADB_PIN PINB 
19
#define ADB_POUT PORTB 
20
#define ADB_PDIR DDRB
21
22
typedef unsigned char  u08;
23
typedef unsigned short int u16;
24
25
26
// Eingänge
27
ADB_PDIR &= ~ADB_BIT;
28
29
// Pull Up einschalten
30
ADB_POUT |= ADB_BIT;
31
  
32
33
#define COM_TALK0 BITS(0011,1100) //Adresse 3, Talk, Register0
34
#define COM_TALK1 BITS(0011,1101) //Adresse 3, Talk, Register1
35
#define COM_LISTEN1 BITS(0011,1001) //Adresse 3, Listen, Register1
36
#define COM_TALK2 BITS(0011,1110) //Adresse 3, Talk, Register2
37
#define COM_TALK3 BITS(0011,1111) //Adresse 3, Talk, Register3
38
#define COM_LISTEN3 BITS(0011,1011) //Adresse 3, Listen, Register3
39
40
#define MAX_ADB 9
41
u08 adb_werte[MAX_ADB];
42
43
44
// ADB Register auslesen / schreiben 
45
// Rückgabe Anzahl der Empfangenen Daten 
46
// Befehl in adb_werte[0]. Empfangene bzw. zu sendende Daten in adb_werte[1 bis 8]
47
u08 adb(void){
48
  u08 bitpos;
49
  u08 z_byte;
50
  u08 anzahl_out;
51
  //Teilerwerte TC0     
52
  #define ADB_VORTEILER_A TIMER_VT_64
53
  #define ADB_VORTEILER_A_BIT TIMER_VT_64_B
54
  #define ADB_VORTEILER_B TIMER_VT_8
55
  #define ADB_VORTEILER_B_BIT TIMER_VT_8_B
56
  #define ADB_IMPULS_LANG TAKT/ADB_VORTEILER_B*65/1000000
57
  #define ADB_IMPULS_KURZ TAKT/ADB_VORTEILER_B*35/1000000
58
  #define ADB_IMPULS_ATT TAKT/ADB_VORTEILER_A*570/1000000
59
  #define ADB_IMPULS_SYNC TAKT/ADB_VORTEILER_B*70/1000000
60
  #define ADB_IMPULS_TLT TAKT/ADB_VORTEILER_B*250/1000000
61
  #define ADB_IMPULS_PAUSE TAKT/ADB_VORTEILER_B*200/1000000
62
63
  //Attention Signal
64
  TCCR0 = ADB_VORTEILER_A_BIT;    
65
  TCNT0 = 0; // Zähler auf null setzen  
66
  ADB_PDIR |= ADB_BIT; // Ausgang 0
67
  ADB_POUT &= ~ADB_BIT; 
68
  while (TCNT0 < ADB_IMPULS_ATT);
69
70
  TCCR0 = ADB_VORTEILER_B_BIT;    
71
  
72
  anzahl_out = 1; // Mindestens Befehl übertragen
73
  z_byte = 0;
74
  do{
75
    // START BIT (1)
76
    TCNT0 = 0;
77
    ADB_PDIR |= ADB_BIT; // Ausgang 0
78
    ADB_POUT &= ~ADB_BIT; 
79
    while (TCNT0 < ADB_IMPULS_KURZ);
80
    ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
81
    ADB_POUT |= ADB_BIT; 
82
    while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
83
84
    for(;z_byte<anzahl_out;z_byte++){
85
      for(bitpos=128;bitpos;bitpos>>=1){  //Daten ausgeben
86
        TCNT0 = 0;
87
        ADB_PDIR |= ADB_BIT; // Ausgang 0
88
        ADB_POUT &= ~ADB_BIT; 
89
        if(adb_werte[z_byte]&bitpos) 
90
          while (TCNT0 < ADB_IMPULS_KURZ);
91
        else 
92
          while (TCNT0 < ADB_IMPULS_LANG);
93
        ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
94
        ADB_POUT |= ADB_BIT; 
95
        while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
96
      }
97
    }
98
    // STOP BIT (0)
99
    TCNT0 = 0;
100
    ADB_PDIR |= ADB_BIT; // Ausgang 0
101
    ADB_POUT &= ~ADB_BIT; 
102
    while (TCNT0 < ADB_IMPULS_LANG);
103
    ADB_PDIR &= ~ADB_BIT; // Eingang über Pullup
104
    ADB_POUT |= ADB_BIT; 
105
    while (TCNT0 < ADB_IMPULS_KURZ+ADB_IMPULS_LANG);
106
107
    // Entscheidung, ob noch weitere Daten übertragen werden
108
    if(adb_werte[0] == COM_LISTEN3)
109
      anzahl_out = 2+1;
110
    else if(adb_werte[0] == COM_LISTEN1)
111
      anzahl_out = 8+1;
112
    else
113
      z_byte = 8;
114
  }while(z_byte < 2);
115
116
  // Warten auf Rückgabewerte sonst Abbruch
117
  TCNT0 = 0;
118
  do{  
119
    if(TCNT0 > ADB_IMPULS_TLT){
120
      return(0);
121
    }
122
  }while(ADB_PIN & ADB_BIT);
123
  while(!(ADB_PIN & ADB_BIT)); // Start Bit
124
125
  z_byte = 1; 
126
  while(z_byte < MAX_ADB){
127
    adb_werte[z_byte] = 0;
128
    for(bitpos=128;bitpos;bitpos>>=1){  //Bits einlesen
129
      TCNT0 = 0;
130
      // Abbruch wenn keine weiteren Bytes übertragen werden.
131
      do{ 
132
        if(TCNT0 > ADB_IMPULS_KURZ+ADB_IMPULS_LANG){
133
          return(z_byte-1);
134
        }
135
      }while(ADB_PIN & ADB_BIT);
136
      TCNT0 = 0;
137
      while(!(ADB_PIN & ADB_BIT));
138
      if(TCNT0 < (ADB_IMPULS_KURZ+ADB_IMPULS_LANG)/2)
139
        adb_werte[z_byte] += bitpos;
140
    }
141
    z_byte++;
142
  }
143
  return(z_byte-1);
144
}
145
146
147
148
int main(void) {
149
  // Auf Absolutmodus umschalten
150
  adb_werte[0] = COM_LISTEN3;
151
  adb_werte[1] = BITS(0110,0011);
152
  adb_werte[2] = 4; //CDM Modus
153
  adb();
154
  
155
  adb_werte[0] = COM_TALK1;
156
  adb(); // Werte holen
157
158
  adb_werte[0] = COM_LISTEN1;
159
  adb_werte[7] = 0x00; //Absolutmodus
160
  adb();
161
  
162
  // Register 0 auslesen 
163
  adb_werte[0] = COM_TALK0;
164
  adb();
165
      
166
}

von Klaus R. (klaus2)


Lesenswert?

Ich sags mal so: Kuul!

Klaus.

von Bingo (Gast)


Lesenswert?

Hier einer version von die

//Bits Makro
#define BITS(H,L)  (0b##H ##L)


Und diser als comment
// Eingänge
ADB_PDIR &= ~ADB_BIT;

// Pull Up einschalten
ADB_POUT |= ADB_BIT

// Eingänge
// ADB_PDIR &= ~ADB_BIT;

// Pull Up einschalten
// ADB_POUT |= ADB_BIT

Dann gehts ohne fehler

mfg
Bingo Dänemark

von Michael W. (acidbourbon)


Angehängte Dateien:

Lesenswert?

Hi Leute, danke für die gute Vorarbeit,
damit meine ich natürlich die ganze Datenblatt-Recherche
sowie vor Allem die ausgezeichnete Arbeit von Franky.

Ich hab Frankys Code mal ein wenig modifiziert, so dass er auch auf 
ATMegas mit mehr als 7KommaEppes MHz läuft.

Im Anhang mal Quelldaten und Hex von einem niedlichen Demoprojekt was 
das TM1001A Touchpad für jeden AVR-Anfänger zu Plug-And-Play-Hardware 
machen sollte.

Liebe Grüße

Micha

@Franky: Ich hoffe du bist einverstanden, dass ich deinen Code benutzt 
habe

von Michael W. (acidbourbon)


Angehängte Dateien:

Lesenswert?

Btw: man muss sich keinen Stress machen die Litzen an den FPC-Connector 
zu löten, das ist viel zu fuddelig. Auf der Platine sind noch lauter 
Testpads über die man auch an die gewünschten Leitungen kommt. Siehe 
Foto im Anhang.

Gruß

Micha

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.