Rev 1967 | Rev 2097 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1967 | Rev 2035 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
2 | // + Copyright (c) 04.2007 Holger Buss |
2 | // + Copyright (c) 04.2007 Holger Buss |
3 | // + Nur für den privaten Gebrauch |
3 | // + Nur f�r den privaten Gebrauch |
4 | // + www.MikroKopter.com |
4 | // + www.MikroKopter.com |
5 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
5 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
6 | // + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
6 | // + Es gilt f�r das gesamte Projekt (Hardware, Software, Bin�rfiles, Sourcecode und Dokumentation), |
7 | // + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
7 | // + dass eine Nutzung (auch auszugsweise) nur f�r den privaten (nicht-kommerziellen) Gebrauch zul�ssig ist. |
8 | // + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
8 | // + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
9 | // + bzgl. der Nutzungsbedingungen aufzunehmen. |
9 | // + bzgl. der Nutzungsbedingungen aufzunehmen. |
10 | // + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
10 | // + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Best�ckung und Verkauf von Platinen oder Baus�tzen, |
11 | // + Verkauf von Luftbildaufnahmen, usw. |
11 | // + Verkauf von Luftbildaufnahmen, usw. |
12 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
12 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
13 | // + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
13 | // + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder ver�ffentlicht, |
14 | // + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
14 | // + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright m�ssen dann beiliegen |
15 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
15 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
16 | // + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
16 | // + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
17 | // + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
17 | // + auf anderen Webseiten oder sonstigen Medien ver�ffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
18 | // + eindeutig als Ursprung verlinkt werden |
18 | // + eindeutig als Ursprung verlinkt werden |
19 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
19 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
20 | // + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
20 | // + Keine Gew�hr auf Fehlerfreiheit, Vollst�ndigkeit oder Funktion |
21 | // + Benutzung auf eigene Gefahr |
21 | // + Benutzung auf eigene Gefahr |
22 | // + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
22 | // + Wir �bernehmen keinerlei Haftung f�r direkte oder indirekte Personen- oder Sachsch�den |
23 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
23 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
24 | // + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
24 | // + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
25 | // + mit unserer Zustimmung zulässig |
25 | // + mit unserer Zustimmung zul�ssig |
26 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
26 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
27 | // + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
27 | // + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
28 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
28 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
29 | // + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
29 | // + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
30 | // + this list of conditions and the following disclaimer. |
30 | // + this list of conditions and the following disclaimer. |
Line 97... | Line 97... | ||
97 | twi_state = TWI_STATE_MOTOR_TX; |
97 | twi_state = TWI_STATE_MOTOR_TX; |
98 | motor_write = 0; |
98 | motor_write = 0; |
99 | motor_read = 0; |
99 | motor_read = 0; |
Line 100... | Line 100... | ||
100 | 100 | ||
101 | for (i = 0; i < MAX_MOTORS; i++) { |
101 | for (i = 0; i < MAX_MOTORS; i++) { |
102 | motor[i].SetPoint = 0; |
102 | motor[i].throttle = 0; |
103 | motor[i].Present = 0; |
- | |
104 | motor[i].Error = 0; |
103 | motor[i].present = 0; |
105 | motor[i].MaxPWM = 0; |
104 | motor[i].maxPWM = 0; |
Line 106... | Line 105... | ||
106 | } |
105 | } |
107 | 106 | ||
Line 204... | Line 203... | ||
204 | I2C_WriteByte(0x53 + (motor_read * 2)); // select slave adress in rx mode |
203 | I2C_WriteByte(0x53 + (motor_read * 2)); // select slave adress in rx mode |
205 | } else |
204 | } else |
206 | I2C_WriteByte(0x52 + (motor_write * 2)); // select slave adress in tx mode |
205 | I2C_WriteByte(0x52 + (motor_write * 2)); // select slave adress in tx mode |
207 | break; |
206 | break; |
208 | case 1: // Send Data to Slave |
207 | case 1: // Send Data to Slave |
209 | I2C_WriteByte(motor[motor_write].SetPoint); // transmit rotation rate setpoint |
208 | I2C_WriteByte(motor[motor_write].throttle); // transmit throttle value. |
210 | break; |
209 | break; |
211 | case 2: // repeat case 0+1 for all motors |
210 | case 2: // repeat case 0+1 for all motors |
212 | if (TWSR == TW_MT_DATA_NACK) { // Data transmitted, NACK received |
211 | if (TWSR == TW_MT_DATA_NACK) { // Data transmitted, NACK received |
213 | if (!missing_motor) |
212 | if (!missing_motor) |
214 | missing_motor = motor_write + 1; |
213 | missing_motor = motor_write + 1; |
215 | if (++motor[motor_write].Error == 0) |
214 | if (++motor[motor_write].error == 0) |
216 | motor[motor_write].Error = 255; // increment error counter and handle overflow |
215 | motor[motor_write].error = 255; // increment error counter and handle overflow |
217 | } |
216 | } |
218 | I2C_Stop(TWI_STATE_MOTOR_TX); |
217 | I2C_Stop(TWI_STATE_MOTOR_TX); |
219 | I2CTimeout = 10; |
218 | I2CTimeout = 10; |
220 | motor_write++; // next motor |
219 | motor_write++; // next motor |
221 | I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive |
220 | I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive |
222 | break; |
221 | break; |
223 | // Master Receive Data |
222 | // Master Receive Data |
224 | case 3: |
223 | case 3: |
225 | if (TWSR != TW_MR_SLA_ACK) { // SLA+R transmitted, if not ACK received |
224 | if (TWSR != TW_MR_SLA_ACK) { // SLA+R transmitted, if not ACK received |
226 | // no response from the addressed slave received |
225 | // no response from the addressed slave received |
227 | motor[motor_read].Present = 0; |
226 | motor[motor_read].present = 0; |
228 | motor_read++; // next motor |
227 | motor_read++; // next motor |
229 | if (motor_read >= MAX_MOTORS) |
228 | if (motor_read >= MAX_MOTORS) |
230 | motor_read = 0; // restart reading of first motor if we have reached the last one |
229 | motor_read = 0; // restart reading of first motor if we have reached the last one |
231 | I2C_Stop(TWI_STATE_MOTOR_TX); |
230 | I2C_Stop(TWI_STATE_MOTOR_TX); |
232 | } else { |
231 | } else { |
233 | motor[motor_read].Present = ('1' - '-') + motor_read; |
232 | motor[motor_read].present = ('1' - '-') + motor_read; |
234 | I2C_ReceiveByte(); //Transmit 1st byte |
233 | I2C_ReceiveByte(); //Transmit 1st byte |
235 | } |
234 | } |
236 | missingMotor = missing_motor; |
235 | missingMotor = missing_motor; |
237 | missing_motor = 0; |
236 | missing_motor = 0; |
238 | break; |
237 | break; |
239 | case 4: //Read 1st byte and transmit 2nd Byte |
238 | case 4: //Read 1st byte and transmit 2nd Byte |
240 | motor[motor_read].Current = TWDR; |
239 | motor[motor_read].current = TWDR; |
241 | I2C_ReceiveLastByte(); // nack |
240 | I2C_ReceiveLastByte(); // nack |
242 | break; |
241 | break; |
243 | case 5: |
242 | case 5: |
244 | //Read 2nd byte |
243 | //Read 2nd byte |
245 | motor[motor_read].MaxPWM = TWDR; |
244 | motor[motor_read].maxPWM = TWDR; |
246 | motor_read++; // next motor |
245 | motor_read++; // next motor |
247 | if (motor_read >= MAX_MOTORS) |
246 | if (motor_read >= MAX_MOTORS) |
248 | motor_read = 0; // restart reading of first motor if we have reached the last one |
247 | motor_read = 0; // restart reading of first motor if we have reached the last one |
249 | I2C_Stop(TWI_STATE_MOTOR_TX); |
248 | I2C_Stop(TWI_STATE_MOTOR_TX); |
250 | break; |
249 | break; |
Line 291... | Line 290... | ||
291 | uint8_t i; |
290 | uint8_t i; |
Line 292... | Line 291... | ||
292 | 291 | ||
Line 293... | Line 292... | ||
293 | printf("\n\rFound BL-Ctrl: "); |
292 | printf("\n\rFound BL-Ctrl: "); |
294 | 293 | ||
295 | for (i = 0; i < MAX_MOTORS; i++) { |
294 | for (i = 0; i < MAX_MOTORS; i++) { |
Line 296... | Line 295... | ||
296 | motor[i].SetPoint = 0; |
295 | motor[i].throttle = 0; |
297 | } |
296 | } |
Line 298... | Line 297... | ||
298 | 297 | ||
Line 299... | Line 298... | ||
299 | I2C_Start(TWI_STATE_MOTOR_TX); |
298 | I2C_Start(TWI_STATE_MOTOR_TX); |
300 | _delay_ms(2); |
299 | _delay_ms(2); |
301 | 300 | ||
302 | motor_read = 0; // read the first I2C-Data |
301 | motor_read = 0; // read the first I2C-Data |
303 | 302 | ||
304 | for (i = 0; i < MAX_MOTORS; i++) { |
303 | for (i = 0; i < MAX_MOTORS; i++) { |
Line 305... | Line 304... | ||
305 | I2C_Start(TWI_STATE_MOTOR_TX); |
304 | I2C_Start(TWI_STATE_MOTOR_TX); |
306 | _delay_ms(2); |
305 | _delay_ms(2); |
307 | if (motor[i].Present) |
306 | if (motor[i].present) |
308 | printf("%d ",i+1); |
307 | printf("%d ",i+1); |
309 | } |
308 | } |
310 | 309 |