Advertisement
igendel

Arduino 595 simulator/RT manager

Sep 15th, 2014
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 KB | None | 0 0
  1. // 595 Real Time Manager/Simulator
  2. // by Ido Gendel, 2014
  3. // Share and enjoy!
  4.  
  5. // Don't forget to set the Arduino Serial Monitor
  6. // Baud rate to 115,200
  7. // Pin connection scheme is below.
  8.  
  9. #define PIN_CONTROLS 6
  10. #define NON_PIN 255
  11.  
  12. const byte SER_PIN   = 7;
  13. const byte SRCLK_PIN = 8;
  14. const byte OE_PIN    = 6;
  15. const byte RCLK_PIN  = 9;
  16. const byte SRCLR_PIN = 10;
  17.  
  18. char cmd = 0;
  19. byte SRCLKRecIndex;
  20.  
  21. // Pin controls
  22. byte clocksTied  = 0;
  23. // output simulator
  24. byte currSER     = 0;
  25. byte SR          = 0;
  26. byte SRClearing  = 0;
  27. byte Q           = 0;
  28. byte QEnabled    = 1;
  29. byte QHPrime     = 0;
  30.  
  31. //---------------------------------------------------------
  32. void SERChange(char state) {
  33.   currSER = state;
  34. } // SERChange
  35.  
  36. //---------------------------------------------------------
  37. void SRCLKChange(char state) {
  38.  
  39.   if (!state) return;
  40.   SR = ((SR << 1) + currSER) * (!SRClearing);
  41.   QHPrime = SR >> 7;
  42.    
  43. } // SRCLKChange
  44.  
  45. //---------------------------------------------------------
  46. void RCLKChange(char state) {
  47.   if (state) Q = SR;
  48.   if (clocksTied) cmd = 'C';
  49. } // RCLKChange
  50.  
  51. //---------------------------------------------------------
  52. void OEChange(char state) {
  53.   QEnabled = !state;
  54. } // OEChange
  55.  
  56. //---------------------------------------------------------
  57. void SRCLRChange(char state) {
  58.   SRClearing = !state;
  59.   if (SRClearing) SR = 0;
  60. } // SRCLRChange
  61.  
  62. struct tPinCtrl {
  63.  
  64.   char enabled, id, arduinoPin, state;
  65.   void (*fnPtr) (char);
  66.   char name[11];
  67.  
  68. } pinCtrl[PIN_CONTROLS] =
  69.      {{1, 'S', SER_PIN, currSER, SERChange, "SER"},
  70.       {1, 'C', SRCLK_PIN, 0, SRCLKChange, "SRCLK"},
  71.       {1, 'R', RCLK_PIN, 0, RCLKChange, "RCLK"},
  72.       {1, 'E', OE_PIN, !QEnabled, OEChange, "OE"},
  73.       {1, 'L', SRCLR_PIN, !SRClearing, SRCLRChange, "SRCLR"},
  74.       {1, 'T', NON_PIN, 0, ClockTieChange, "Tie Clocks"}};
  75.  
  76. //---------------------------------------------------------
  77. void ClockTieChange(char state) {
  78.   clocksTied = state;
  79.   pinCtrl[SRCLKRecIndex].enabled = !clocksTied;
  80. } // ClockTieChange
  81.  
  82. //---------------------------------------------------------
  83. // Locate correct record to avoid "magic numbers"
  84. void findSRCLKRecIndex() {
  85.  
  86.   for (SRCLKRecIndex = 0;
  87.         SRCLKRecIndex < PIN_CONTROLS; SRCLKRecIndex++)
  88.    if (pinCtrl[SRCLKRecIndex].arduinoPin == SRCLK_PIN) break;
  89.  
  90. } // findSRCLKRecIndex
  91.  
  92. //---------------------------------------------------------
  93. void setup() {
  94.  
  95.   for (byte j = 0; j < PIN_CONTROLS; j++)
  96.    if (pinCtrl[j].arduinoPin != NON_PIN) {
  97.      pinMode(pinCtrl[j].arduinoPin, OUTPUT);
  98.      digitalWrite(pinCtrl[j].arduinoPin, pinCtrl[j].state);      
  99.    } // if    
  100.  
  101.   findSRCLKRecIndex();
  102.   Serial.begin(115200);
  103.  
  104. } // setup
  105.  
  106. //---------------------------------------------------------
  107. void printFormattedByte(byte b) {
  108.  
  109.   for (byte j = 0; j < 8; j++) {
  110.     Serial.print(b & 128 ? "1" : "0");
  111.     b <<= 1;
  112.   } // for
  113.  
  114. } // printFormattedByte
  115.  
  116. //---------------------------------------------------------
  117. void printICState() {
  118.  
  119.   Serial.print(F("Shift Register (Hidden) = "));
  120.   printFormattedByte(SR);
  121.   Serial.println();
  122.   Serial.print(F("Storage Register (Output) = "));  
  123.   printFormattedByte(Q);
  124.   Serial.println(QEnabled ? " (Enabled)" : " High Z (Disabled)");
  125.   Serial.print(F("QH' (Daisy chain output) = "));
  126.   Serial.println((byte)QHPrime);
  127.  
  128. } // printICState
  129.  
  130. //---------------------------------------------------------
  131. void printOptions() {
  132.  
  133.   for (byte j = 0; j < PIN_CONTROLS; j++) {
  134.  
  135.     if (!pinCtrl[j].enabled) continue;
  136.     Serial.print("[");
  137.     Serial.print(pinCtrl[j].id);
  138.     Serial.print("] ");
  139.     Serial.print(pinCtrl[j].name);    
  140.     Serial.print(F(" (current state="));
  141.     Serial.print((byte)pinCtrl[j].state);
  142.     Serial.println(")");    
  143.    
  144.   }  // for
  145.  
  146. } // printOptions
  147.  
  148. //---------------------------------------------------------
  149. void printHeader() {
  150.  
  151.   Serial.println();
  152.   Serial.println(F("=================================="));
  153.   Serial.println(F("Current 595 IC state:"));
  154.   printICState();
  155.   Serial.println(F("--------------------------------\n"));
  156.   Serial.println(F("Select a pin/option to toggle:"));
  157.  
  158. } // printHeader
  159.  
  160. //---------------------------------------------------------
  161. void loop() {
  162.  
  163.   char c, userInput = 0;
  164.   byte j;
  165.  
  166.  printHeader();
  167.  printOptions();
  168.  
  169.  while (!cmd)
  170.   if (Serial.available()) {
  171.      cmd = toupper(Serial.read());
  172.      userInput = 1;
  173.   } // if  
  174.  
  175.   c = cmd;
  176.   cmd = 0;
  177.  
  178.   for (j = 0; j < PIN_CONTROLS; j++)
  179.    if (c == pinCtrl[j].id) {
  180.      
  181.      if ((!pinCtrl[j].enabled) && userInput) continue;
  182.      pinCtrl[j].state = !pinCtrl[j].state;
  183.      if (pinCtrl[j].arduinoPin != NON_PIN)
  184.        digitalWrite(pinCtrl[j].arduinoPin, pinCtrl[j].state);
  185.      pinCtrl[j].fnPtr(pinCtrl[j].state);  
  186.      break;
  187.      
  188.    } // if
  189.    
  190.   if (j ==  PIN_CONTROLS) {
  191.     Serial.println(F("\nSorry, I don't understand!"));
  192.     delay(1000);
  193.   }  // if
  194.    
  195. } // loop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement