Converter for Consul 262.5 terminal keyboard and VDX 52600 terminal.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
1.9 KiB

  1. #include <TimerOne.h>
  2. const int pinData = 6;
  3. const int pinStatus = 7;
  4. const int timerDelay = 545;
  5. void setup(void)
  6. {
  7. pinMode(pinData, OUTPUT);
  8. //Timer1.initialize(60);
  9. //Timer1.attachInterrupt(clockCycle);
  10. Timer1.initialize(timerDelay);
  11. Timer1.attachInterrupt(clockCycle);
  12. Timer1.stop();
  13. pinMode(pinStatus, INPUT_PULLUP);
  14. attachInterrupt(digitalPinToInterrupt(pinStatus), statusCycle, CHANGE);
  15. Serial.begin(9600);
  16. }
  17. volatile long lastChange = 0;
  18. volatile long lastStart = 0;
  19. volatile int x = 0;
  20. volatile int dataWord = 0;
  21. volatile int dataState = 0;
  22. volatile int dataDelay = 0;
  23. volatile int packetDelay = 0;
  24. volatile int packetTail = 0;
  25. volatile int clkState = LOW;
  26. void statusCycle() {
  27. long timeNow = millis();
  28. long changeDiff = timeNow - lastChange;
  29. lastChange = timeNow;
  30. if (changeDiff >= 10) {
  31. lastStart = timeNow;
  32. dataWord = (1 + x);
  33. dataState = 7;
  34. dataDelay = 0;
  35. packetDelay = 0;
  36. packetTail = 100;
  37. x = (x + 1) % 1;
  38. clkState = HIGH;
  39. Timer1.initialize(timerDelay);
  40. Timer1.start();
  41. }
  42. if (timeNow - lastStart >= 7 && changeDiff >= 2) {
  43. //dataWord = 0b1000000011 | (('A' + x) << 2);
  44. }
  45. }
  46. void clockCycle(void)
  47. {
  48. int dataBit = HIGH;
  49. if (clkState == LOW) {
  50. clkState = HIGH;
  51. } else {
  52. clkState = LOW;
  53. }
  54. if (packetDelay > 0) {
  55. packetDelay--;
  56. } else if (dataDelay > 0) {
  57. dataDelay--;
  58. dataBit = LOW;
  59. } else if (dataState > 0) {
  60. int bitToSend = (dataWord >> (dataState - 1)) & 1;
  61. //int bitToSend = dataWord & 1;
  62. //dataWord = dataWord >> 1;
  63. dataBit = !bitToSend ? LOW : HIGH;
  64. dataState--;
  65. } else if (packetTail > 0) {
  66. packetTail--;
  67. dataBit = LOW;
  68. } else {
  69. //digitalWrite(pinData, HIGH);
  70. Timer1.stop();
  71. }
  72. digitalWrite(pinData, dataBit);
  73. }
  74. void loop(void)
  75. {
  76. delay(500);
  77. /*noInterrupts();
  78. dataWord = 0b1000000011 | (('A' + x) << 2);
  79. dataState = 16;
  80. x = (x + 1) % 30;
  81. interrupts();*/
  82. }