Browse Source

Merge branch 'develop'

Willie 5 years ago
parent
commit
53e466c13e
4 changed files with 379 additions and 307 deletions
  1. 22 1
      README.md
  2. 67 180
      SPS/SPS.ino
  3. 131 0
      SPS/hardware.h
  4. 159 126
      SPS/prgmode.ino

+ 22 - 1
README.md

@@ -1,6 +1,27 @@
 # ArduinoSPS
 
-A TPS Variant for the arduino with some major enhancments.
+A TPS Variant for the Arduino and some other options with some major enhancments.
+
+For more information and description see 
+http://www.rcarduino.de/doku.php?id=en:arduino:arduinosps
+
+And there is now a print book at amazon 
+https://www.amazon.com/dp/1731232535
+
+**Version 0.12**
+  27.01.2019
+  - Release
+  - automatically adding demo program to new mcu
+  11.01.2018
+  - some refactoring
+  
+  07.01.2018
+  - programming: 1/2 duty cycle for 0 values in address display
+
+**Version 0.11**
+  17.12.2018
+  - adding Shift left and shift right to register A
+
 
 **Version 0.10**
   9.12.2018

+ 67 - 180
SPS/SPS.ino

@@ -1,9 +1,22 @@
 /*
   SPS System mit dem Arduino.
+  Version 0.12
+  27.01.2019
+  - adding demo program,
+  11.01.2018
+  - some refactoring
+  
+  07.01.2018
+  - programming: 1/2 duty cycle for 0 values in address display
+
+  Version 0.11
+  17.12.2018
+  - adding Shift left and shift right to register A
+
   Version 0.10
   7.12.2018
   - new define for serial programming
-  
+
   18.11.2018 WKLA
   - new standard programming mode
   I added a new programming mode for the default programming, because i thing the old one was a little bit clumsy.
@@ -11,23 +24,23 @@
   Starting with PRG pushed after Reset.
   as a result, all LEDs will shortly blink
   now you are in programming mode.
-  * the D1 LED will blink
-  * the higher nibble of the address will be shown
-  * the D2 LED will blink
-  * the lower nibble of the address will be shown
-  * the D3 LED will blink
-  * the command part (high nibble) will be shown
-  * with SEL you can step thru all commands
-  * PRG will save the command
-  * the D4 LED will blink 
-  * the data part (low nibble) will be shown
-  * with SEL you can step thru all datas
-  * PRG will save the data
-  * if the new value has been changed, all LEDs will flash as the byte will be written to the EEPROM
-  * address will be increased and now it will start with blinking of the D1 LED
-  * 
-  * To leave the programming simply push reset.
-  
+    the D1 LED will blink
+    the higher nibble of the address will be shown
+    the D2 LED will blink
+    the lower nibble of the address will be shown
+    the D3 LED will blink
+    the command part (high nibble) will be shown
+    with SEL you can step thru all commands
+    PRG will save the command
+    the D4 LED will blink
+    the data part (low nibble) will be shown
+    with SEL you can step thru all datas
+    PRG will save the data
+    if the new value has been changed, all LEDs will flash as the byte will be written to the EEPROM
+    address will be increased and now it will start with blinking of the D1 LED
+
+    To leave the programming simply push reset.
+
   Version 0.9
   18.11.2018 WKLA
   - BUGs entfernt. Release.
@@ -57,7 +70,7 @@
 */
 
 /*
- * HEre are the defines used in this software to control special parts of the implementation
+ * Here are the defines used in this software to control special parts of the implementation
  * #define SPS_USE_DISPLAY: using a external TM1637 Display for displaying address and data at one time
  * #define SPS_RECEIVER: using a RC receiver input
  * #define SPS_ENHANCEMENT: all of the other enhancments
@@ -66,7 +79,9 @@
  * #define SPS_SERIAL_PRG: activates the serial programming feature
  */
 // Program im Debugmodus kompilieren, dann werden zus. Ausgaben auf die serielle Schnittstelle geschrieben.
+//#define debug
 
+// defining different hardware platforms
 #ifdef __AVR_ATtiny861__
 #define SPS_RCRECEIVER
 #define SPS_ENHANCEMENT
@@ -80,7 +95,6 @@
 #endif
 
 #ifdef __AVR_ATmega328P__
