Subversion Repositories FlightCtrl

Rev

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

Rev 272 Rev 275
Line 43... Line 43...
43
        switch (MM3.STATE)
43
        switch (MM3.STATE)
44
        {
44
        {
45
        case MM3_RESET:                        
45
        case MM3_RESET:                        
46
                PORTB |= (1<<PB2);      // J8 auf High, MM3 Reset
46
                PORTB |= (1<<PB2);      // J8 auf High, MM3 Reset
47
                MM3.STATE = MM3_START_TRANSFER;
47
                MM3.STATE = MM3_START_TRANSFER;
48
                break;
48
                return;
Line 49... Line 49...
49
               
49
               
50
        case MM3_START_TRANSFER:
50
        case MM3_START_TRANSFER:
Line 51... Line 51...
51
                PORTB &= ~(1<<PB2);     // J8 auf Low (war ~125 µs auf High)            
51
                PORTB &= ~(1<<PB2);     // J8 auf Low (war ~125 µs auf High)            
52
               
52
               
53
                if (MM3.AXIS == MM3_X) SPDR = 0x51;                     // Schreiben ins SPDR löst automatisch Übertragung (MOSI und MISO) aus
53
                if (MM3.AXIS == MM3_X) SPDR = 0x51;                     // Schreiben ins SPDR löst automatisch Übertragung (MOSI und MISO) aus
Line 54... Line 54...
54
                else if (MM3.AXIS == MM3_Y) SPDR = 0x52;                // Micromag Period Select ist auf 1024 (0x50)
54
                else if (MM3.AXIS == MM3_Y) SPDR = 0x52;                // Micromag Period Select ist auf 1024 (0x50)
55
                else if (MM3.AXIS == MM3_Z) SPDR = 0x53;                // 1: x-Achse, 2: Y-Achse, 3: Z-Achse
55
                else SPDR = 0x53;                                                               // if (MM3.AXIS == MM3_Z) 
56
               
56
               
Line 57... Line 57...
57
                MM3.DRDY = SetDelay(15);                // Laut Datenblatt max. Zeit bis Messung fertig (bei PS 1024)
57
                MM3.DRDY = SetDelay(15);                // Laut Datenblatt max. Zeit bis Messung fertig (bei PS 1024)
58
                MM3.STATE = MM3_WAIT_DRDY;
58
                MM3.STATE = MM3_WAIT_DRDY;
59
                break;
59
                return;
Line 60... Line 60...
60
       
60
       
61
        case MM3_WAIT_DRDY:
61
        case MM3_WAIT_DRDY:
62
                if (CheckDelay(MM3.DRDY)) {SPDR = 0x00;MM3.STATE = MM3_DRDY;} // Irgendwas ins SPDR, damit Übertragung ausgelöst wird, wenn Wartezeit vorbei
62
                if (CheckDelay(MM3.DRDY)) {SPDR = 0x00;MM3.STATE = MM3_DRDY;} // Irgendwas ins SPDR, damit Übertragung ausgelöst wird, wenn Wartezeit vorbei
63
                break;          // Jetzt gehts weiter in SIGNAL (SIG_SPI)
63
                return;         // Jetzt gehts weiter in SIGNAL (SIG_SPI)
64
       
64
       
65
        case MM3_TILT:          // Zeitnahe Speicherung der aktuellen Neigung in °
65
        case MM3_TILT:          // Zeitnahe Speicherung der aktuellen Neigung in °
66
                MM3.NickGrad = IntegralNick/(EE_Parameter.UserParam1*8);
66
                MM3.NickGrad = IntegralNick/(EE_Parameter.UserParam1*8);
67
                MM3.RollGrad = IntegralRoll/(EE_Parameter.UserParam2*8);
67
                MM3.RollGrad = IntegralRoll/(EE_Parameter.UserParam2*8);
Line 68... Line 68...
68
                MM3.AXIS = MM3_X;
68
                MM3.AXIS = MM3_X;
Line 78... Line 78...
78
//############################################################################
78
//############################################################################
79
{      
79
{      
80
        switch (MM3.STATE)
80
        switch (MM3.STATE)
81
        {      
81
        {      
82
        case MM3_DRDY:
82
        case MM3_DRDY:
83
                        // 1. Byte ist da, abspeichern, an die MSB-Stelle rücken und Übertragung von 2. Byte auslösen
83
                        // 1. Byte ist da, abspeichern, an die MSB-Stelle rücken
84
                if (MM3.AXIS == MM3_X) {MM3.x_axis=SPDR; MM3.x_axis<<=8; SPDR=0x00; MM3.STATE=MM3_X_BYTE2; break;}
84
                if (MM3.AXIS == MM3_X)
-
 
85
                        {
-
 
86
                        MM3.x_axis=SPDR;
-
 
87
                        MM3.x_axis<<=8;
-
 
88
                        }
85
                if (MM3.AXIS == MM3_Y) {MM3.y_axis=SPDR; MM3.y_axis<<=8; SPDR=0x00; MM3.STATE=MM3_Y_BYTE2; break;}
89
                else if (MM3.AXIS == MM3_Y)
-
 
90
                        {
-
 
91
                        MM3.y_axis=SPDR;
-
 
92
                        MM3.y_axis<<=8;
-
 
93
                        }
-
 
94
                else    // if (MM3.AXIS == MM3_Z)
-
 
95
                        {
-
 
96
                        MM3.z_axis=SPDR;
-
 
97
                        MM3.z_axis<<=8;
-
 
98
                        }
-
 
99
               
86
                if (MM3.AXIS == MM3_Z) {MM3.z_axis=SPDR; MM3.z_axis<<=8; SPDR=0x00; MM3.STATE=MM3_Z_BYTE2; break;}
100
                SPDR=0x00;                      // Übertragung von 2. Byte auslösen
-
 
101
                MM3.STATE=MM3_BYTE2;
-
 
102
                return;
87
       
103
               
88
        case MM3_X_BYTE2:       // 2. Byte der entsprechenden Achse ist da.             
104
        case MM3_BYTE2:                         // 2. Byte der entsprechenden Achse ist da.
-
 
105
                if (MM3.AXIS == MM3_X)
-
 
106
                        {
89
                MM3.x_axis |= SPDR;
107
                        MM3.x_axis |= SPDR;
90
                MM3.x_axis -= OFF_X;    // Sofort Offset aus der Kalibrierung berücksichtigen
108
                        MM3.x_axis -= OFF_X;
91
                MM3.AXIS = MM3_Y;
109
                        MM3.AXIS = MM3_Y;
92
                MM3.STATE = MM3_RESET;
110
                        MM3.STATE = MM3_RESET;
93
                break;
111
                        }
94
       
-
 
95
        case MM3_Y_BYTE2:
112
                else if (MM3.AXIS == MM3_Y)
-
 
113
                        {
96
                MM3.y_axis |= SPDR;            
114
                        MM3.y_axis |= SPDR;
97
                MM3.y_axis -= OFF_Y;
115
                        MM3.y_axis -= OFF_Y;
98
                MM3.AXIS = MM3_Z;
116
                        MM3.AXIS = MM3_Z;
99
                MM3.STATE = MM3_RESET;
117
                        MM3.STATE = MM3_RESET;
100
                break;
118
                        }
101
       
-
 
102
        case MM3_Z_BYTE2:
119
                else    // if (MM3.AXIS == MM3_Z)
-
 
120
                        {
103
                MM3.z_axis |= SPDR;
121
                        MM3.z_axis |= SPDR;
104
                MM3.z_axis -= OFF_Z;
122
                        MM3.z_axis -= OFF_Z;
105
                MM3.STATE = MM3_TILT;
123
                        MM3.STATE = MM3_TILT;
-
 
124
                        }
-
 
125
               
106
                break; 
126
                return;
107
        }
127
        }
108
}
128
}
Line 109... Line 129...
109
 
129
 
110
signed int MM3_heading(void)
130
signed int MM3_heading(void)