Forum: Mikrocontroller und Digitale Elektronik Maussensor ADNS2610


von Sahra N. (sahra_nana)


Lesenswert?

hallo,
ich habe das Programm von dieser 
Quelle(http://www.rn-wissen.de/index.php/Maussensor) gefunden und wöllte 
ich es an mein geschlachtete Maus anpassen, in dem Code steht über 
PAN3101 und ich habe ein Maussensor vom Typ(ADNS2610), meine Frage ist: 
ich möchte den Sensor an einem Atmega88 anschliessen, soll ich die Pins 
3(SDIO)-----an--------> PC4(SDA) und 4(SCK)-------an--------->PC5(SCL) 
anschliessen, oder ist es beliebig, 2 Frage muss man irgend ein Register 
im Code anpassen, oder passt das Programm auch zu ADNS2610, weil in dem 
Code steht ein Register(0x16), und der habe nicht im Datenblatt 
gefunden. bitte um Eure Hilfe.
danke im Voraus

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sahra Nana schrieb:
> soll ich die Pins 3(SDIO)-----an--------> PC4(SDA) und
> 4(SCK)-------an--------->PC5(SCL)
> anschliessen, oder ist es beliebig
Es ist egal, weil die Schnittstelle sowieso per Software abgebildet 
wird.

> oder passt das Programm auch zu ADNS2610, weil in dem Code steht
> ein Register(0x16), und der habe nicht im Datenblatt gefunden.
Was tut das Register? Ist seine Verwendung/Initialisierung nötig?
Passen alle anderen Register?

DENKEN kostet nichts und das Ergebnis ist LERNEN...  :-/

von Rofe (Gast)


Lesenswert?

Hallo und viel Erfolg

Also das Register 0x16 ist das für den Motion_Status, also ob sich die 
Maus bewegt hat und dann musst du halt in deinem Datenblatt (Seite 18 
ff.) schauen, welches es bei dir ist. Dieses scheint mir aber nicht 
zwingend notwendig, da hiermit nur herausgefunden wird OB sich die Maus 
bewegt und nicht wohin. Weitere Register, die du noch ändern musst, sind 
DeltaX (0x17) und DeltaY (0x18) in die jeweiligen DeltaX (0x02) und 
DeltaY (0x03). Die Configuration-Register (Reset/Sleep) kannst du - 
glaube ich - so lassen.
Und kannst du mir evtl noch sagen, in welcher Maus du diesen Sensor 
gefunden hast?

Groß Rofe

von Sahra N. (sahra_nana)


Lesenswert?

Lothar Miller schrieb:
> Was tut das Register? Ist seine Verwendung/Initialisierung nötig?
> Passen alle anderen Register?

der ist dafür, dass die Maus bewegt wurd, wenn der Pin7 im Reg 0x16 
gesetzt ist. Und die andere Registern, was zu meinem Datenblatt anpasst 
ist nur 0x00, auch die Reg 0x17 und 0x18 finde ich nicht im Datenblatt. 
hier ist mein Code:
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <util/delay.h>
4
//#include <USART.h>
5
6
#define DDR_SCK   DDRC      /*!< DDR fuer Maus-SCLK */
7
#define DDR_SDA   DDRB      /*!< DDR fuer Maus-SDA  */
8
9
#define PORT_SCK  PORTC      /*!< PORT fuer Maus-SCK  */
10
#define PORT_SDA  PORTB      /*!< PORT fuer Maus-SDA  */
11
#define PIN_SDA    PINB      /*!< PIN fuer Maus-SDA  */
12
13
#define SCK_PIN    (1<<PC0)    /*!< PIN nummer fuer Maus-SCK  */
14
#define SDA_PIN    (1<<PB0)    /*!< PIN nummer fuer Maus-SDA  */
15
16
#define FOSC 3686400 // Clock Speed
17
#define BAUD 9600
18
#define UBRR_VAL FOSC/16/BAUD-1
19
20
// Inizialisierung des Microcontrolers
21
void uart_init(void)
22
{
23
  UCSR0B |= (1<<RXEN0)|(1<<TXEN0);  // UART RX, TX und RX Interrupt einschalten
24
  UBRR0H = UBRR_VAL >> 8;
25
  UBRR0L = UBRR_VAL & 0xFF;
26
}
27
28
// Eine Funktion zum Senden von Zeichen über Seriellen Port
29
int uart_putc(unsigned char c)
30
{
31
    while (!(UCSR0A & (1<<UDRE0)))  //warten bis Senden moeglich 
32
    {
33
    }                             
34
 
35
    UDR0 = c;                      // sende Zeichen 
36
    return 0;
37
}
38
39
/* puts ist unabhaengig vom Controllertyp */
40
void uart_puts (char *s)
41
{
42
    while (*s)
43
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
44
        uart_putc(*s);
45
        s++;
46
    }
47
}
48
49
/*!
50
 * Uebertraegt ein Byte an den Sensor
51
 * @param data das Byte
52
 */
