Subversion Repositories FlightCtrl

Rev

Rev 1211 | Rev 1378 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ingob 1
/*############################################################################
2
############################################################################*/
3
 
4
#include "main.h"
5
 
918 hbuss 6
volatile unsigned char twi_state = 0;
1 ingob 7
unsigned char motor = 0;
1210 hbuss 8
unsigned char motorread = 0,MissingMotor = 0;
1209 hbuss 9
unsigned char motor_rx[16],motor_rx2[16];
1210 hbuss 10
unsigned char MotorPresent[MAX_MOTORS];
1211 hbuss 11
unsigned char MotorError[MAX_MOTORS];
1322 hbuss 12
unsigned int I2CError = 0;
1 ingob 13
 
14
//############################################################################
15
//Initzialisieren der I2C (TWI) Schnittstelle
16
void i2c_init(void)
17
//############################################################################
18
{
19
  TWSR = 0;
20
  TWBR = ((SYSCLK/SCL_CLOCK)-16)/2;
21
}
22
 
23
//############################################################################
24
//Start I2C
1209 hbuss 25
void i2c_start(void)
1 ingob 26
//############################################################################
27
{
28
    TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);
29
}
30
 
31
//############################################################################
32
void i2c_stop(void)
33
//############################################################################
34
{
35
    TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
36
}
37
 
173 holgerb 38
void i2c_reset(void)
1 ingob 39
//############################################################################
173 holgerb 40
{
41
                 i2c_stop();                
42
                 twi_state = 0;
43
                 motor = TWDR;
44
                 motor = 0;
45
                 TWCR = 0x80;
46
                 TWAMR = 0;
47
                 TWAR = 0;
48
                 TWDR = 0;
49
                 TWSR = 0;
50
                 TWBR = 0;
51
                 i2c_init();
52
                 i2c_start();
53
                 i2c_write_byte(0);
54
}
55
 
56
//############################################################################
1209 hbuss 57
void i2c_write_byte(char byte)
1 ingob 58
//############################################################################
59
{
60
    TWSR = 0x00;
61
    TWDR = byte;
62
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
63
}
64
 
1209 hbuss 65
/****************************************/
66
/*    Write to I2C                      */
67
/****************************************/
68
void I2C_WriteByte(int8_t byte)
69
{
70
    // move byte to send into TWI Data Register
71
    TWDR = byte;
72
    // clear interrupt flag (TWINT = 1)
73
    // enable i2c bus (TWEN = 1)
74
    // enable interrupt (TWIE = 1)
75
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
76
}
77
 
78
/****************************************/
79
/*    Receive byte and send ACK         */
80
/****************************************/
81
void I2C_ReceiveByte(void)
82
{
83
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);
84
}
85
 
86
/****************************************/
87
/* I2C receive last byte and send no ACK*/
88
/****************************************/
89
void I2C_ReceiveLastByte(void)
90
{
91
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
92
}
93
 
94
 
95
 
1 ingob 96
//############################################################################
97
SIGNAL (TWI_vect)
98
//############################################################################
99
{
1211 hbuss 100
 static unsigned char missing_motor;
1210 hbuss 101
     switch(twi_state++)
1 ingob 102
        {
1210 hbuss 103
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
104
// Writing the Data
105
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 106
        case 0:
1210 hbuss 107
                        while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++;  // skip if not used
108
                                if(motor == MAX_MOTORS)  // writing finished -> now read 
109
                                {
110
                                 motor = 0;
111
                                 twi_state = 3;
112
                                 i2c_write_byte(0x53+(motorread*2));
113
                                 }
1209 hbuss 114
                                else i2c_write_byte(0x52+(motor*2));
1 ingob 115
                break;
116
        case 1:
1209 hbuss 117
                i2c_write_byte(Motor[motor++]);
1111 hbuss 118
                break;
119
        case 2:
1322 hbuss 120
                if(TWSR == 0x30)
121
                                 {
122
                                  if(!missing_motor) missing_motor = motor;
123
                                  if(++MotorError[motor-1] == 0) MotorError[motor-1] = 255;
124
                                 }
1111 hbuss 125
                i2c_stop();
1210 hbuss 126
                I2CTimeout = 10;
1209 hbuss 127
                twi_state = 0;
1111 hbuss 128
                i2c_start();  
129
                break;
1210 hbuss 130
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
131
// Reading Data
132
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1111 hbuss 133
        case 3:
1211 hbuss 134
               //Transmit 1st byte for reading
1210 hbuss 135
                if(TWSR != 0x40)  // Error?
1211 hbuss 136
                 {
137
                  MotorPresent[motorread] = 0;
138
                  motorread++;
139
                  if(motorread >= MAX_MOTORS) motorread = 0;
140
                  i2c_stop();
1210 hbuss 141
                  twi_state = 0;
142
                 }
1211 hbuss 143
                 else
144
                 {
1210 hbuss 145
                  MotorPresent[motorread] = ('1' - '-') + motorread;
1211 hbuss 146
                  I2C_ReceiveByte();
147
                 }
1210 hbuss 148
                MissingMotor = missing_motor;
1211 hbuss 149
                missing_motor = 0;
1111 hbuss 150
                break;
1210 hbuss 151
        case 4: //Read 1st byte and transmit 2nd Byte
1111 hbuss 152
                motor_rx[motorread] = TWDR;
1209 hbuss 153
                I2C_ReceiveLastByte(); //nack
154
                break;
1210 hbuss 155
        case 5:
1209 hbuss 156
                //Read 2nd byte
157
                motor_rx2[motorread++] = TWDR;
1211 hbuss 158
                if(motorread >= MAX_MOTORS) motorread = 0;
1111 hbuss 159
                i2c_stop();
1209 hbuss 160
                twi_state = 0;
1111 hbuss 161
                break;
1211 hbuss 162
 
1210 hbuss 163
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
164
// writing Gyro-Offset
165
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
166
        case 8:
1111 hbuss 167
                i2c_write_byte(0x98); // Address of the DAC
168
                break;
169
        case 9:
170
                i2c_write_byte(0x10); // Update Channel A
171
                break;
172
        case 10:
173
                i2c_write_byte(AnalogOffsetNick); // Value
174
                break;
175
        case 11:
176
                i2c_write_byte(0x80); // Value
177
                break;
178
        case 12:
179
                i2c_stop();              
180
                I2CTimeout = 10;
181
                i2c_start();  
182
                break;
183
        case 13:
184
                i2c_write_byte(0x98); // Address of the DAC
185
                break;
186
        case 14:
187
                i2c_write_byte(0x12); // Update Channel B
188
                break;
189
        case 15:
190
                i2c_write_byte(AnalogOffsetRoll); // Value
191
                break;
192
        case 16:
193
                i2c_write_byte(0x80); // Value
194
                break;
195
        case 17:
196
                i2c_stop();              
197
                I2CTimeout = 10;
198
                i2c_start();  
199
                break;
200
        case 18:
201
                i2c_write_byte(0x98); // Address of the DAC
202
                break;
203
        case 19:
204
                i2c_write_byte(0x14); // Update Channel C
205
                break;
206
        case 20:
207
                i2c_write_byte(AnalogOffsetGier); // Value
208
                break;
209
        case 21:
210
                i2c_write_byte(0x80); // Value
211
                break;
212
        case 22:
213
                i2c_stop();              
214
                I2CTimeout = 10;
215
                twi_state = 0;
216
                break;
1209 hbuss 217
        default: twi_state = 0;
218
                break;        
219
                }
1111 hbuss 220
 TWCR |= 0x80;
221
}