DenseBrainMatrix

Untitled

Sep 23rd, 2024
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.29 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.         // motor status
  30.         uint16_t target_pos;
  31.         uint16_t current_pos;
  32.         uint32_t speed;
  33.         bool halt_requested;
  34.         bool moving;
  35. };
  36.  
  37.  
  38. //far struct DDRLayout ddr __attribute__((location(0x10000))) = {};
  39. //far struct UserControlVars volatile shmem __attribute__((location(0x10100))) = {};
  40.  
  41. #define ddr   (*(struct DDRLayout volatile *)0x10000)
  42. #define shmem (*(struct UserControlVars volatile *)0x10100)
  43.  
  44.  
  45. // define some r30 bits
  46. #define CW  (1 << 3)
  47. #define CCW (1 << 7)
  48.  
  49. volatile register uint32_t __R30;
  50.  
  51. #define delay_us(n) __delay_cycles((n) * 200u)
  52. #define delay_ms(n) delay_us((n) * 1000u)
  53.  
  54. int main() {
  55.     int32_t pos = shmem.current_pos;
  56.     __R30 = 0;
  57.     delay_us(1);
  58.     while ( !shmem.halt_requested ) {
  59.         uint32_t speed = shmem.speed;  
  60.         int32_t delta = shmem.target_pos - pos;
  61.         if ( delta == 0 ) {
  62.             shmem.moving = false;
  63.             continue;
  64.         }
  65.         if ( delta < 0 ) {
  66.             --pos;
  67.             __R30 |= CW;
  68.             __R30 |= CCW;
  69.             delta *= -1;
  70.             shmem.moving = true;
  71.         } else {
  72.             ++pos;
  73.             __R30 |= CCW;
  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.                 case 999:
  155.                     delay_us(1000000);
  156.                     __R30 = 0;
  157.                     delay_us(1000000);
  158.                     break;
  159.                 default:
  160.                     delay_us(3000);
  161.                     __R30 = 0;
  162.                     delay_us(3000);
  163.             }
  164.  
  165.     }
  166.     __halt();
  167. }
  168.  
Advertisement
Add Comment
Please, Sign In to add comment