Rev 839 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*############################################################################
############################################################################*/
#include "main.h"
#include "kafi.h"
unsigned char twi_state
= 0;
unsigned char motor
= 0;
unsigned char motorread
= 0;
unsigned char motor_rx
[8];
unsigned int TriggerMagneticHeading
= 0;
unsigned int TriggerSonicReading
= 0;
//############################################################################
//Initzialisieren der I2C (TWI) Schnittstelle
void i2c_init
(void)
//############################################################################
{
TWSR
= 0;
TWBR
= ((SYSCLK
/SCL_CLOCK
)-16)/2;
}
//############################################################################
//Start I2C
char i2c_start
(void)
//############################################################################
{
TWCR
= (1<<TWSTA
) | (1<<TWEN
) | (1<<TWINT
) | (1<<TWIE
);
return(0);
}
//############################################################################
//Start I2C
void i2c_stop
(void)
//############################################################################
{
TWCR
= (1<<TWEN
) | (1<<TWSTO
) | (1<<TWINT
);
}
void i2c_reset
(void)
//############################################################################
{
i2c_stop
();
twi_state
= 0;
motor
= TWDR
;
motor
= 0;
TWCR
= 0x80;
TWAMR
= 0;
TWAR
= 0;
TWDR
= 0;
TWSR
= 0;
TWBR
= 0;
i2c_init
();
i2c_start
();
i2c_write_byte
(0);
}
//############################################################################
//Start I2C
char i2c_write_byte
(char byte
)
//############################################################################
{
TWSR
= 0x00;
TWDR
= byte
;
TWCR
= (1<<TWINT
) | (1<<TWEN
) | (1<<TWIE
);
return(0);
}
//############################################################################
//Start I2C
SIGNAL
(TWI_vect
)
//############################################################################
{
#if 0
int motorwert
= 0;
int scale_p
= (int) (MAX
(0, (PPM_in
[EE_Parameter.
Kanalbelegung[K_POTI1
]] + 170)) / 4.
F) / 6;
int scale_d
= (int) (MAX
(0, (PPM_in
[EE_Parameter.
Kanalbelegung[K_POTI2
]] + 170)) / 4.
F) / 6;
#endif
switch (twi_state
++)
{
case 0:
i2c_write_byte
(0x52+(motor
*2));
break;
case 1:
switch(motor
++)
{
case 0:
#if 0
pd_ergebnis
= (int) (scale_p
* DiffNick
+ scale_d
* (AdWertNick
- AdNeutralNick
- Roll_Y_Off
)) / 10;
if(pd_ergebnis
> (GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= (GasMischanteil
+ abs(GierMischanteil
));
}
if(pd_ergebnis
< -(GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= -(GasMischanteil
+ abs(GierMischanteil
));
}
/* M o t o r V o r n */
motorwert
= GasMischanteil
+ pd_ergebnis
+ GierMischanteil
;
if ((motorwert
< 0))
{
motorwert
= 0;
}
else if(motorwert
> MAX_GAS
)
{
motorwert
= MAX_GAS
;
}
if (motorwert
< MIN_GAS
)
{
motorwert
= MIN_GAS
;
}
Motor_Vorne
= motorwert
;
if(!MotorenEin
)
{
Motor_Vorne
= 0;
if(MotorTest
[0]) Motor_Vorne
= MotorTest
[0];
}
#endif
i2c_write_byte
(Motor_Vorne
);
break;
case 1:
#if 0
pd_ergebnis
= (scale_p
* DiffNick
+ scale_d
* (AdWertNick
- AdNeutralNick
- Roll_Y_Off
)) / 10;
if(pd_ergebnis
> (GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= (GasMischanteil
+ abs(GierMischanteil
));
}
if(pd_ergebnis
< -(GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= -(GasMischanteil
+ abs(GierMischanteil
));
}
/* M o t o r H e c k */
motorwert
= GasMischanteil
- pd_ergebnis
+ GierMischanteil
;
if ((motorwert
< 0))
{
motorwert
= 0;
}
else if(motorwert
> MAX_GAS
)
{
motorwert
= MAX_GAS
;
}
if (motorwert
< MIN_GAS
)
{
motorwert
= MIN_GAS
;
}
Motor_Hinten
= motorwert
;
if(!MotorenEin
)
{
Motor_Hinten
= 0;
if(MotorTest
[1]) Motor_Hinten
= MotorTest
[1];
}
#endif
i2c_write_byte
(Motor_Hinten
);
break;
case 2:
#if 0
pd_ergebnis
= (scale_p
* DiffRoll
+ scale_d
* (AdWertRoll
- AdNeutralRoll
- Roll_X_Off
)) / 10;
if(pd_ergebnis
> (GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= (GasMischanteil
+ abs(GierMischanteil
));
}
if(pd_ergebnis
< -(GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= -(GasMischanteil
+ abs(GierMischanteil
));
}
/* M o t o r R e c h t s */
motorwert
= GasMischanteil
- pd_ergebnis
- GierMischanteil
;
if (motorwert
< 0)
{
motorwert
= 0;
}
else if(motorwert
> MAX_GAS
)
{
motorwert
= MAX_GAS
;
}
if (motorwert
< MIN_GAS
)
{
motorwert
= MIN_GAS
;
}
Motor_Rechts
= motorwert
;
if(!MotorenEin
)
{
Motor_Rechts
= 0;
if(MotorTest
[3]) Motor_Rechts
= MotorTest
[3];
}
#endif
i2c_write_byte
(Motor_Rechts
);
break;
case 3:
#if 0
pd_ergebnis
= (scale_p
* DiffRoll
+ scale_d
* (AdWertRoll
- AdNeutralRoll
- Roll_X_Off
)) / 10;
if(pd_ergebnis
> (GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= (GasMischanteil
+ abs(GierMischanteil
));
}
if(pd_ergebnis
< -(GasMischanteil
+ abs(GierMischanteil
)))
{
pd_ergebnis
= -(GasMischanteil
+ abs(GierMischanteil
));
}
/* M o t o r L i n k s */
motorwert
= GasMischanteil
+ pd_ergebnis
- GierMischanteil
;
if (motorwert
< 0)
{
motorwert
= 0;
}
else if(motorwert
> MAX_GAS
)
{
motorwert
= MAX_GAS
;
}
if (motorwert
< MIN_GAS
)
{
motorwert
= MIN_GAS
;
}
Motor_Links
= motorwert
;
if(!MotorenEin
)
{
Motor_Links
= 0;
if(MotorTest
[2]) Motor_Links
= MotorTest
[2];
}
#endif
i2c_write_byte
(Motor_Links
);
break;
}
break;
case 2:
i2c_stop
();
if (motor
<4) twi_state
= 0;
else motor
= 0;
i2c_start
();
break;
//Liest Daten von Motor
case 3:
i2c_write_byte
(0x53+(motorread
*2));
break;
case 4:
switch(motorread
)
{
case 0:
i2c_write_byte
(Motor_Vorne
);
break;
case 1:
i2c_write_byte
(Motor_Hinten
);
break;
case 2:
i2c_write_byte
(Motor_Rechts
);
break;
case 3:
i2c_write_byte
(Motor_Links
);
break;
}
break;
case 5: //1 Byte vom Motor lesen
motor_rx
[motorread
] = TWDR
;
case 6:
switch(motorread
)
{
case 0:
i2c_write_byte
(Motor_Vorne
);
break;
case 1:
i2c_write_byte
(Motor_Hinten
);
break;
case 2:
i2c_write_byte
(Motor_Rechts
);
break;
case 3:
i2c_write_byte
(Motor_Links
);
break;
}
break;
case 7: //2 Byte vom Motor lesen
motor_rx
[motorread
+4] = TWDR
;
motorread
++;
if (motorread
>3) motorread
=0;
i2c_stop
();
I2CTimeout
= 10;
twi_state
= 0;
}
#if 0
break;
TriggerMagneticHeading
++;
TriggerMagneticHeading
%= 50;
TriggerSonicReading
++;
TriggerSonicReading
%= 200;
if (TriggerMagneticHeading
== 1)
{
// Get Magnetic Heading
i2c_start
();
twi_state
= 8;
break;
}
if (TriggerSonicReading
== 1)
{
// Get Ultrasonic Reading
i2c_start
();
twi_state
= 20;
break;
}
else if (TriggerSonicReading
== 190)
{
// Get Ultrasonic Reading
i2c_start
();
twi_state
= 30;
break;
}
else
{
I2CTimeout
= 10;
twi_state
= 0;
break;
}
case 8:
i2c_write_byte
(0xC0);
break;
case 9:
i2c_write_byte
(0x02);
break;
case 10:
i2c_start
();
break;
case 11:
i2c_write_byte
(0xC1);
break;
case 12:
i2c_write_byte
(MagneticHeading
);
break;
case 13:
MagneticHeading
= (0x0F & TWDR
) << 8;
i2c_stop
();
i2c_start
();
break;
case 14:
i2c_write_byte
(0xC0);
break;
case 15:
i2c_write_byte
(0x03);
break;
case 16:
i2c_start
();
break;
case 17:
i2c_write_byte
(0xC1);
break;
case 18:
i2c_write_byte
(MagneticHeading
);
break;
case 19:
MagneticHeading
+= TWDR
;
i2c_stop
();
I2CTimeout
= 22;
twi_state
= 0;
break;
/* Trigger Ultrasonic Ping */
case 20: /* Ping */
i2c_write_byte
(0xE0); /* Send I2C Adress */
break;
case 21:
i2c_write_byte
(0x00); /* Send I2C Register */
break;
case 22:
i2c_write_byte
(82); /* Send I2C Value */
break;
case 24:
VersionID
= TWDR
;
i2c_stop
();
I2CTimeout
= 22;
twi_state
= 0;
UltrasonicPingCnt
++;
break;
case 30:
i2c_write_byte
(0xE0);/* Send I2C Adress */
break;
case 31:
i2c_write_byte
(0x02); /* Send I2C Register */
break;
case 32:
i2c_start
();
break;
case 33:
i2c_write_byte
(0xE1);
break;
case 34:
i2c_write_byte
(255);
break;
case 35:
UltrasonicRange
= TWDR
<< 8;/* Read I2C Value */
UltrasonicRangeHigh
= TWDR
;
i2c_stop
();
i2c_start
();
break;
case 36:
i2c_write_byte
(0xE0);
break;
case 37:
i2c_write_byte
(0x03);
break;
case 38:
i2c_start
();
break;
case 39:
i2c_write_byte
(0xE1);
break;
case 40:
i2c_write_byte
(UltrasonicRangeLow
);
break;
case 41:
UltrasonicRange
+= TWDR
;
UltrasonicRangeLow
= TWDR
;
i2c_stop
();
I2CTimeout
= 22;
twi_state
= 0;
break;
}
#endif
TWCR
|= 0x80;
}