Subversion Repositories FlightCtrl

Rev

Rev 839 | Go to most recent revision | 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;
 }