Subversion Repositories MK3Mag

Rev

Rev 13 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
12 hbuss 1
/*#######################################################################################
2
MK3Mag 3D-Magnet sensor
3
!!! THIS IS NOT FREE SOFTWARE !!!                                                      
4
#######################################################################################*/
5
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6
// + Copyright (c) 05.2008 Holger Buss
7
// + Thanks to Ilja Fähnrich (P_Latzhalter)
62 ingob 8
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
12 hbuss 9
// + www.MikroKopter.com
10
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
62 ingob 11
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
12 hbuss 12
// + mit unserer Zustimmung zulässig
13
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
14
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), 
15
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. 
16
// + AUSNAHME: Ein bei www.mikrokopter.de erworbener vorbestückter MK3Mag darf als Baugruppe auch in kommerziellen Systemen verbaut werden
17
// + Im Zweifelsfall bitte anfragen bei: info@mikrokopter.de
18
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
19
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, 
20
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
21
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
23
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
24
// + eindeutig als Ursprung verlinkt werden
25
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
26
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
27
// + Benutzung auf eigene Gefahr
28
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
29
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
62 ingob 30
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
31
// + mit unserer Zustimmung zulässig
32
/// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12 hbuss 33
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
34
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
35
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, 
36
// + this list of conditions and the following disclaimer.
62 ingob 37
// +   * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
12 hbuss 38
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
39
// +     from this software without specific prior written permission.
40
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permittet 
41
// +     for non-commercial use (directly or indirectly)
42
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted 
43
// +     with our written permission
44
// +     Exception: A preassembled MK3Mag, purchased from www.mikrokopter.de may be used as a part of commercial systems
45
// +     In case of doubt please contact: info@MikroKopter.de
46
// +   * If sources or documentations are redistributet on other webpages, our webpage (http://www.MikroKopter.de) must be 
47
// +     clearly linked as origin 
48
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
49
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
52
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
53
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
54
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
55
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
56
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
57
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
58
// +  POSSIBILITY OF SUCH DAMAGE. 
59
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 ingob 60
 
61
#include <avr/io.h>
62
#include <util/twi.h>
63
#include "main.h"
64
 
3 ingob 65
unsigned char I2C_RxBufferSize, I2C_TxBufferSize;
66
unsigned char *I2C_TxBuffer, *I2C_RxBuffer;
67
unsigned char Tx_Idx=0, Rx_Idx=0, I2C_Direction;
68
unsigned char I2C_Command;
69
unsigned char Tx_Idx, Rx_Idx;
1 ingob 70
 
3 ingob 71
struct str_I2C_Heading       I2C_Heading;
72
struct str_I2C_WriteNickRoll I2C_WriteNickRoll;
73
struct str_I2C_Mag           I2C_Mag;
74
struct str_I2C_EEPROM        I2C_ReadEEPROM, I2C_WriteEEPROM;
75
struct str_I2C_Version       I2C_Version;
7 hbuss 76
struct str_I2C_WriteCal      I2C_WriteCal;
3 ingob 77
 
78
 
79
 
1 ingob 80
//############################################################################
81
//I2C (TWI) Interface Init
3 ingob 82
void InitIC2_Slave(void)
1 ingob 83
//############################################################################
84
{
3 ingob 85
    TWAR = I2C_SLAVE_ADDRESS; // Eigene Adresse setzen 
1 ingob 86
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);
3 ingob 87
 
88
 
89
        I2C_Version.Hauptversion = VersionInfo.Hauptversion;
90
        I2C_Version.Nebenversion = VersionInfo.Nebenversion;
91
        I2C_Version.Comp = 1;
92
 