53
void pan_writeByte(unsigned char data){
54
  signed char i;
55
  
56
  DDR_SDA|= SDA_PIN;             // SDA auf Output
57
  
58
  for (i=7; i>=0; i--){
59
  
60
    PORT_SCK &= ~SCK_PIN;    //SCK auf Low, Daten vorbereiten
61
    
62
    if(data&(1<<i)){    //Bit rausschieben
63
      PORT_SDA|=SDA_PIN;
64
    }else{
65
      PORT_SDA&=~SDA_PIN;    
66
    }
67
    
68
    PORT_SCK |= SCK_PIN;    // SCK =1 Sensor uebernimmt auf steigender Flanke
69
    
70
    _delay_us(1);      //Sensor Zeit lassen um Bit zu holen
71
  }
72
73
  DDR_SDA &=~ SDA_PIN;      //HI-Z state
74
  PORT_SDA &=~ SDA_PIN;
75
    
76
}
77
78
/*!
79
 * Liest ein Byte vom Sensor
80
 * @return das Byte
81
 */
82
unsigned char pan_readByte(void)
83
{
84
  signed char i;
85
  unsigned char data=0;
86
  
87
  _delay_us(3);        //Sensor Zeit lassen um die Daten aus dem Register zu holen
88
89
  for (i=7; i>-1; i--){
90
    PORT_SCK &= ~SCK_PIN;    // SCK =0 Sensor bereitet Daten auf fallender Flanke vor !
91
      
92
    _delay_us(1);      //Sensor kurz Zeit lassen
93
    
94
    
95
    PORT_SCK |= SCK_PIN;    // SCK =1 Daten lesen  auf steigender Flanke    
96
    
97
    if(PIN_SDA&SDA_PIN){     //BIT einlesen
98
      data |= (1<<i);      
99
    }else{
100
      data &=~ (1<<i);      
101
    }      
102
103
  }
104
  return data;
105
}
106
107
/*!
108
 * Uebertraegt ein write-Kommando an den Sensor
109
 * @param adr Adresse
110
 * @param data zu schreibendes byte
111
 */
112
void pan_write(unsigned char adr, unsigned char data)
113
{
114
  adr|=(1<<7);
115
  pan_writeByte(adr);  //rl MSB muss 1 sein für Write Operation
116
  pan_writeByte(data);
117
}
118
119
120
121
/*!
122
 * Schickt ein Lesekommando an den Sensor
123
 * und liest ein Byte zurueck
124
 * @param adr die Adresse
125
 * @return der registerwert
126
 */
127
unsigned char pan_read(unsigned char adr)
128
{
129
130
  pan_writeByte(adr);
131
  return pan_readByte();
132
}
133
134
135
/*! 
136
 * Initialisiere A2610
137
 
138
 !! Muss unbedingt ganz am ANFANG von main stehen, sonst gibts FEHLER !!
139
 (wenn der A2610 sich initialisiert hat, bevor der Controler SCK und 
140
 SDA auf Output gestellt hat)
141
 Deshalb kann es auch sinnvoll sein die Powerup Zeit in den Config Bits 
142
 auf 4ms zu stellen oder noch besser mit Boden zu arbeiten.
143
 
144
 */ 
