Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 274 → Rev 275

/branches/v0.60_MicroMag3_Nick666/compass.c
45,7 → 45,7
case MM3_RESET:
PORTB |= (1<<PB2); // J8 auf High, MM3 Reset
MM3.STATE = MM3_START_TRANSFER;
break;
return;
case MM3_START_TRANSFER:
PORTB &= ~(1<<PB2); // J8 auf Low (war ~125 µs auf High)
52,15 → 52,15
if (MM3.AXIS == MM3_X) SPDR = 0x51; // Schreiben ins SPDR löst automatisch Übertragung (MOSI und MISO) aus
else if (MM3.AXIS == MM3_Y) SPDR = 0x52; // Micromag Period Select ist auf 1024 (0x50)
else if (MM3.AXIS == MM3_Z) SPDR = 0x53; // 1: x-Achse, 2: Y-Achse, 3: Z-Achse
else SPDR = 0x53; // if (MM3.AXIS == MM3_Z)
MM3.DRDY = SetDelay(15); // Laut Datenblatt max. Zeit bis Messung fertig (bei PS 1024)
MM3.STATE = MM3_WAIT_DRDY;
break;
return;
case MM3_WAIT_DRDY:
if (CheckDelay(MM3.DRDY)) {SPDR = 0x00;MM3.STATE = MM3_DRDY;} // Irgendwas ins SPDR, damit Übertragung ausgelöst wird, wenn Wartezeit vorbei
break; // Jetzt gehts weiter in SIGNAL (SIG_SPI)
return; // Jetzt gehts weiter in SIGNAL (SIG_SPI)
case MM3_TILT: // Zeitnahe Speicherung der aktuellen Neigung in °
MM3.NickGrad = IntegralNick/(EE_Parameter.UserParam1*8);
67,7 → 67,7
MM3.RollGrad = IntegralRoll/(EE_Parameter.UserParam2*8);
MM3.AXIS = MM3_X;
MM3.STATE = MM3_RESET;
break;
return;
}
}
80,30 → 80,50
switch (MM3.STATE)
{
case MM3_DRDY:
// 1. Byte ist da, abspeichern, an die MSB-Stelle rücken und Übertragung von 2. Byte auslösen
if (MM3.AXIS == MM3_X) {MM3.x_axis=SPDR; MM3.x_axis<<=8; SPDR=0x00; MM3.STATE=MM3_X_BYTE2; break;}
if (MM3.AXIS == MM3_Y) {MM3.y_axis=SPDR; MM3.y_axis<<=8; SPDR=0x00; MM3.STATE=MM3_Y_BYTE2; break;}
if (MM3.AXIS == MM3_Z) {MM3.z_axis=SPDR; MM3.z_axis<<=8; SPDR=0x00; MM3.STATE=MM3_Z_BYTE2; break;}
case MM3_X_BYTE2: // 2. Byte der entsprechenden Achse ist da.
MM3.x_axis |= SPDR;
MM3.x_axis -= OFF_X; // Sofort Offset aus der Kalibrierung berücksichtigen
MM3.AXIS = MM3_Y;
MM3.STATE = MM3_RESET;
break;
case MM3_Y_BYTE2:
MM3.y_axis |= SPDR;
MM3.y_axis -= OFF_Y;
MM3.AXIS = MM3_Z;
MM3.STATE = MM3_RESET;
break;
case MM3_Z_BYTE2:
MM3.z_axis |= SPDR;
MM3.z_axis -= OFF_Z;
MM3.STATE = MM3_TILT;
break;
// 1. Byte ist da, abspeichern, an die MSB-Stelle rücken
if (MM3.AXIS == MM3_X)
{
MM3.x_axis=SPDR;
MM3.x_axis<<=8;
}
else if (MM3.AXIS == MM3_Y)
{
MM3.y_axis=SPDR;
MM3.y_axis<<=8;
}
else // if (MM3.AXIS == MM3_Z)
{
MM3.z_axis=SPDR;
MM3.z_axis<<=8;
}
SPDR=0x00; // Übertragung von 2. Byte auslösen
MM3.STATE=MM3_BYTE2;
return;
case MM3_BYTE2: // 2. Byte der entsprechenden Achse ist da.
if (MM3.AXIS == MM3_X)
{
MM3.x_axis |= SPDR;
MM3.x_axis -= OFF_X;
MM3.AXIS = MM3_Y;
MM3.STATE = MM3_RESET;
}
else if (MM3.AXIS == MM3_Y)
{
MM3.y_axis |= SPDR;
MM3.y_axis -= OFF_Y;
MM3.AXIS = MM3_Z;
MM3.STATE = MM3_RESET;
}
else // if (MM3.AXIS == MM3_Z)
{
MM3.z_axis |= SPDR;
MM3.z_axis -= OFF_Z;
MM3.STATE = MM3_TILT;
}
return;
}
}
 
/branches/v0.60_MicroMag3_Nick666/compass.h
25,9 → 25,7
#define MM3_START_TRANSFER 1
#define MM3_WAIT_DRDY 2
#define MM3_DRDY 3
#define MM3_X_BYTE2 4
#define MM3_Y_BYTE2 5
#define MM3_Z_BYTE2 6
#define MM3_BYTE2 4
#define MM3_X 7
#define MM3_Y 8
#define MM3_Z 9