Subversion Repositories FlightCtrl

Rev

Rev 440 | Blame | Last modification | View Log | RSS feed

/*############################################################################
############################################################################*/


#include "main.h"

unsigned char motor_rx[8];

//############################################################################
//Initzialisieren der I2C (TWI) Schnittstelle
void i2c_init(void)
//############################################################################
{
  TWSR = 0;
  TWBR = ((SYSCLK/SCL_CLOCK)-16)/2;
}

//############################################################################
//Start I2C
void i2c_start(void)
//############################################################################
{
    TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);
}

//############################################################################
//Stop I2C
void i2c_stop(void)
//############################################################################
{
    TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
}

//############################################################################
//Write to I2C
void i2c_write_byte(char byte)
//############################################################################
{
    TWDR = byte;
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
}

//############################################################################
//ISR
SIGNAL (TWI_vect)
//############################################################################
{
        static unsigned char twi_state = 0;
        static unsigned char motor = 0;
        static unsigned char motorread = 0;
       
    switch (twi_state++)
        {
        case 0:
                i2c_write_byte(0x52+(motor*2));
                break;
        case 1:
                switch(motor++)
                    {
                    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 2:
                if (motor<4) twi_state = 0;
                i2c_start();  
                break;
                   
        //Liest Daten von Motor
        case 3:
                i2c_write_byte(0x53+(motorread*2));
                break;
        case 4:
                                i2c_write_byte(0xFF);
                break;
        case 5: // 1. Byte vom Motor lesen      
                motor_rx[motorread] = TWDR;
                                i2c_write_byte(0xFF);
                                break;
        case 6: // 2. Byte vom Motor lesen      
                motor_rx[motorread+4] = TWDR;
                motorread++;
                if (motorread>3) motorread=0;
                default:
                i2c_stop();
                twi_state = 0;
                                motor = 0;
        }
}