Subversion Repositories FlightCtrl

Rev

Rev 465 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 465 Rev 476
Line 1... Line 1...
1
/*############################################################################
1
/*############################################################################
2
############################################################################*/
2
############################################################################*/
Line 3... Line 3...
3
 
3
 
Line 4... Line 4...
4
#include "main.h"
4
#include "main.h"
5
 
5
 
6
unsigned char twi_state = 0;
-
 
7
unsigned char motor = 0;
6
volatile unsigned char twi_state = 0;
Line 8... Line 7...
8
unsigned char motorread = 0;
7
volatile unsigned char motor = 0;
9
unsigned char motor_rx[8];
8
volatile unsigned char motor_rx[8];
10
 
9
 
11
//############################################################################
10
//############################################################################
Line 41... Line 40...
41
    TWDR = byte;
40
    TWDR = byte;
42
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
41
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
43
}
42
}
Line 44... Line 43...
44
 
43
 
-
 
44
//############################################################################
-
 
45
// I2C receive byte and send ACK
-
 
46
void i2c_receive_byte(void)
-
 
47
//############################################################################
-
 
48
{
-
 
49
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);
-
 
50
}
-
 
51
 
-
 
52
//############################################################################
-
 
53
// I2C receive last byte and send NOT ACK
-
 
54
void i2c_receive_last_byte(void)
-
 
55
//############################################################################
-
 
56
{
-
 
57
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
-
 
58
}
-
 
59
 
45
//############################################################################
60
//############################################################################
46
//Start I2C
61
//Start I2C
47
SIGNAL (TWI_vect)
62
SIGNAL (TWI_vect)
48
//############################################################################
63
//############################################################################
-
 
64
{
-
 
65
    static unsigned char motorread = 0;
49
{
66
 
50
    switch (twi_state++)        // First i2c_start from SendMotorData()
67
    switch (twi_state++) // First i2c_start from SendMotorData()
51
        {
68
    {
52
                // Master Transmit
69
        // Master Transmit
53
        case 0: // Address Slave SL+W
70
        case 0: // Address Slave SL+W
54
                i2c_write_byte(0x52+(motor*2));
71
                i2c_write_byte(0x52+(motor*2));
55
                break;
72
                break;
56
        case 1: // Send Data
73
        case 1: // Send Data
57
                switch(motor++)
74
                switch(motor++)
58
                    {
75
                {
59
                    case 0:
76
                    case 0:
60
                            i2c_write_byte(Motor_Vorne);
77
                            i2c_write_byte(Motor_Vorne);
61
                            break;
78
                            break;
62
                    case 1:      
79
                    case 1:      
Line 66... Line 83...
66
                            i2c_write_byte(Motor_Rechts);
83
                            i2c_write_byte(Motor_Rechts);
67
                            break;
84
                            break;
68
                    case 3:
85
                    case 3:
69
                            i2c_write_byte(Motor_Links);
86
                            i2c_write_byte(Motor_Links);
70
                            break;
87
                            break;
71
                    }
88
                }
72
                break;
89
                break;
73
        case 2: // Repeat case 0+1 for all Slaves
90
        case 2: // Repeat case 0+1 for all Slaves
74
                if (motor < 4) twi_state = 0;
91
                if (motor < 4) twi_state = 0;
75
                i2c_start();    // Repeated start -> switch salve and switch Master Transmit <-> Master Receive respectively
92
                i2c_start(); // Repeated start -> switch salve or switch Master Transmit -> Master Receive
76
                break;
93
                break;
77
                 
94
 
78
        // Master Receive
95
        // Master Receive
79
        case 3: // Address Slave SL+R
96
        case 3: // Address Slave SL+R
80
                i2c_write_byte(0x53+(motorread*2));
97
                i2c_write_byte(0x53+(motorread*2));
81
                break;
98
                break;
82
        case 4: //1. Byte vom Motor lesen       
99
        case 4: //1. Byte vom Motor übertragen
-
 
100
                i2c_receive_byte();
-
 
101
                break;
-
 
102
        case 5: // 1. Byte lesen und 2. Byte übertragen
83
                motor_rx[motorread] = TWDR;
103
                motor_rx[motorread] = TWDR;
84
                                TWCR |= (1<<TWINT);
104
                i2c_receive_last_byte();
85
                                break;
105
                break;
86
        case 5: //2. Byte vom Motor lesen       
106
        case 6: //2. Byte lesen
87
                motor_rx[motorread+4] = TWDR;
107
                motor_rx[motorread+4] = TWDR;
88
                motorread++;
108
                motorread++;
89
                                if (motorread > 3) motorread=0;
109
                if (motorread > 3) motorread=0;
90
                default:
110
        default:
91
                i2c_stop();
111
                i2c_stop();
92
                twi_state = 0;
112
                twi_state = 0;
93
                                motor = 0;
113
                motor = 0;
94
        }
114
    }
95
}
115
}