Advertisement
Guest User

FahrradSchaltung-Original

a guest
Dec 20th, 2014
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.26 KB | None | 0 0
  1. /*
  2.  * ======== Standard MSP430 includes ========
  3.  */
  4. #include <msp430.h>
  5.  
  6. /*
  7.  * ======== Grace related includes ========
  8.  */
  9. #include <ti/mcu/msp430/csl/CSL.h>
  10.  
  11. long int i;
  12. #define FDdelay     for(i=0; i<10000;i++){}
  13. #define RDdelay     for(i=0; i<6000;i++){}
  14.  
  15. // FD position definitions
  16. #define FDlarge     870 // largest
  17. #define FDmedium    1050 // medium
  18. #define FDsmall     1600 // smallest
  19. #define FDoffset    70
  20. #define FDtrim      13
  21.  
  22. // large gear = 3
  23. // medium gear = 2
  24. // small gear = 1
  25. int volatile FDstate = 0;
  26.  
  27. // RD position definitions
  28. #define RD1         2060
  29. #define RD2         1950
  30. #define RD3         1870
  31. #define RD4         1800
  32. #define RD5         1700
  33. #define RD6         1650
  34. #define RD7         1550
  35. #define RDoffset    20
  36.  
  37. // RDstate
  38. // largest = 7
  39. // smallest = 1
  40. int volatile RDstate = 0;
  41.  
  42. int main(int argc, char *argv[])
  43. {
  44.      CSL_init();                     // Activate Grace-generated configuration
  45.  
  46.     // Enter LPM with global interrupt enabled
  47.     __bis_SR_register(LPM0_bits + GIE);
  48.  
  49.     return (0);
  50. }
  51.  
  52. void downshift(void)
  53. {
  54.     if (P1IFG & BIT4){
  55.         // front
  56.         // clear the flag
  57.         P1IFG &= ~BIT4;
  58.  
  59.         if (FDstate == 1){
  60.             // small gear, don't shift
  61.             TA0CCR1 = FDsmall;
  62.             FDstate = 1;
  63.         }else if (FDstate == 2){
  64.             // medium to small
  65.             TA0CCR1 = FDsmall + FDoffset + 30;
  66.             FDdelay;
  67.             TA0CCR1 = FDsmall;
  68.             FDstate = 1;
  69.         }else{
  70.             TA0CCR1 = FDmedium + FDoffset;
  71.             FDdelay;
  72.             TA0CCR1 = FDmedium;
  73.             FDstate = 2;
  74.         }
  75.         FDdelay;
  76.     }else{
  77.         // rear
  78.         // clear the flag
  79.         P1IFG &= ~BIT7;
  80.  
  81.         switch (RDstate){
  82.             case 7:
  83.                 TA1CCR2 = RD6 + 5*RDoffset;
  84.                 RDdelay;
  85.                 TA1CCR2 = RD6;
  86.                 RDstate = 6;
  87.                 break;
  88.             case 6:
  89.                 TA1CCR2 = RD5 + 5*RDoffset;
  90.                 RDdelay;
  91.                 TA1CCR2 = RD5;
  92.                 RDstate = 5;
  93.                 break;
  94.             case 5:
  95.                 TA1CCR2 = RD4 + 5*RDoffset;
  96.                 RDdelay;
  97.                 TA1CCR2 = RD4;
  98.                 RDstate = 4;
  99.                 break;
  100.             case 4:
  101.                 TA1CCR2 = RD3 + 5*RDoffset;
  102.                 RDdelay;
  103.                 TA1CCR2 = RD3;
  104.                 RDstate = 3;
  105.                 break;
  106.             case 3:
  107.                 TA1CCR2 = RD2 + RDoffset;
  108.                 RDdelay;
  109.                 TA1CCR2 = RD2;
  110.                 RDstate = 2;
  111.                 break;
  112.             case 2:
  113.                 TA1CCR2 = RD1 + RDoffset;
  114.                 RDdelay;
  115.                 TA1CCR2 = RD1;
  116.                 RDstate = 1;
  117.                 break;
  118.             case 1:
  119.                 TA1CCR2 = RD1;
  120.                 RDstate = 1;
  121.                 break;
  122.             default:
  123.                 TA1CCR2 = RD1;
  124.                 RDstate = 1;
  125.                 break;
  126.         }
  127.  
  128.         FDdelay;
  129.  
  130.     }
  131. }
  132.  
  133. void upshift(void)
  134. {
  135.     if (P2IFG & BIT0){
  136.         // front
  137.         // clear the flag
  138.         P2IFG &= ~BIT0;
  139.  
  140.         if (FDstate == 1){
  141.             // small --> medium
  142.             TA0CCR1 = FDmedium - FDoffset;
  143.             FDdelay;
  144.             TA0CCR1 = FDmedium;
  145.             FDstate = 2;
  146.         }else if (FDstate == 2){
  147.             // medium to large
  148.             TA0CCR1 = FDlarge - FDoffset;
  149.             FDdelay;
  150.             TA0CCR1 = FDlarge;
  151.             FDstate = 3;
  152.         }else{
  153.             //TA0CCR1 = FDlarge;
  154.             //FDstate = 3;
  155.         }
  156.  
  157.         FDdelay;
  158.  
  159.     }else{
  160.         // rear
  161.         // clear the flag
  162.         P2IFG &= ~BIT4;
  163.  
  164.         switch (RDstate){
  165.             case 1:
  166.                 TA1CCR2 = RD2 - 5*RDoffset;
  167.                 RDdelay;
  168.                 TA1CCR2 = RD2;
  169.                 RDstate = 2;
  170.                 break;
  171.             case 2:
  172.                 TA1CCR2 = RD3 - RDoffset;
  173.                 RDdelay;
  174.                 TA1CCR2 = RD3;
  175.                 RDstate = 3;
  176.                 break;
  177.             case 3:
  178.                 TA1CCR2 = RD4 - RDoffset;
  179.                 RDdelay;
  180.                 TA1CCR2 = RD4;
  181.                 RDstate = 4;
  182.                 break;
  183.             case 4:
  184.                 TA1CCR2 = RD5 - 0.5*RDoffset;
  185.                 RDdelay;
  186.                 TA1CCR2 = RD5;
  187.                 RDstate = 5;
  188.                 break;
  189.             case 5:
  190.                 TA1CCR2 = RD6 - RDoffset;
  191.                 RDdelay;
  192.                 TA1CCR2 = RD6;
  193.                 RDstate = 6;
  194.                 break;
  195.             case 6:
  196.                 TA1CCR2 = RD7 - RDoffset;
  197.                 RDdelay;
  198.                 TA1CCR2 = RD7;
  199.                 RDstate = 7;
  200.                 break;
  201.             case 7:
  202.                 TA1CCR2 = RD7;
  203.                 RDstate = 7;
  204.                 break;
  205.             default:
  206.                 TA1CCR2 = RD7;
  207.                 RDstate = 7;
  208.                 break;
  209.         }
  210.  
  211.         FDdelay;
  212.  
  213.     }
  214. }
  215.  
  216. void autotrim(void){
  217.     if (FDstate == 3 && RDstate >= 3){
  218.         TA0CCR1 = FDlarge + FDtrim*(RDstate - 2);
  219.     }else if(FDstate == 3 && RDstate < 3){
  220.         TA0CCR1 = FDlarge;
  221.     }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement