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