145
void pan_init(void)
146
{
147
148
  DDR_SCK  |= SCK_PIN;   // SCK auf Output
149
  DDR_SDA |= SDA_PIN;    //SDA auf Output
150
151
  PORT_SCK |= SCK_PIN;  // SCK auf high  
152
  PORT_SDA|= SDA_PIN;    //SDA auf high
153
154
// hier muessen bei Umstellung auf PAN101 die entsprechenden Register gesetzt werden
155
//Reset A2610
156
  pan_write(0x00,0x80);
157
// kein Sleep modus
158
  pan_write(0x00,0x01);  
159
}
160
int main(void)
161
{
162
163
  char s[15];
164
  unsigned char ino;
165
  signed char x,y;
166
  signed short posx=0,posy=0;
167
168
//ganz an den Anfang damit der Controller schneller asl der PAN ist um Fehler zu vermeiden
169
  pan_init();
170
//Individuelle Port Configuration und Initialisierung
171
  uart_init(); // USART initialisieren
172
  uart_puts("\r\n\n\n"); // sendet einen kleinen Begrüßungstext. 
173
  uart_puts("**** Hallo! Dies ist ein ADNS2610 Test ****\r\n");
174
  uart_puts("\r\n");
175
  uart_puts("Koord: ");
176
  uart_puts("\r\n");
177
178
179
180
181
182
  while(1)
183
  {
184
185
        //Endlosschleife
186
187
    ino=pan_read(0x16);
188
189
  //wenn 7tes bit vom Register 0x16 gesetzt ist wurde die Maus bewegt => Bewegungsdaten abfragen
190
    if(ino&(1<<7)){    
191
    //Deltax Register auslesen
192
      x=pan_read(0x17);
193
                //und zu der Positionvariable addieren
194
      posx=posx+x;
195
          
196
                /* Nachschaun ob das Ueberlauf-Bit im Register 0x16 gesetzt ist 
197
                   wenn das der Fall ist muss je nach Vorzeichen der Deltax Variable x
198
                   noch 128 (Ueberlauf nach oben) dazugezaehlt oder eben 128 abgezogen werden
199
                */
200
    if(ino&(1<<3))
201
    {
202
      if(x<0)
203
      {
204
        posx-=128;
205
      }else
206
      {
207
        posx+=128;
208
      }
209
    }
210
    
211
                //ab hier nochmal das Gleiche fuer die yRichtung
212
213
    y=pan_read(0x18);
214
    posy=posy+y;
215
    
216
    if(ino&(1<<4))
217
    {
218
      if(y<0)
219
      {
220
        posy-=128;
221
      }else
222
      {
223
        posy+=128;
224
      }
225
    }
226
  
227
  }
228
  
229
                //hier kann jeder seine Ausgabevariante selber waehlen ;) 
230
                
231
    uart_puts("ino= ");
232
    uart_puts( itoa( ino, s, 10 ) );
233
    uart_puts("     ");
234
235
236
    uart_puts("X=: ");
237
    uart_puts( itoa( posx, s, 10 ) );
238
    uart_puts("     ");
239
    uart_puts("Y=: ");
240
    //dtostrf(posy,6,3,s); 
241
    uart_puts( itoa( posy, s, 10 ) );
242
    uart_puts("\r\n");
243
244
      
245
}
246
247
return 0;
248
}

von Sahra N. (sahra_nana)


Lesenswert?

Rofe schrieb:
> Und kannst du mir evtl noch sagen, in welcher Maus du diesen Sensor
> gefunden hast?
Logitech
reicht es oder brauchst du auch S/N?
danke für deine Antwort, ich werde das ändern dann gucke ich was ich 
rausbekomme

von Rofe (Gast)


Lesenswert?

Logitech hat ein sehr großes Spekrum an Mäusen, da wäre es doch ein 
wenig hilfreicher, wenn ich die eine genauere Bezeichnung bekomme.

von Sahra N. (sahra_nana)


Lesenswert?

Rofe schrieb:
> Hallo und viel Erfolg
>
> Also das Register 0x16 ist das für den Motion_Status, also ob sich die
> Maus bewegt hat und dann musst du halt in deinem Datenblatt (Seite 18
> ff.) schauen, welches es bei dir ist. Dieses scheint mir aber nicht
> zwingend notwendig, da hiermit nur herausgefunden wird OB sich die Maus
> bewegt und nicht wohin. Weitere Register, die du noch ändern musst, sind
> DeltaX (0x17) und DeltaY (0x18) in die jeweiligen DeltaX (0x02) und
> DeltaY (0x03). Die Configuration-Register (Reset/Sleep) kannst du -
> glaube ich - so lassen.
> Und kannst du mir evtl noch sagen, in welcher Maus du diesen Sensor
> gefunden hast?
>
> Groß Rofe

hi
also der Status Reg bei ADNS2610 ist 0x01, DeltaX ist 0x03 und Deltay 
ist 0x02, die habe ich geändert und trotzdem bekomme ich nur komme ich 
Werte manchmal nur Nullen, und wenn ich die Debuggin stoppe dann krige 
ich grossere Werte. Also das Programm macht nur was er will.
danke

von Sahra N. (sahra_nana)


Lesenswert?

