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.

86 lines
1.6 KiB

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