1 ingob 93
}
3 ingob 94
#define TWCR_ACK TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC)
1 ingob 95
//############################################################################
96
//ISR, die bei einem Ereignis auf dem Bus ausgelöst wird. Im Register TWSR befindet
97
//sich dann ein Statuscode, anhand dessen die Situation festgestellt werden kann.
98
ISR (TWI_vect)
99
//############################################################################
100
{  
101
    switch (TWSR & 0xF8)
102
        {  
103
        case SR_SLA_ACK:  
3 ingob 104
            //TWCR |= (1<<TWINT);
105
            Rx_Idx = 0;
106
 
107
                        TWCR_ACK;
1 ingob 108
            return;
109
        // Daten Empfangen
110
        case SR_PREV_ACK:
3 ingob 111
 
112
                        if (Rx_Idx  == 0)
113
                        { I2C_Command = TWDR;
114
 
115
                          switch(I2C_Command)
116
                          {
117
                             case I2C_CMD_VERSION:
118
                                                I2C_TxBuffer = (unsigned char *)&I2C_Version;
119
                                                I2C_TxBufferSize = sizeof(I2C_Version);
120
                                                I2C_RxBufferSize = 0;
121
                                break;
122
                                case I2C_CMD_WRITE_EEPROM:
123
                                                I2C_TxBufferSize = 0;
124
                                                I2C_RxBuffer = (unsigned char *)&I2C_WriteEEPROM;
125
                                                I2C_RxBufferSize = sizeof(I2C_WriteEEPROM);
126
                                break;
7 hbuss 127
 
128
                                case I2C_CMD_WRITE_CAL:
129
                                                I2C_TxBufferSize = 0;
130
                                                I2C_RxBuffer = (unsigned char *)&I2C_WriteCal;
131
                                                I2C_RxBufferSize = sizeof(I2C_WriteCal);
132
                                break;
133
 
3 ingob 134
                                case I2C_CMD_READ_EEPROM:
135
                                                I2C_TxBuffer = (unsigned char *)&I2C_ReadEEPROM.Inhalt;
136
                                                I2C_TxBufferSize = 2;
137
                                                I2C_RxBuffer = (unsigned char *)&I2C_ReadEEPROM;
138
                                                I2C_RxBufferSize = 1;
139
                                break;
140
                                case I2C_CMD_READ_MAG:
141
                                                I2C_TxBuffer = (unsigned char *)&I2C_Mag;
142
                                                I2C_TxBufferSize = sizeof(I2C_Mag);
143
                                                I2C_RxBufferSize = 0;
144
 
145
                                                I2C_Mag.MagX = MagnetN;
146
                                                I2C_Mag.MagY = MagnetR;
147
                                                I2C_Mag.MagZ = MagnetZ;
148
 
149
                                break;
150
                                case I2C_CMD_READ_HEADING:
151
                                                I2C_TxBuffer = (unsigned char *)&I2C_Heading;
152
                                                I2C_TxBufferSize = sizeof(I2C_Heading);
153
                                                I2C_RxBuffer =  (unsigned char *)&I2C_WriteNickRoll;
154
                                                I2C_RxBufferSize = sizeof(I2C_WriteNickRoll);
155
 
156
                                                I2C_Heading.Heading = Heading;
7 hbuss 157
                                                ExternData.Winkel[NICK] = I2C_WriteNickRoll.Nick;
158
                                                ExternData.Winkel[ROLL] = I2C_WriteNickRoll.Roll;
3 ingob 159
                                break;
160
                          }
161
                        }
162
                        else
163
                        {
4 ingob 164
                          if ((Rx_Idx-1) < I2C_RxBufferSize) I2C_RxBuffer[Rx_Idx-1] = TWDR;
3 ingob 165
                        }
166
 
167
                        Rx_Idx++;
168
 
169
 
1 ingob 170
            I2C_Timeout = 500;
3 ingob 171
            //TWCR |= (1<<TWINT);
172
                        TWCR_ACK;
1 ingob 173
            return;
174
        // Daten Senden
3 ingob 175
 
1 ingob 176
        case SW_SLA_ACK:  
3 ingob 177
            Tx_Idx = 0;
178
 
179
                        if (I2C_TxBufferSize > 0) TWDR = I2C_TxBuffer[Tx_Idx++];
180
 
181
//            TWCR |= (1<<TWINT) | (1<< TWEA);
182
             TWCR_ACK;
1 ingob 183
            return;
184
        // Daten Senden
3 ingob 185
                case SW_DATA_ACK:
186
            if (Tx_Idx < I2C_TxBufferSize) TWDR = I2C_TxBuffer[Tx_Idx++];
187
                         else TWDR = 0x00;
188
                        //TWCR |= (1<<TWINT) | (1<< TWEA);
189
                        TWCR_ACK;
1 ingob 190
            return;
191
        // Bus-Fehler zurücksetzen
192
        case TWI_BUS_ERR_2:
193
            TWCR |=(1<<TWSTO) | (1<<TWINT);
194
        // Bus-Fehler zurücksetzen   
195
        case TWI_BUS_ERR_1:
196
            TWCR |=(1<<TWSTO) | (1<<TWINT);
197
        }
198
    TWCR =(1<<TWEA) | (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // TWI Reset
199
}
200
 
201