Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.51 KB | None | 0 0
  1. #include <stdio.h>
  2. #include "C8051F020.h"
  3. #include "c8051F020_SFR16.h"
  4. #include "FO_M2__Structures_COMMANDES_INFORMATIONS_Serializer.h"
  5. #include "cmd_motor.h"
  6.  
  7. const float mm_to_tick = ((float)TICK_TOUR)/(2.0*M_PI*((float)DIAMETRE_ROUE)/2.0);
  8.  
  9. COMMANDES_SERIALIZER motors;
  10. INFORMATIONS_SERIALIZER info_motors;
  11. char str[30];
  12. char recep_string[30];
  13. //-----------------------------------------------------------------------------
  14. // Config oscillateur - SYSCLK = 22,1184MHz - Oscillateur externe à quartz
  15. //-----------------------------------------------------------------------------
  16. void Oscillator_Init_Osc_Quartz(void) {
  17.  
  18.       int i = 0;
  19.     OSCXCN = 0x67;  // Config de l'horloge externe - Quartz > 6,7 MHz
  20.     for (i = 0; i < 3000; i++);  // attente stabilisation Fosc quartz
  21.     while ((OSCXCN & 0x80) == 0); // validation stabilité du quartz
  22.     OSCICN = 0x0C;  // Commutation sur oscillateur externe
  23.                          // L'oscillateur n'est pas stopp
  24. }
  25.  
  26. void initUART1(void) {
  27.     //Timer 1 par Paul
  28.     CKCON |= 0x10;
  29.     TMOD |= 0x20;
  30.     PCON &= ~(0x40);
  31.     PCON |= 0x80;
  32.     TCLK0=0; //Transmit Clock Flag for UART0. 0 car on utilise Timer 1
  33.   RCLK0=0; //Receive Clock Flag for UART0.
  34.   TH1=0xB8;
  35.   TR1=1;
  36.     // INIT XBAR
  37.     XBR2 |= 0x44;
  38.     P0MDOUT |= 0x40; //P0.6 TX1 pushpull
  39.  
  40.     // INIT UART1
  41.     SCON1 |= 0x50; //SM11 = 1 et REN1 = 1 Mode 1
  42.     //TH1 = 0xB8; //Rechargement suivant la formule 20.1 pour le baudrate 19200 bauds
  43.     SCON1 &= ~(0x02); //TI1 = 0
  44. }
  45.  
  46. void sendChar(char c) {
  47.   SCON1 &= ~(0x02); //TI1 = 0
  48.     SBUF1 = c;
  49.     while((SCON1&0x02)==0);
  50. }
  51.  
  52. char recepChar(void) {
  53.     char c;
  54.     while((SCON1&0x01)==0);
  55.     c = SBUF1;
  56.     SCON1 &= ~(0x01); //RI1 = 0
  57.     return c;
  58. }
  59.  
  60. void recepString(void) {
  61.     char c;
  62.     unsigned short i = 0;
  63.     recep_string[0] = '\0';
  64.  
  65.     while(1) {
  66.         c = recepChar();
  67.         if((c=='\r')||(c=='\n')) {
  68.             recep_string[i] = '\0';
  69.             break;
  70.         }
  71.         recep_string[i] = c;
  72.         i++;
  73.     }
  74. }
  75.  
  76. unsigned short charLength(char * ptr) {
  77.     unsigned short offset = 0;
  78.     unsigned short count = 0;
  79.     while (*(ptr + offset) != '\0') {
  80.          ++count;
  81.          ++offset;
  82.     }
  83.     return count;
  84. }
  85.  
  86. void sendString(char * s) {
  87.   unsigned short i;
  88.     unsigned short l = charLength(s);
  89.   for(i=0; i<l; i++) {
  90.     sendChar(s[i]);
  91.   }
  92. }
  93.  
  94. void mmToTick(int distMot1, int distMot2) {
  95.     if(distMot1 > 0) {
  96.         motors.Ticks_mot1 = (int)((float)distMot1*mm_to_tick);
  97.     }
  98.     if(distMot2 > 0) {
  99.         motors.Ticks_mot2 = (int)((float)distMot2*mm_to_tick);
  100.     }
  101. }
  102.  
  103. void update(void) {
  104.     switch(motors.Etat_Commande) {
  105.  
  106.         case Reset:
  107.             sendString("reset\r");
  108.             break;
  109.  
  110.         case Getenc_1:
  111.             sendString("getenc 1\r");
  112.             recepString();
  113.             info_motors.Etat_Response = Rep_getenc;
  114.             sscanf(recep_string, "%d", &info_motors.Read_Val_enc_1);
  115.             break;
  116.  
  117.         case Getenc_2:
  118.             sendString("getenc 2\r");
  119.             recepString();
  120.             info_motors.Etat_Response = Rep_getenc;
  121.             sscanf(recep_string, "%d", &info_motors.Read_Val_enc_2);
  122.             break;
  123.  
  124.         case Getenc_1_2:
  125.             sendString("getenc 1 2\r");
  126.             recepString();
  127.             info_motors.Etat_Response = Rep_getenc;
  128.             sscanf(recep_string, "%d %d", &info_motors.Read_Val_enc_1, &info_motors.Read_Val_enc_2);
  129.             break;
  130.  
  131.         case Clrenc_1:
  132.             sendString("clrenc 1\r");
  133.             break;
  134.  
  135.         case Clrenc_2:
  136.             sendString("clrenc 2\r");
  137.             break;
  138.  
  139.         case mogo_1:
  140.             str[0] = '\0';
  141.             sprintf(str, "mogo 1:%d\r", motors.Vitesse_Mot1);
  142.             sendString(str);
  143.             break;
  144.  
  145.         case mogo_2:
  146.             str[0] = '\0';
  147.             sprintf(str, "mogo 2:%d\r", motors.Vitesse_Mot2);
  148.             sendString(str);
  149.             break;
  150.  
  151.         case mogo_1_2:
  152.             str[0] = '\0';
  153.             sprintf(str, "mogo 1:%d 2:%d\r", motors.Vitesse_Mot1, motors.Vitesse_Mot2);
  154.             sendString(str);
  155.             break;
  156.  
  157.         case Vpid_set:
  158.             str[0] = '\0';
  159.             sprintf(str, "vpid %d:%d:%d:%d\r", motors.Set_P, motors.Set_I, motors.Set_D, motors.Set_L_A);
  160.             sendString(str);
  161.             break;
  162.  
  163.         case Vpid_read:
  164.             sendString("vpid\r");
  165.             recepString();
  166.             info_motors.Etat_Response = Rep_vpid;
  167.             sscanf(recep_string, "P:%d I:%d D:%d L:%d", &info_motors.Read_P, &info_motors.Read_I, &info_motors.Read_D, &info_motors.Read_L_A);
  168.             break;
  169.  
  170.         case digo_1:
  171.             str[0] = '\0';
  172.             sprintf(str, "digo 1:%d:%d\r", motors.Ticks_mot1, motors.Vitesse_Mot1);
  173.             sendString(str);
  174.             break;
  175.  
  176.         case digo_2:
  177.             str[0] = '\0';
  178.             sprintf(str, "digo 2:%d:%d\r", motors.Ticks_mot2, motors.Vitesse_Mot2);
  179.             sendString(str);
  180.             break;
  181.  
  182.         case digo_1_2:
  183.             str[0] = '\0';
  184.             sprintf(str, "digo 1:%d:%d 2:%d:%d\r", motors.Ticks_mot1, motors.Vitesse_Mot1 , motors.Ticks_mot2, motors.Vitesse_Mot2);
  185.             sendString(str);
  186.             break;
  187.  
  188.         case Dpid_set:
  189.             str[0] = '\0';
  190.             sprintf(str, "dpid %d:%d:%d:%d\r", motors.Set_P, motors.Set_I, motors.Set_D, motors.Set_L_A);
  191.             sendString(str);
  192.             break;
  193.  
  194.         case Dpid_read:
  195.             sendString("dpid\r");
  196.             recepString();
  197.             info_motors.Etat_Response = Rep_dpid;
  198.             sscanf(recep_string, "P:%d I:%d D:%d A:%d", &info_motors.Read_P, &info_motors.Read_I, &info_motors.Read_D, &info_motors.Read_L_A);
  199.             break;
  200.  
  201.         case Rpid_Stinger:
  202.             sendString("rpid s\r");
  203.             break;
  204.  
  205.         case Pids:
  206.             sendString("pids\r");
  207.             recepString();
  208.             info_motors.Etat_Response = Rep_pids;
  209.             sscanf(recep_string, "%d", &info_motors.Read_Pids);
  210.             break;
  211.  
  212.         case Stop:
  213.             sendString("stop\r");
  214.             break;
  215.  
  216.         case Vel:
  217.             sendString("vel\r");
  218.             recepString();
  219.             info_motors.Etat_Response = Rep_vel;
  220.             sscanf(recep_string, "%d %d", &info_motors.Read_Vitesse_mot1, &info_motors.Read_Vitesse_mot2);
  221.             break;
  222.  
  223.         case Restore:
  224.             sendString("restore\r");
  225.  
  226.         case Commande_non:
  227.         default :
  228.             break;
  229.  
  230.     }
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement