prgmode.ino 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. entering the programming mode
  3. */
  4. #define BLINK_DELAY 500
  5. #define SHOW_DELAY 1000
  6. #define KEY_DELAY 250
  7. #define ADDR_LOOP 50
  8. const byte demoPrg[] = { 0x4F, 0x59, 0x1F, 0x29, 0x10, 0x29, 0x5A, 0x40,
  9. 0x59, 0x64, 0x54, 0x29, 0x4F, 0x59, 0x10, 0xCD,
  10. 0x11, 0x28, 0xCC, 0x18, 0x28, 0x4F, 0x59, 0x5A,
  11. 0x72, 0x26, 0xC0, 0x35, 0x80, 0x90, 0xFF
  12. };
  13. /* this is the program
  14. Addr BD Befehl Daten Kommentar
  15. 0x00: 4F 0X00 XXXX A=#:A=15 ,""
  16. 0x01: 59 0X0X X00X =A:PWM.1=A ,""
  17. 0x02: 1F 000X XXXX Dout:Output 1111 ,""
  18. 0x03: 29 00X0 X00X Delay:Delay 1s ,""
  19. 0x04: 10 000X 0000 Dout:Output 0000 ,""
  20. 0x05: 29 00X0 X00X Delay:Delay 1s ,""
  21. 0x06: 5A 0X0X X0X0 =A:PWM.2=A ,""
  22. 0x07: 40 0X00 0000 A=#:A=0 ,""
  23. 0x08: 59 0X0X X00X =A:PWM.1=A ,""
  24. 0x09: 64 0XX0 0X00 A=:A=Din ,""
  25. 0x0A: 54 0X0X 0X00 =A:Dout=A ,""
  26. 0x0B: 29 00X0 X00X Delay:Delay 1s ,""
  27. 0x0C: 4F 0X00 XXXX A=#:A=15 ,""
  28. 0x0D: 59 0X0X X00X =A:PWM.1=A ,""
  29. 0x0E: 10 000X 0000 Dout:Output 0000 ,""
  30. 0x0F: CD XX00 XX0X Skip if:S_PRG=0 ,""
  31. 0x10: 11 000X 000X Dout:Output 0001 ,""
  32. 0x11: 28 00X0 X000 Delay:Delay 500ms ,""
  33. 0x12: CC XX00 XX00 Skip if:S_SEL=0 ,""
  34. 0x13: 18 000X X000 Dout:Output 1000 ,""
  35. 0x14: 28 00X0 X000 Delay:Delay 500ms ,""
  36. 0x15: 4F 0X00 XXXX A=#:A=15 ,""
  37. 0x16: 59 0X0X X00X =A:PWM.1=A ,""
  38. 0x17: 5A 0X0X X0X0 =A:PWM.2=A ,""
  39. 0x18: 72 0XXX 00X0 A=Calculation:A=A-1 ,""
  40. 0x19: 26 00X0 0XX0 Delay:Delay 100ms ,""
  41. 0x1A: C0 XX00 0000 Skip if:A=0 ,""
  42. 0x1B: 35 00XX 0X0X Jump -:jump -5 ,""
  43. 0x1C: 80 X000 0000 Page:Page 0 ,""
  44. 0x1D: 90 X00X 0000 Jump:Jump 0 ,""
  45. 0x1E: FF XXXX XXXX Byte/Board:PrgEnd ,""
  46. */
  47. enum PROGRAMMING_MODE {ADDRESS, COMMAND, DATA};
  48. PROGRAMMING_MODE prgMode;
  49. void prgDemoPrg() {
  50. byte value = readbyte(0);
  51. if (value == 0xFF) {
  52. dbgOutLn("recreate demo program");
  53. value = readbyte(1);
  54. if (value == 0xFF) {
  55. for (byte i = 0; i < sizeof(demoPrg); i++) {
  56. writebyte(i, demoPrg[i]);
  57. }
  58. }
  59. }
  60. }
  61. void programMode() {
  62. // checking if advance programmer board connected?
  63. #ifdef SPS_ENHANCEMENT
  64. if (digitalRead(SW_SEL) == 0) {
  65. advancePrg();
  66. }
  67. else {
  68. #endif
  69. dbgOutLn("PrgMode");
  70. // light up all LEDs
  71. doPort(0x08);
  72. while (digitalRead(SW_PRG) == 0) {
  73. // waiting for PRG to release
  74. }
  75. blinkAll();
  76. prgMode = ADDRESS;
  77. addr = 0;
  78. do {
  79. blinkD1();
  80. dbgOut("Adr:");
  81. dbgOutLn(addr);
  82. // LoNibble Adresse anzeigen
  83. doAddr(addr);
  84. //delay(SHOW_DELAY);
  85. blinkD2();
  86. // HiNibble Adresse anzeigen
  87. data = (addr & 0xf0) >> 4; //Adresse anzeigen
  88. doAddr(data);
  89. //delay(SHOW_DELAY);
  90. byte Eebyte = readbyte(addr);
  91. data = Eebyte & 15;
  92. cmd = Eebyte >> 4;
  93. blinkD3();
  94. prgMode = COMMAND;
  95. dbgOutLn("cmd");
  96. doPort(cmd); //show command
  97. do {
  98. if (digitalRead(SW_SEL) == 0) {
  99. delay(KEY_DELAY);
  100. cmd += 1;
  101. cmd = cmd & 0x0F;
  102. doPort(cmd);
  103. }
  104. }
  105. while (digitalRead(SW_PRG) == 1);
  106. delay(DEBOUNCE);
  107. if (digitalRead(SW_SEL) == 0) {
  108. break;
  109. }
  110. blinkD4();
  111. prgMode = DATA;
  112. dbgOutLn("dat");
  113. doPort(data); //show data
  114. do {
  115. if (digitalRead(SW_SEL) == 0) {
  116. delay(KEY_DELAY);
  117. data += 1;
  118. data = data & 0x0F;
  119. doPort(data);
  120. }
  121. }
  122. while (digitalRead(SW_PRG) == 1); // S2 = 1
  123. delay(DEBOUNCE);
  124. if (digitalRead(SW_SEL) == 0) {
  125. break;
  126. }
  127. byte newValue = (cmd << 4) + data;
  128. if (newValue != Eebyte) {
  129. writebyte(addr, newValue); // Writeeeprom Eebyte , Addr
  130. blinkAll();
  131. }
  132. addr += 1;
  133. }
  134. while (true);
  135. #ifdef SPS_ENHANCEMENT
  136. }
  137. #endif
  138. dbgOutLn("save program data");
  139. store();
  140. }
  141. void blinkAll() {
  142. blinkNull();
  143. doPort(0x0F);
  144. delay(BLINK_DELAY);
  145. }
  146. void blinkD1() {
  147. blinkNull();
  148. doPort(0x01);
  149. delay(BLINK_DELAY);
  150. blinkNull();
  151. }
  152. void blinkD2() {
  153. blinkNull();
  154. doPort(0x02);
  155. delay(BLINK_DELAY);
  156. blinkNull();
  157. }
  158. void blinkD3() {
  159. blinkNull();
  160. doPort(0x04);
  161. delay(BLINK_DELAY);
  162. blinkNull();
  163. }
  164. void blinkD4() {
  165. blinkNull();
  166. doPort(0x08);
  167. delay(BLINK_DELAY);
  168. blinkNull();
  169. }
  170. void blinkNull() {
  171. doPort(0x00);
  172. delay(BLINK_DELAY);
  173. }
  174. void doAddr(byte value) {
  175. for (byte i = ADDR_LOOP; i > 0; i--) {
  176. doPort(value);
  177. delay(19);
  178. doPort(0x0F);
  179. delay(1);
  180. }
  181. }