Advertisement
Guest User

Untitled

a guest
Jan 15th, 2024
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.20 KB | None | 0 0
  1. #include <stdint.h>
  2.  
  3. struct Message {
  4.         uint32_t id;
  5.         uint32_t timestamp;
  6.         int32_t control_signal;
  7.         int32_t error_signal;
  8.         int16_t force;
  9.         int16_t cycle_count;
  10.         uint16_t counter;
  11.         uint16_t signal_length;
  12. };
  13.  
  14. // layout of shared ddr3 memory (filled in by loader)
  15. struct DDRLayout {
  16.         Message volatile *msgbuf;
  17.         uint16_t num_msgs;
  18.         uint16_t msg_size;
  19. };
  20.  
  21. struct UserControlVars {
  22.         // set by pru before halting
  23.         char const *abort_file;
  24.         int abort_line;
  25.         // read-pointer updated by python
  26.         uint16_t ridx;
  27.         uint16_t buffer;
  28.         // Shared variables for PRU
  29.         // run parameters
  30.         uint16_t cycle_limit;
  31.         uint16_t time_limit;
  32.         uint16_t signal_length;
  33.         uint16_t counter;
  34.     uint16_t signal[2000];
  35.         // motor status
  36.         uint32_t target_pos;
  37.         uint32_t current_pos;
  38.         uint32_t speed;
  39.         bool halted;
  40.         bool moving;
  41. };
  42.  
  43.  
  44. far struct DDRLayout ddr __attribute__((location(0x10000))) = {};
  45. far struct UserControlVars volatile shmem __attribute__((location(0x10100))) = {};
  46.  
  47. // define some r30 bits
  48. #define CW  (1 << 3)
  49. #define CCW (1 << 7)
  50.  
  51. volatile register uint32_t __R30;
  52.  
  53. #define delay_us(n) __delay_cycles((n) * 200u)
  54. #define delay_ms(n) delay_us((n) * 1000u)
  55.  
  56. int main() {
  57.     int32_t pos = shmem.current_pos;
  58.     __R30 = 0;
  59.     delay_us(1);
  60.     while ( !shmem.halt_requested ) {
  61.         uint32_t speed = shmem.speed;  
  62.         int32_t delta = shmem.target_pos - pos;
  63.         if ( delta == 0 ) {
  64.             shmem.moving = false;
  65.             continue;
  66.         }
  67.         if ( delta < 0 ) {
  68.             --pos;
  69.             __R30 |= CCW;
  70.             delta *= -1;
  71.             shmem.moving = true;
  72.         } else {
  73.             ++pos;
  74.             __R30 |= CW;
  75.             shmem.moving = true;
  76.         }
  77.         shmem.current_pos = pos;
  78.             switch(speed){ 
  79.                 case 1:
  80.                     delay_us(1);
  81.                     __R30 = 0;
  82.                     delay_us(1);
  83.                     break;
  84.                 case 2:
  85.                     delay_us(2);
  86.                     __R30 = 0;
  87.                     delay_us(2);
  88.                     break;
  89.                 case 3:
  90.                     delay_us(3);
  91.                     __R30 = 0;
  92.                     delay_us(3);
  93.                     break;
  94.                 case 4:
  95.                     delay_us(4);
  96.                     __R30 = 0;
  97.                     delay_us(4);
  98.                     break;
  99.                 case 5:
  100.                     delay_us(5);
  101.                     __R30 = 0;
  102.                     delay_us(5);
  103.                     break;
  104.                 case 10:
  105.                     delay_us(100);
  106.                     __R30 = 0;
  107.                     delay_us(100);
  108.                     break;
  109.                 case 20:
  110.                     delay_us(200);
  111.                     __R30 = 0;
  112.                     delay_us(200);
  113.                     break;
  114.                 case 30:
  115.                     delay_us(300);
  116.                     __R30 = 0;
  117.                     delay_us(300);
  118.                     break;
  119.                 case 40:
  120.                     delay_us(400);
  121.                     __R30 = 0;
  122.                     delay_us(400);
  123.                     break;
  124.                 case 50:
  125.                     delay_us(500);
  126.                     __R30 = 0;
  127.                     delay_us(500);
  128.                     break;
  129.                 case 60:
  130.                     delay_us(600);
  131.                     __R30 = 0;
  132.                     delay_us(600);
  133.                     break;
  134.                 case 70:
  135.                     delay_us(700);
  136.                     __R30 = 0;
  137.                     delay_us(700);
  138.                     break;
  139.                 case 80:
  140.                     delay_us(800);
  141.                     __R30 = 0;
  142.                     delay_us(800);
  143.                     break;
  144.                 case 90:
  145.                     delay_us(900);
  146.                     __R30 = 0;
  147.                     delay_us(900);
  148.                     break;
  149.                 case 100:
  150.                     delay_us(1000);
  151.                     __R30 = 0;
  152.                     delay_us(1000);
  153.                     break;
  154.                 default:
  155.                     delay_us(3000);
  156.                     __R30 = 0;
  157.                     delay_us(3000);
  158.             }
  159.  
  160.     }
  161.     __halt();
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement