blob: 258e08302cc4607ccfbbc244a32a733284a19ead (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
#include "maussensor.h"
Maussensor::Maussensor() {
}
Maussensor::~Maussensor() {
}
// Initialisiert den Maussensor
void Maussensor::init(int index) {
// Setze die Pins entsprechend dem übergebenen Index
if(index == MAUSSENSOR0) {
sda_pin = MAUS0_SDA;
sck_pin = MAUS0_SCK;
}
else {
sda_pin = MAUS1_SDA;
sck_pin = MAUS1_SCK;
}
// Initialisiere den Maussensor
maus_sens_init();
}
// Gibt die X-Koordinate Zurück
uint8 Maussensor::GetX() {
return maus_sens_read(MOUSE_DELTA_X_REG);
}
// Gibt die Y-Koordinate Zurück
uint8 Maussensor::GetY() {
return maus_sens_read(MOUSE_DELTA_Y_REG);
}
/*!
* Gibt den SQUAL-Wert zurueck. Dieser gibt an, wieviele Merkmale der Sensor
* im aktuell aufgenommenen Bild des Untergrunds wahrnimmt
*/
uint8 Maussensor::GetSqual() {
return maus_sens_read(MOUSE_SQUAL_REG);
}
/*!
* Uebertraegt ein Byte an den Sensor
* @param data das Byte
*/
void Maussensor::maus_sens_writeByte(uint8 data){
int8 i;
MAUS_DDR |= (1<<sda_pin); // SDA auf Output
for (i=7; i>=0; i--){
MAUS_PORT &= ~(1<<sck_pin); // SCK auf Low, vorbereiten
//Daten rausschreiben
MAUS_PORT = (MAUS_PORT & (~MAUS_PIN)) | ((data >> (7 - sda_pin)) & (1<<sda_pin));
data = data <<1; // naechstes Bit vorbereiten
asm volatile("nop"); // Etwas warten
MAUS_PORT |= (1<<sck_pin); // SCK =1 Sensor uebernimmt auf steigender Flanke
}
}
/*!
* Liest ein Byte vom Sensor
* @return das Byte
*/
uint8 Maussensor::maus_sens_readByte(void){
int i;
char data=0;
MAUS_DDR &= ~(1<<sda_pin); // SDA auf Input
for (i=7; i>-1; i--){
MAUS_PORT &= ~(1<<sck_pin); // SCK =0 Sensor bereitet Daten auf fallender Flanke vor !
data=data<<1; // Platz schaffen
asm volatile("nop"); // Etwas warten
MAUS_PORT |= (1<<sck_pin); // SCK =1 Daten lesen auf steigender Flanke
data |= (MAUS_PIN >> sda_pin) & 0x01; //Daten lesen
}
return data;
}
/*!
* Uebertraegt ein write-Kommando an den Sensor
* @param adr Adresse
* @param data Datum
*/
void Maussensor::maus_sens_write(int8 adr, uint8 data){
int16 i;
//MOUSE_Enable();
maus_sens_writeByte(adr|=0x80); //rl MSB muss 1 sein Datenblatt S.12 Write Operation
maus_sens_writeByte(data);
for (i=0; i<300; i++){ asm volatile("nop"); } // mindestens 100 Mikrosekunden Pause!!!
}
/*!
* Schickt ein Lesekommando an den Sensor
* und liest ein Byte zurueck
* @param adr die Adresse
* @return das Datum
*/
uint8 Maussensor::maus_sens_read(uint8 adr){
//MOUSE_Enable();
int16 i;
maus_sens_writeByte(adr);
for (i=0; i<300; i++){asm volatile("nop");} // mindestens 100 Mikrosekunden Pause!!!
return maus_sens_readByte();
}
/*!
* Initialisiere Maussensor
*/
void Maussensor::maus_sens_init(void){
msleep(100);
MAUS_DDR |= (1<<sck_pin); // SCK auf Output
MAUS_PORT &= ~(1<<sck_pin); // SCK auf 0
msleep(10);
maus_sens_write(MOUSE_CONFIG_REG,MOUSE_CFG_RESET); //Reset sensor
maus_sens_write(MOUSE_CONFIG_REG,MOUSE_CFG_FORCEAWAKE); //Always on
}
/*! muessen wir nach dem ersten Pixel suchen?*/
static uint8 firstRead;
/*!
* Bereitet das auslesen eines ganzen Bildes vor
*/
void Maussensor::maus_image_prepare(void){
maus_sens_write(MOUSE_CONFIG_REG,MOUSE_CFG_FORCEAWAKE); //Always on
maus_sens_write(MOUSE_PIXEL_DATA_REG,0x00); // Frame grabben anstossen
firstRead=1; //suche erstes Pixel
}
/*!
* Liefert bei jedem Aufruf das naechste Pixel des Bildes
* Insgesamt gibt es 324 Pixel
* <pre>
* 18 36 ... 324
* .. .. ... ..
* 2 20 ... ..
* 1 19 ... 307
* </pre>
* Bevor diese Funktion aufgerufen wird, muss maus_image_prepare() aufgerufen werden!
* @return Die Pixeldaten (Bit 0 bis Bit5), Pruefbit, ob Daten gueltig (Bit6), Markierung fuer den Anfang eines Frames (Bit7)
*/
int8 Maussensor::maus_image_read(void){
int8 pixel=maus_sens_read(MOUSE_PIXEL_DATA_REG);
if ( firstRead ==1){
while ( (pixel & 0x80) != 0x80){
pixel=maus_sens_read(MOUSE_PIXEL_DATA_REG);
// if ((pixel & 0x70) != 0x70)
// return 0;
}
firstRead=0;
}
return pixel;
}
|