-//#define debug
 #define SPS_USE_DISPLAY
 #define SPS_RECEIVER
 #define SPS_ENHANCEMENT
@@ -96,6 +110,7 @@
 //#define SPS_TONE
 #endif
 
+// libraries
 #include <debug.h>
 #include <makros.h>
 #include <EEPROM.h>
@@ -113,138 +128,9 @@
 #include "notes.h"
 #endif
 
-// Hardwareanbindung
-#ifdef __AVR_ATmega328P__
-// Arduino Hardware
-const byte Din_0 = 0;
-const byte Din_1 = 1;
-const byte Din_2 = 2;
-const byte Din_3 = 3;
-
-const byte Dout_0 = 4;
-const byte Dout_1 = 5;
-const byte Dout_2 = 6;
-const byte Dout_3 = 7;
-
-const byte ADC_0 = 0; //(15)
-const byte ADC_1 = 1; //(16)
-const byte PWM_1 = 9;
-const byte PWM_2 = 10;
-
-#ifdef SPS_RCRECEIVER
-const byte RC_0 = 18;
-const byte RC_1 = 19;
-#endif
-
-#ifdef SPS_SERVO
-const byte SERVO_1 = 9;
-const byte SERVO_2 = 10;
-#endif
-
-const byte SW_PRG = 8;
-const byte SW_SEL = 11;
-
-#ifdef SPS_USE_DISPLAY
-const byte DIGIT_DATA_IO = 12;
-const byte DIGIT_CLOCK = 13;
-#endif
-#endif
-
-#ifdef __AVR_ATtiny84__
-// ATTiny84 Hardware
-const byte Dout_0 = 6;
-const byte Dout_1 = 5;
-const byte Dout_2 = 4;
-const byte Dout_3 = 1;
-
-const byte Din_0 = 10;
-const byte Din_1 = 9;
-const byte Din_2 = 8;
-const byte Din_3 = 7;
-const byte ADC_0 = 0;
-const byte ADC_1 = 1;
-const byte PWM_1 = 2;
-const byte PWM_2 = 3;
-#ifdef SPS_RCRECEIVER
-const byte RC_0 = 10;
-const byte RC_1 = 9;
-#endif
-
-#ifdef SPS_SERVO
-const byte SERVO_1 = 2;
-const byte SERVO_2 = 3;
-#endif
-
-const byte SW_PRG = 0;
-const byte SW_SEL = 8;
+#include "hardware.h"
 
-#ifdef SPS_USE_DISPLAY
-const byte DIGIT_DATA_IO = 4;
-const byte DIGIT_CLOCK = 5;
-#endif
-#endif
-
-#ifdef __AVR_ATtiny4313__
-// ATTiny4313 Hardware
-const byte Dout_0 = 0;
-const byte Dout_1 = 1;
-const byte Dout_2 = 2;
-const byte Dout_3 = 3;
-
-const byte Din_0 = 4;
-const byte Din_1 = 5;
-const byte Din_2 = 6;
-const byte Din_3 = 7;
-const byte ADC_0 = 13;
-const byte ADC_1 = 14;
-const byte PWM_1 = 11;
-const byte PWM_2 = 12;
-
-#ifdef SPS_RCRECEIVER
-const byte RC_0 = 15;
-const byte RC_1 = 16;
-#endif
-
-#ifdef SPS_SERVO
-const byte SERVO_1 = 11;
-const byte SERVO_2 = 12;
-#endif
-
-const byte SW_PRG = 9;
-const byte SW_SEL = 8;
-#endif
-
-#ifdef __AVR_ATtiny861__
-// ATTiny4313 Hardware
-const byte Dout_0 = 0;
-const byte Dout_1 = 1;
-const byte Dout_2 = 2;
-const byte Dout_3 = 3;
-
-const byte Din_0 = 4;
-const byte Din_1 = 5;
-const byte Din_2 = 6;
-const byte Din_3 = 7;
-const byte ADC_0 = 13;
-const byte ADC_1 = 14;
-const byte PWM_1 = 11;
-const byte PWM_2 = 12;
-
-#ifdef SPS_RCRECEIVER
-const byte RC_0 = 15;
-const byte RC_1 = 16;
-#endif
-
-#ifdef SPS_SERVO
-const byte SERVO_1 = 11;
-const byte SERVO_2 = 12;
-#endif
-
-const byte SW_PRG = 9;
-const byte SW_SEL = 8;
-#endif
-
-// Befehle
+// Commands
 const byte PORT = 0x10;
 const byte DELAY = 0x20;
 const byte JUMP_BACK = 0x30;
