Advertisement
Guest User

compas6

a guest
May 24th, 2012
305
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.54 KB | None | 0 0
  1. #include <stm32f10x.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include "DWLOS_config.h"
  6. #include "DWLOS.h"
  7. #include "i2c_interrupt.h"
  8.  
  9. #define  __zLSM
  10. #include "main.h"
  11. #include "z_LSM.h"
  12. #include "z_S65.h"
  13.  
  14.  
  15.  
  16. //==============================================================================
  17. // LSM303 init
  18. //==============================================================================
  19. void LSM_init (void)
  20.  {
  21.   int LSM_tmp;
  22.  
  23.   LOG_ADD('L');
  24.  
  25.   if (LSM_step == 0 && I2C_IS_BLOCK())
  26.    {
  27.     Set_Timer (LSM_init, 100);
  28.     return;
  29.    }
  30.  
  31.   I2C_STOP_WAIT(LSM_I2C);
  32.   I2C_BLOCK;
  33.  
  34.   if (LSM_step < 5)
  35.     LSM_I2C -> M_OutFnc = &LSM_init;
  36.   else
  37.     LSM_I2C -> M_OutFnc = &LSM_init_end;
  38.  
  39.   LSM_tmp = LSM_step * 3;
  40.   LSM_I2C -> S_adress = LSM_init_arr [LSM_tmp];
  41.   I2C_MEM_ADR_NOT_TX(LSM_I2C);
  42.   I2C_DIRECTION_TX(LSM_I2C);
  43.   *(LSM_I2C -> M_Tx_Buffer + 0) = LSM_init_arr [LSM_tmp + 1];
  44.   *(LSM_I2C -> M_Tx_Buffer + 1) = LSM_init_arr [LSM_tmp + 2];
  45.  
  46.   LSM_step ++;
  47.  
  48.   LSM_I2C -> Tx_count = 2;
  49.   I2C_START(LSM_I2C);
  50.  
  51.  }
  52.  
  53. void LSM_init_end (void)
  54.  {
  55.   I2C_STOP_WAIT(LSM_I2C);
  56.  
  57.   if (LSM_step == 6)
  58.     I2C_UNBLOCK;
  59.  
  60.   LSM_step = 0;
  61.   AX_read_byte = 0;
  62.  
  63.   LSM_TEST_ON;
  64.  
  65.   LSM_I2C -> M_OutFnc = &I2C_idle_out;
  66.   Set_Timer (MAG_read, 500);
  67.   Set_Timer (AX_read, 750);
  68.   LOG_ADD('l');
  69.  }
  70.  
  71.  
  72.  
  73.  
  74. //==============================================================================
  75. // LSM303 read register
  76. //==============================================================================
  77. void MAG_read (void)
  78.  {
  79.   LOG_ADD('M');
  80.  
  81.   if (I2C_IS_BLOCK())
  82.    {
  83.     Set_Timer (MAG_read, 100);
  84.    }
  85.   else
  86.    {
  87.     I2C_BLOCK;
  88.     LSM_I2C -> M_OutFnc = &MAG_read_end;
  89.     LSM_I2C -> S_adress = I2C_M_ADR;
  90.     I2C_MEM_ADR_TX(LSM_I2C);
  91.     *(LSM_I2C -> I2C_MEM_ADRESS) = LSM303_OUT_X_M;
  92.     I2C_DIRECTION_TX(LSM_I2C);
  93.     LSM_I2C -> Tx_count = 0;
  94.     LSM_I2C -> Rx_count = I2C_M_READ_COUNT;
  95.     I2C_START(LSM_I2C);
  96.    }
  97.  }
  98.  
  99. void MAG_read_end (void)
  100.  {
  101.   uint16_t tmp;
  102.   float ftmp;
  103.  
  104.   LOG_ADD('m');
  105.   WDG_reload ();
  106.   Set_Timer (MAG_read, 1000);
  107.   LSM_TEST_ON;
  108.  
  109.   I2C_READ_END(LSM_I2C);
  110.   I2C_STOP_WAIT(LSM_I2C);
  111.   I2C_UNBLOCK;
  112.   tmp = (int16_t) LSM_I2C -> I2C -> DR;
  113.   tmp ++;
  114.  
  115.   MAG_X = ((*(LSM_I2C -> M_Rx_Buffer + 0)) << 8) | ((*(LSM_I2C -> M_Rx_Buffer + 1)) & 0xFF);
  116.   MAG_Y = ((*(LSM_I2C -> M_Rx_Buffer + 2)) << 8) | ((*(LSM_I2C -> M_Rx_Buffer + 3)) & 0xFF);
  117.   MAG_Z = ((*(LSM_I2C -> M_Rx_Buffer + 4)) << 8) | ((*(LSM_I2C -> M_Rx_Buffer + 5)) & 0xFF);
  118.  
  119. /*  S65 -> x = 3;
  120.   S65 -> y = 130;
  121. //  sprintf (S65 -> txt, "%4d %4d %4d", MAG_X, MAG_Y, MAG_Z);
  122.   sprintf (S65 -> txt, "%4d", (signed char)(((MAG_X >> 3) & 0x1FFF) | ((MAG_X & (1 << 15)) >> 8)));
  123.   S65 -> len = strlen (S65 -> txt);
  124.   S65_puts_n ();// */
  125.  
  126.   S65 -> x = 11;
  127.   S65 -> y = 121;
  128. //  S65 -> txt [0] = (char)(((MAG_X >> 3) & 0x1FFF) | ((MAG_X & (1 << 15)) >> 8));
  129. //  S65 -> txt [1] = (char)(((MAG_Y >> 3) & 0x1FFF) | ((MAG_Y & (1 << 15)) >> 8));
  130.  
  131.   ftmp = atan2 (MAG_Y, MAG_X);
  132. //  S65 -> txt [0] = (signed char)(20.0*cos (ftmp));
  133. //  S65 -> txt [1] = (signed char)(20.0*sin (ftmp));
  134.   memcpy (S65 -> txt, &ftmp, sizeof (float));
  135.   S65_puts_M ();
  136.  }
  137.  
  138.  
  139. void AX_read (void)
  140.  {
  141.   LOG_ADD('A');
  142.  
  143.   if (I2C_IS_BLOCK())
  144.    {
  145.     Set_Timer (AX_read, 100);
  146.    }
  147.   else
  148.    {
  149.     I2C_BLOCK;
  150.     LSM_I2C -> M_OutFnc = &AX_read_end;
  151.     LSM_I2C -> S_adress = I2C_A_ADR;
  152.     I2C_MEM_ADR_TX(LSM_I2C);
  153.     *(LSM_I2C -> I2C_MEM_ADRESS) = LSM303_OUT_X_A + AX_read_byte;
  154.     I2C_DIRECTION_TX(LSM_I2C);
  155.     LSM_I2C -> Tx_count = 0;
  156.     LSM_I2C -> Rx_count = 1;
  157.     I2C_START(LSM_I2C);
  158.    }
  159.  }
  160.  
  161. void AX_read_end (void)
  162.  {
  163.   uint16_t tmp;
  164.   float ftmp;
  165.  
  166.   static int16_t AX_X, AX_Y, AX_Z;
  167.   static int16_t AX_X_prev, AX_Y_prev, AX_Z_prev;
  168.  
  169.   static float AX_I1_X, AX_I1_Y, AX_I1_Z;
  170.   static float AX_I1_X_prev, AX_I1_Y_prev, AX_I1_Z_prev;
  171.  
  172.   static float AX_I2_X, AX_I2_Y, AX_I2_Z;
  173.  
  174.   LOG_ADD('a');
  175.   LSM_TEST_ON;
  176.  
  177.   I2C_READ_END(LSM_I2C);
  178.   I2C_STOP_WAIT(LSM_I2C);
  179.   I2C_UNBLOCK;
  180.  
  181.   tmp = (int16_t) LSM_I2C -> I2C -> DR;
  182.   tmp ++;
  183.  
  184.   if (AX_read_byte < 6)
  185.    {
  186.     AX_Buffer [AX_read_byte] = *(LSM_I2C -> M_Rx_Buffer);
  187.     AX_read_byte ++;
  188.  
  189.     Set_Task (AX_read);
  190.    }
  191.   else
  192.    {
  193.     WDG_reload ();
  194.     AX_read_byte = 0;
  195.     Set_Timer (AX_read, 100);
  196.  
  197.  
  198.     LOG_ADD('P');
  199.  
  200.     AX_X = (int16_t)((AX_Buffer [1] << 8) | (AX_Buffer [0] & 0xFF));
  201.     AX_Y = (int16_t)((AX_Buffer [3] << 8) | (AX_Buffer [2] & 0xFF));
  202.     AX_Z = (int16_t)((AX_Buffer [5] << 8) | (AX_Buffer [4] & 0xFF));
  203.  
  204.     if (AX_X < 500 && AX_X > -500) AX_X = 0;
  205.     if (AX_Y < 500 && AX_Y > -500) AX_Y = 0;
  206.  
  207.     ftmp = AX_X * 0.00006;
  208.     AX_I1_X += (AX_X_prev + (ftmp)) * 0.1 / 2;
  209.     AX_X_prev = ftmp;
  210.  
  211.     ftmp = AX_Y * 0.00006;
  212.     AX_I1_Y += (AX_Y_prev + (ftmp)) * 0.1 / 2;
  213.     AX_Y_prev = ftmp;
  214.  
  215.     AX_I2_X += (AX_I1_X_prev + AX_I1_X) * 0.1 / 2;
  216.     AX_I2_Y += (AX_I1_Y_prev + AX_I1_Y) * 0.1 / 2;
  217.  
  218.     S65 -> x = 1;
  219.     S65 -> y = 147;
  220. //    sprintf (S65 -> txt, " %4d %4d", AX_X, AX_Y);
  221.     sprintf (S65 -> txt, "_%5.3f %5.3f", AX_I1_X, AX_I2_X);
  222.     S65 -> len = strlen (S65 -> txt);
  223.     S65_puts_n ();// */
  224.  
  225. /*    S65 -> x = 71;
  226.     S65 -> y = 130;
  227.     sprintf (S65 -> txt, " %5d", AX_X);
  228.     S65 -> len = strlen (S65 -> txt);
  229.     S65_puts_n ();// */
  230.  
  231.     S65 -> x = 71;
  232.     S65 -> y = 121;
  233.     S65 -> txt [0] = (signed char)(AX_X * 0.00076);
  234.     S65 -> txt [1] = (signed char)(AX_Y * 0.00076);
  235.     S65_puts_A ();
  236.  
  237.     AX_I1_X_prev = AX_I1_X;
  238.     AX_I1_Y_prev = AX_I1_Y;
  239.     AX_I1_Z_prev = AX_I1_Z;
  240.    }
  241.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement