Rev 1479 | Rev 1639 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1479 | Rev 1638 | ||
---|---|---|---|
Line 90... | Line 90... | ||
90 | { |
90 | { |
91 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
91 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
92 | } |
92 | } |
Line 93... | Line 93... | ||
93 | 93 | ||
94 | 94 | ||
95 | 95 | /* |
|
96 | //############################################################################ |
96 | //############################################################################ |
97 | SIGNAL (TWI_vect) |
97 | SIGNAL (TWI_vect) |
98 | //############################################################################ |
98 | //############################################################################ |
Line 214... | Line 214... | ||
214 | i2c_stop(); |
214 | i2c_stop(); |
215 | I2CTimeout = 10; |
215 | I2CTimeout = 10; |
216 | twi_state = 0; |
216 | twi_state = 0; |
217 | break; |
217 | break; |
218 | default: twi_state = 0; |
218 | default: twi_state = 0; |
- | 219 | break; |
|
- | 220 | } |
|
- | 221 | TWCR |= 0x80; |
|
- | 222 | } |
|
- | 223 | */ |
|
- | 224 | ||
- | 225 | /* |
|
- | 226 | if(DataArray[3] & 0x01) Parameter.PwmScaling = DataArray[4]; |
|
- | 227 | if(DataArray[3] & 0x02) Parameter.MaxStrom = DataArray[5]; |
|
- | 228 | if(DataArray[3] & 0x04) Parameter.TemperaturLimiter = DataArray[6]; |
|
- | 229 | if(DataArray[3] & 0x08) Parameter.SkaliereStrom = DataArray[7]; |
|
- | 230 | if(DataArray[3] & 0x10) Parameter.Bitconfig = DataArray[8]; |
|
- | 231 | */ |
|
- | 232 | ||
- | 233 | //############################################################################ |
|
- | 234 | SIGNAL (TWI_vect) |
|
- | 235 | //############################################################################ |
|
- | 236 | { // 2 3 4 5 6 7 8 9 |
|
- | 237 | unsigned char test[] = {0,0,'#',0x1F,255,30,100,64,0x00,7,8,9,10}; |
|
- | 238 | static unsigned char missing_motor,send = 0,crc = 0; |
|
- | 239 | switch(twi_state++) |
|
- | 240 | { |
|
- | 241 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 242 | // Writing the Data |
|
- | 243 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 244 | case 0: |
|
- | 245 | while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++; // skip if not used |
|
- | 246 | if(motor == MAX_MOTORS) // writing finished -> now read |
|
- | 247 | { |
|
- | 248 | motor = 0; |
|
- | 249 | twi_state = 4; |
|
- | 250 | i2c_write_byte(0x53+(motorread*2)); |
|
- | 251 | } |
|
- | 252 | else i2c_write_byte(0x52+(motor*2)); |
|
- | 253 | send = 0; |
|
- | 254 | break; |
|
- | 255 | case 1: |
|
- | 256 | i2c_write_byte(Motor[motor].SetPoint); |
|
- | 257 | if(!(Motor[motor].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) twi_state++; |
|
- | 258 | break; |
|
- | 259 | case 2: |
|
- | 260 | if(!send++) |
|
- | 261 | { |
|
- | 262 | i2c_write_byte((Motor[motor].SetPointLowerBits << 1));// + (7 << 0)); |
|
- | 263 | crc = 0xAA; |
|
- | 264 | } |
|
- | 265 | else |
|
- | 266 | if(send == 9) i2c_write_byte(crc); |
|
- | 267 | else |
|
- | 268 | { |
|
- | 269 | crc += test[send]; |
|
- | 270 | i2c_write_byte(test[send]); |
|
- | 271 | } |
|
- | 272 | if(!MotorenEin && motor == motorread && !PC_MotortestActive && (Motor[motorread].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) if(send <= 10) twi_state--; |
|
- | 273 | break; |
|
- | 274 | case 3: |
|
- | 275 | motor++; |
|
- | 276 | if(TWSR == 0x30) |
|
- | 277 | { |
|
- | 278 | if(!missing_motor) missing_motor = motor; |
|
- | 279 | if((Motor[motor-1].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK) Motor[motor-1].State++; // increment error counter and handle overflow |
|
- | 280 | } |
|
- | 281 | i2c_stop(); |
|
- | 282 | I2CTimeout = 10; |
|
- | 283 | twi_state = 0; |
|
- | 284 | i2c_start(); |
|
- | 285 | break; |
|
- | 286 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 287 | // Reading Data |
|
- | 288 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 289 | case 4: |
|
- | 290 | //Transmit 1st byte for reading |
|
- | 291 | if(TWSR != 0x40) // Error? |
|
- | 292 | { |
|
- | 293 | Motor[motorread].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit |
|
- | 294 | motorread++; |
|
- | 295 | if(motorread >= MAX_MOTORS) motorread = 0; |
|
- | 296 | i2c_stop(); |
|
- | 297 | twi_state = 0; |
|
- | 298 | } |
|
- | 299 | else |
|
- | 300 | { |
|
- | 301 | Motor[motorread].State |= MOTOR_STATE_PRESENT_MASK; // set present bit |
|
- | 302 | I2C_ReceiveByte(); |
|
- | 303 | } |
|
- | 304 | MissingMotor = missing_motor; |
|
- | 305 | missing_motor = 0; |
|
- | 306 | break; |
|
- | 307 | case 5: //Read 1st byte and transmit 2nd Byte |
|
- | 308 | Motor[motorread].Current = TWDR; |
|
- | 309 | I2C_ReceiveByte(); //nack |
|
- | 310 | break; |
|
- | 311 | case 6: |
|
- | 312 | //Read 2nd byte and transmit 3rd Byte |
|
- | 313 | Motor[motorread].MaxPWM = TWDR; |
|
- | 314 | if(TWDR == 250) |
|
- | 315 | { |
|
- | 316 | //if(!Motor[motor].SetPoint) |
|
- | 317 | Motor[motorread].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK; |
|
- | 318 | } |
|
- | 319 | I2C_ReceiveLastByte(); //nack |
|
- | 320 | break; |
|
- | 321 | case 7: // read next |
|
- | 322 | if(TWDR == 255) { if(!MotorenEin) Motor[motorread].Version = 0; DebugOut.Analog[24]++;} |
|
- | 323 | Motor[motorread].Temperature = TWDR; |
|
- | 324 | motorread++; // next motor |
|
- | 325 | if(motorread >= MAX_MOTORS) { motorread = 0; } |
|
- | 326 | i2c_stop(); |
|
- | 327 | twi_state = 0; |
|
- | 328 | break; |
|
- | 329 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 330 | // writing Gyro-Offset |
|
- | 331 | //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 332 | case 18: |
|
- | 333 | i2c_write_byte(0x98); // Address of the DAC |
|
- | 334 | break; |
|
- | 335 | case 19: |
|
- | 336 | i2c_write_byte(0x10); // Update Channel A |
|
- | 337 | break; |
|
- | 338 | case 20: |
|
- | 339 | i2c_write_byte(AnalogOffsetNick); // Value |
|
- | 340 | break; |
|
- | 341 | case 21: |
|
- | 342 | i2c_write_byte(0x80); // Value |
|
- | 343 | break; |
|
- | 344 | case 22: |
|
- | 345 | i2c_stop(); |
|
- | 346 | I2CTimeout = 10; |
|
- | 347 | i2c_start(); |
|
- | 348 | break; |
|
- | 349 | case 23: |
|
- | 350 | i2c_write_byte(0x98); // Address of the DAC |
|
- | 351 | break; |
|
- | 352 | case 24: |
|
- | 353 | i2c_write_byte(0x12); // Update Channel B |
|
- | 354 | break; |
|
- | 355 | case 25: |
|
- | 356 | i2c_write_byte(AnalogOffsetRoll); // Value |
|
- | 357 | break; |
|
- | 358 | case 26: |
|
- | 359 | i2c_write_byte(0x80); // Value |
|
- | 360 | break; |
|
- | 361 | case 27: |
|
- | 362 | i2c_stop(); |
|
- | 363 | I2CTimeout = 10; |
|
- | 364 | i2c_start(); |
|
- | 365 | break; |
|
- | 366 | case 28: |
|
- | 367 | i2c_write_byte(0x98); // Address of the DAC |
|
- | 368 | break; |
|
- | 369 | case 29: |
|
- | 370 | i2c_write_byte(0x14); // Update Channel C |
|
- | 371 | break; |
|
- | 372 | case 30: |
|
- | 373 | i2c_write_byte(AnalogOffsetGier); // Value |
|
- | 374 | break; |
|
- | 375 | case 31: |
|
- | 376 | i2c_write_byte(0x80); // Value |
|
- | 377 | break; |
|
- | 378 | case 32: |
|
- | 379 | i2c_stop(); |
|
- | 380 | I2CTimeout = 10; |
|
- | 381 | twi_state = 0; |
|
- | 382 | break; |
|
- | 383 | default: twi_state = 0; |
|
219 | break; |
384 | break; |
220 | } |
385 | } |
221 | TWCR |= 0x80; |
386 | TWCR |= 0x80; |
222 | } |
387 | } |