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
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... :-/
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
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 | }
|
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
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.
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
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
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
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?
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.
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
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
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`?
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.