Rofe schrieb:
> Logitech hat ein sehr großes Spekrum an Mäusen, da wäre es doch ein
> wenig hilfreicher, wenn ich die eine genauere Bezeichnung bekomme.

M/N: M-SBF96
P/N:852209-A000
PID:HS8031414QE

von Sahra N. (sahra_nana)


Lesenswert?

Rofe schrieb:
> Logitech hat ein sehr großes Spekrum an Mäusen, da wäre es doch ein
> wenig hilfreicher, wenn ich die eine genauere Bezeichnung bekomme.

 Logitech M-SBF96 Optical Wheel Mouse, PS2, 852209-A000

von Rofe (Gast)


Lesenswert?

Die großen Werte, die du bekommst, machen für mich Sinn, da du je einen 
sehr großen Datentyp für die Positionen genommen hast +-32768 (signed 
short posx=0,posy=0;) und für Delta-Werte nur einen Bereich von -+128 
hast. Kannst du bitte mal ein paar Werte hier reinschreiben?

von Sahra N. (sahra_nana)


Angehängte Dateien:

Lesenswert?

Rofe schrieb:
> Kannst du bitte mal ein paar Werte hier reinschreiben?

von Max M. (rofe)


Lesenswert?

Sind die Werte denn schon zu Begin so groß, oder funktioniert das mit 
dem X/Y-Overflow nicht so recht? Also mit dem  "if(ino&(1<<3))" Und aus 
Interesse: Kannst du mir auch noch einmal die DeltaX und DeltaY Werte 
mitteilen. Und somit zü überprüfen, ob diese auch durchgängig den 
Maximalwert habe.

von Sahra N. (sahra_nana)


Angehängte Dateien:

Lesenswert?

also ich habe die Maus gar nicht bewegt, nur mit einem Laserpointer 
beleuchtet, und nach Starten dem Prog habe ich die Werte im Bild 1 
bekommen, und danach habe ich Debugging gestoppt dann habe ich das die 
Werte im Bild 2 gekriegt, und nach einem neuem Start die Werte im Bild 
3.
Merkwürdig

von Sahra N. (sahra_nana)


Angehängte Dateien:

Lesenswert?

moin,
ich habe jetzt einen neuen Mauschip benutzt diesmal habe die rote LED 
dran gelassen, mit dem alten Mauschip hatte ich statt die LED eine 
Laserpointer(mit rotem Licht)benutzt, und ich dachte dadurch ist der 
Mauschip kapput gegangen, aber immer noch kommen kömische Werte 
raus(sieh das Bild). auch wenn ich den Maus nicht bewege ändern sich 
städig die Werte.
VG A

von Max M. (rofe)


Lesenswert?

Sehr merkwürdig, aber ist dir schon aufgefallen, dass die X-Werte 
permanent um 129 subtrahiert werden und die Y-Werte immer um 128 addiert 
werden?
Und an welchen mc hast du die Maus denn eigendlich angeschlossen und was 
welches Prog nutzt du für die Ausgaben`?

von Sahra N. (sahra_nana)


Angehängte Dateien:

Lesenswert?

ich habe jetzt einen Fehler korrigiert und zwar:

Sahra Nana schrieb:
> if(ino&(1<<4))

mit ino&(1<<2) da der Reg deltay die Adresse 0x02 hat.

Max Mustermann schrieb:
> welchen mc hast du die Maus denn eigendlich angeschlossen

Atmega8

Max Mustermann schrieb:
> welches Prog nutzt du für die Ausgaben

Hyperterminal.
Nach dieser Änderung habe ich diese Werte bekommen(sieh Bild)

von Sahra N. (sahra_nana)


Lesenswert?

Hallo
ich weiß wo der Fehler ist, dieser Code ist nur für PAN3101 geschrieben,
weil!
der reg 0x16 ist der Motion_Status und der gibt nicht in ADNS2610,
es existiert keinen Reg in ADNS2610 mit DYOVF und DXOVF

in PAN3101:
                  0x16
 -------------------------------------------------------
|  7    |  6  |  5  |  4    |  3    |  2  |  1  |   0   |
 -------------------------------------------------------
| Motion|  R  |  R  | DYOVF | DXOVF |  R  |  R  | Reset |
|       |     |     |       |       |     |     |       |
 -------------------------------------------------------
Reg 0x17 --------------> ist Dx
Reg 0x18 --------------> ist Dy

und die Reg 17 und 18 heissen bei ADSN2610 2 und 3.
gibt es keinen Code und Beispiel für ADNS2610?
VG A

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.