@@ -268,8 +154,15 @@ const byte DEBOUNCE = 100;
 const byte subCnt = 7;
 word subs[subCnt];
 
+// the actual address of the program
 word addr;
+// page register
 word page;
+// defining register
+byte a, b, c, d;
+#ifdef SPS_ENHANCEMENT
+byte e, f;
+#endif
 
 #ifdef SPS_ENHANCEMENT
 const byte SAVE_CNT = 16;
@@ -287,12 +180,6 @@ byte stackCnt;
 
 unsigned long tmpValue;
 
-byte a, b, c, d;
-
-#ifdef SPS_ENHANCEMENT
-byte e, f;
-#endif
-
 #ifdef SPS_SERVO
 Servo servo1;
 Servo servo2;
@@ -319,6 +206,9 @@ void setup() {
   pinMode(SW_PRG, INPUT_PULLUP);
   pinMode(SW_SEL, INPUT_PULLUP);
 
+  digitalWrite(Dout_0, 1);
+  delay(1000);
+  digitalWrite(Dout_0, 0);
 #ifdef SPS_USE_DISPLAY
   initDisplay();
 #endif
@@ -328,6 +218,7 @@ void setup() {
   initDebug();
 #endif
 
+  prgDemoPrg();
   doReset();
 
   if (digitalRead(SW_PRG) == 0) {
@@ -336,6 +227,7 @@ void setup() {
 #ifdef SPS_ENHANCEMENT
   pinMode(LED_BUILTIN, OUTPUT);
 #endif
+
 #ifdef SPS_SERIAL_PRG
   if (digitalRead(SW_SEL) == 0) {
     serialPrg();
@@ -441,26 +333,7 @@ void loop() {
   byte cmd = (value & 0xF0);
   byte data = (value & 0x0F);
 
-  dbgOut2(addr, HEX);
-  dbgOut(":");
-  dbgOut2(value, HEX);
-  dbgOut(",");
-  dbgOut2(cmd, HEX);
-  dbgOut(",");
-  dbgOut2(data, HEX);
-  dbgOut(",a:");
-  dbgOut2(a, HEX);
-  dbgOut(",");
-  dbgOut2(b, HEX);
-  dbgOut(",");
-  dbgOut2(c, HEX);
-  dbgOut(",");
-  dbgOut2(d, HEX);
-  dbgOut(",");
-  dbgOut2(e, HEX);
-  dbgOut(",");
-  dbgOut2(f, HEX);
-  dbgOutLn();
+  debugOutputRegister();
 
   addr = addr + 1;
   switch (cmd) {
@@ -517,6 +390,14 @@ void loop() {
   }
 }
 
+void debugOutputRegister() {
+  dbgOut2(addr, HEX); dbgOut(":"); dbgOut2(value, HEX); dbgOut(",");
+  dbgOut2(cmd, HEX); dbgOut(","); dbgOut2(data, HEX); dbgOut(",a:");
+  dbgOut2(a, HEX); dbgOut(","); dbgOut2(b, HEX); dbgOut(",");
+  dbgOut2(c, HEX); dbgOut(","); dbgOut2(d, HEX); dbgOut(",");
+  dbgOut2(e, HEX); dbgOut(","); dbgOut2(f, HEX); dbgOutLn();
+}
+
 /*
   output to port
 */
@@ -833,6 +714,12 @@ void doCalc(byte data) {
     case 13:
       a = b - a;
       break;
+    case 14:
+      a = a >> 1;
+      break;
+    case 15:
+      a = a << 1;
+      break;
 #endif
     default:
       break;
@@ -884,7 +771,7 @@ void doDCount(byte data) {
 }
 
 /*
-  simple comdition = true skip next command
+  simple condition = true, skip next command
 */
 void doSkipIf(byte data) {
   bool skip = false;
@@ -1047,7 +934,7 @@ void doByte(byte data) {
     case 6:
       if (servo1.attached()) {
         dbgOut("Srv1:");
-        tmpValue = map(a,0, 255,0,180);
+        tmpValue = map(a, 0, 255, 0, 180);
         dbgOutLn(tmpValue);
         servo1.write(tmpValue);
       }
@@ -1055,7 +942,7 @@ void doByte(byte data) {
     case 7:
       if (servo2.attached()) {
         dbgOut("Srv2:");
-        tmpValue = map(a,0, 255,0,180);
+        tmpValue = map(a, 0, 255, 0, 180);
         dbgOutLn(tmpValue);
         servo2.write(tmpValue);
       }

+ 131 - 0
SPS/hardware.h

@@ -0,0 +1,131 @@
+// defining the hardware connections
+
+#ifdef __AVR_ATmega328P__
+// Arduino Hardware
+const byte Din_0 = 0;
+const byte Din_1 = 1;
+const byte Din_2 = 2;
+const byte Din_3 = 3;
+
+const byte Dout_0 = 4;
+const byte Dout_1 = 5;
+const byte Dout_2 = 6;
+const byte Dout_3 = 7;
+
+const byte ADC_0 = 0; //(15)
+const byte ADC_1 = 1; //(16)
+const byte PWM_1 = 9;
+const byte PWM_2 = 10;
+
+#ifdef SPS_RCRECEIVER
+const byte RC_0 = 18;
+const byte RC_1 = 19;
+#endif
+
+#ifdef SPS_SERVO
+const byte SERVO_1 = 9;
+const byte SERVO_2 = 10;
+#endif
+
+const byte SW_PRG = 8;
+const byte SW_SEL = 11;
+
+#ifdef SPS_USE_DISPLAY
+const byte DIGIT_DATA_IO = 12;
+const byte DIGIT_CLOCK = 13;
+#endif
+#endif
+
+#ifdef __AVR_ATtiny84__
+// ATTiny84 Hardware
+const byte Dout_0 = 6;
+const byte Dout_1 = 5;
+const byte Dout_2 = 4;
+const byte Dout_3 = 1;
+
+const byte Din_0 = 10;
+const byte Din_1 = 9;
+const byte Din_2 = 8;
+const byte Din_3 = 7;
+const byte ADC_0 = 0;
+const byte ADC_1 = 1;
+const byte PWM_1 = 2;
+const byte PWM_2 = 3;
+#ifdef SPS_RCRECEIVER
+const byte RC_0 = 10;
+const byte RC_1 = 9;
+#endif
+
+#ifdef SPS_SERVO
+const byte SERVO_1 = 2;
+const byte SERVO_2 = 3;
+#endif
+
+const byte SW_PRG = 0;
+const byte SW_SEL = 8;
+
+#ifdef SPS_USE_DISPLAY
+const byte DIGIT_DATA_IO = 4;
+const byte DIGIT_CLOCK = 5;
+#endif
+#endif
+
+#ifdef __AVR_ATtiny4313__
+// ATTiny4313 Hardware
+const byte Dout_0 = 0;
+const byte Dout_1 = 1;
+const byte Dout_2 = 2;
+const byte Dout_3 = 3;
+
+const byte Din_0 = 4;
+const byte Din_1 = 5;
+const byte Din_2 = 6;
+const byte Din_3 = 7;
+const byte ADC_0 = 13;
+const byte ADC_1 = 14;
+const byte PWM_1 = 11;
+const byte PWM_2 = 12;
+
+#ifdef SPS_RCRECEIVER
+const byte RC_0 = 15;
+const byte RC_1 = 16;
+#endif
+
+#ifdef SPS_SERVO
+const byte SERVO_1 = 11;
+const byte SERVO_2 = 12;
+#endif
+
+const byte SW_PRG = 9;
+const byte SW_SEL = 8;
+#endif
+
+#ifdef __AVR_ATtiny861__
+// ATTiny4313 Hardware
+const byte Dout_0 = 0;
+const byte Dout_1 = 1;
+const byte Dout_2 = 2;
+const byte Dout_3 = 3;
+
+const byte Din_0 = 4;
+const byte Din_1 = 5;
+const byte Din_2 = 6;
+const byte Din_3 = 7;
+const byte ADC_0 = 13;
+const byte ADC_1 = 14;
+const byte PWM_1 = 11;
+const byte PWM_2 = 12;
+
+#ifdef SPS_RCRECEIVER
+const byte RC_0 = 15;
+const byte RC_1 = 16;
+#endif
+
+#ifdef SPS_SERVO
+const byte SERVO_1 = 11;
+const byte SERVO_2 = 12;
+#endif
+
+const byte SW_PRG = 9;
+const byte SW_SEL = 8;
+#endif

+ 159 - 126
SPS/prgmode.ino

@@ -1,126 +1,159 @@
-/*
-  entering the programming mode
-*/
-
-#define BLINK_DELAY 250
-#define SHOW_DELAY 500
-#define KEY_DELAY 250
-
-enum PROGRAMMING_MODE {ADDRESS, COMMAND, DATA};
-
-PROGRAMMING_MODE prgMode;
-
-void programMode() {
-  // checking if advance programmer board connected?
-#ifdef SPS_ENHANCEMENT
-  if (digitalRead(SW_SEL) == 0) {
-    advancePrg();
-  }
-  else {
-#endif
-    dbgOutLn("PrgMode");
-    blinkAll();
-    prgMode = ADDRESS;
-    addr = 0;
-    do {
-      blinkD1();
-      dbgOut("Adr:");
-      dbgOutLn(addr);
-      // LoNibble Adresse anzeigen
-      doPort(addr);
-      delay(SHOW_DELAY);
-
-      blinkD2();
-      // HiNibble Adresse anzeigen
-      data = (addr & 0xf0) >> 4;                                  //Adresse anzeigen
-      doPort(data);
-      delay(SHOW_DELAY);
-
-      byte Eebyte = EEPROM.read(addr);
-      data = Eebyte & 15;
-      com = Eebyte >> 4;
-
-      blinkD3();
-      prgMode = COMMAND;
-      dbgOutLn("com");
-      doPort(com); //show command
-
-      do {
-        if (digitalRead(SW_SEL) == 0) {
-          delay(KEY_DELAY);
-          com += 1;
-          com = com & 0x0F;
-          doPort(com);
-        }
-      }
-      while (digitalRead(SW_PRG) == 1);
-      delay(DEBOUNCE);
-
-      blinkD4();
-      prgMode = DATA;
-      dbgOutLn("dat");
-      doPort(data); //show data
-
-      do {
-        if (digitalRead(SW_SEL) == 0) {
-          delay(KEY_DELAY);
-          data += 1;
-          data = data & 0x0F;
-          doPort(data);
-        }
-      }
-      while (digitalRead(SW_PRG) == 1); // S2 = 1
-      delay(DEBOUNCE);
-      
-      byte newValue = (com << 4) + data;
-      if (newValue != Eebyte) {
-        EEPROM.write(addr, newValue); //           Writeeeprom Eebyte , Addr
-        blinkAll();
-      }
-      addr += 1;
-    }
-    while (true);
-#ifdef SPS_ENHANCEMENT
-  }
-#endif
-}
-
-void blinkAll() {
-  blinkNull();
-  doPort(0x0F);
-  delay(BLINK_DELAY);
-}
-
-void blinkD1() {
-  blinkNull();
-  doPort(0x01);
-  delay(BLINK_DELAY);
-  blinkNull();
-}
-
-void blinkD2() {
-  blinkNull();
-  doPort(0x02);
-  delay(BLINK_DELAY);
-  blinkNull();
-}
-
-void blinkD3() {
-  blinkNull();
-  doPort(0x04);
-  delay(BLINK_DELAY);
-  blinkNull();
-}
-
-void blinkD4() {
-  blinkNull();
-  doPort(0x08);
-  delay(BLINK_DELAY);
-  blinkNull();
-}
-
-void blinkNull() {
-  doPort(0x00);
-  delay(BLINK_DELAY);
-}
-
+/*
+  entering the programming mode
+*/
+
+#define BLINK_DELAY 500
+#define SHOW_DELAY 1000
+#define KEY_DELAY 250
+#define ADDR_LOOP 50
+
+const byte demoPrg[] = { 0x4F, 0x59, 0x1F, 0x29, 0x10, 0x29, 0x5A, 0x40,
+                         0x59, 0x64, 0x54, 0x29, 0x4F, 0x59, 0x10, 0xCD,
+                         0x11, 0x28, 0xCC, 0x18, 0x28, 0x4F, 0x59, 0x5A,
+                         0x72, 0x26, 0xC0, 0x35, 0x80, 0x90, 0xFF
+                       };
+
+
+enum PROGRAMMING_MODE {ADDRESS, COMMAND, DATA};
+
+PROGRAMMING_MODE prgMode;
+
+void prgDemoPrg() {
+  byte value = EEPROM.read(0);
+  if (value == 0xFF) {
+    value = EEPROM.read(1);
+    if (value == 0xFF) {
+      for (byte i = 0; i < sizeof(demoPrg); i++) {
+        EEPROM.write(i, demoPrg[i]);
+      }
+    }
+  }
+}
+
+void programMode() {
+  // checking if advance programmer board connected?
+#ifdef SPS_ENHANCEMENT
+  if (digitalRead(SW_SEL) == 0) {
+    advancePrg();
+  }
+  else {
+#endif
+    dbgOutLn("PrgMode");
+    // light up all LEDs
+    doPort(0x08);
+    while (digitalRead(SW_PRG) == 0) {
+      // waiting for PRG to release
+    }
+    blinkAll();
+    prgMode = ADDRESS;
+    addr = 0;
+    do {
+      blinkD1();
+      dbgOut("Adr:");
+      dbgOutLn(addr);
+      // LoNibble Adresse anzeigen
+      doAddr(addr);
+      //delay(SHOW_DELAY);
+
+      blinkD2();
+      // HiNibble Adresse anzeigen
+      data = (addr & 0xf0) >> 4;                                  //Adresse anzeigen
+      doAddr(data);
+      //delay(SHOW_DELAY);
+
+      byte Eebyte = EEPROM.read(addr);
+      data = Eebyte & 15;
+      com = Eebyte >> 4;
+
+      blinkD3();
+      prgMode = COMMAND;
+      dbgOutLn("com");
+      doPort(com); //show command
+
+      do {
+        if (digitalRead(SW_SEL) == 0) {
+          delay(KEY_DELAY);
+          com += 1;
+          com = com & 0x0F;
+          doPort(com);
+        }
+      }
+      while (digitalRead(SW_PRG) == 1);
+      delay(DEBOUNCE);
+
+      blinkD4();
+      prgMode = DATA;
+      dbgOutLn("dat");
+      doPort(data); //show data
+
+      do {
+        if (digitalRead(SW_SEL) == 0) {
+          delay(KEY_DELAY);
+          data += 1;
+          data = data & 0x0F;
+          doPort(data);
+        }
+      }
+      while (digitalRead(SW_PRG) == 1); // S2 = 1
+      delay(DEBOUNCE);
+
+      byte newValue = (com << 4) + data;
+      if (newValue != Eebyte) {
+        EEPROM.write(addr, newValue); //           Writeeeprom Eebyte , Addr
+        blinkAll();
+      }
+      addr += 1;
+    }
+    while (true);
+#ifdef SPS_ENHANCEMENT
+  }
+#endif
+}
+
+void blinkAll() {
+  blinkNull();
+  doPort(0x0F);
+  delay(BLINK_DELAY);
+}
+
+void blinkD1() {
+  blinkNull();
+  doPort(0x01);
+  delay(BLINK_DELAY);
+  blinkNull();
+}
+
+void blinkD2() {
+  blinkNull();
+  doPort(0x02);
+  delay(BLINK_DELAY);
+  blinkNull();
+}
+
+void blinkD3() {
+  blinkNull();
+  doPort(0x04);
+  delay(BLINK_DELAY);
+  blinkNull();
+}
+
+void blinkD4() {
+  blinkNull();
+  doPort(0x08);
+  delay(BLINK_DELAY);
+  blinkNull();
+}
+
+void blinkNull() {
+  doPort(0x00);
+  delay(BLINK_DELAY);
+}
+
+void doAddr(byte value) {
+  for (byte i = ADDR_LOOP; i > 0; i--) {
+    doPort(value);
+    delay(19);
+    doPort(0x0F);
+    delay(1);
+  }
+}