Subversion Repositories FlightCtrl

Rev

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;
 }