car004f/main.c

changeset 153
80d869ac365b
parent 152
e787f47c084b
child 154
46822de910ff
--- a/car004f/main.c	Mon Dec 23 14:05:53 2013 +0100
+++ b/car004f/main.c	Fri Dec 27 11:43:40 2013 +0100
@@ -21,9 +21,11 @@
     uint8_t initialized; // if 0xff, reset config to defaults on first boot
     uint8_t slot;
     uint8_t light;
+    uint8_t brake;
+    uint8_t accel;
     uint8_t program; // 0xff = inactive ; programming mode active on slot X
 } config_t;
-config_t EEMEM eeconfig = {0,0,0,0xff,0};
+config_t EEMEM eeconfig = {0,0xff,0,0,15,15,0};
 config_t config;
 
 volatile uint16_t data = 0;
@@ -32,6 +34,7 @@
 volatile uint16_t bitbuf = 0;
 volatile uint8_t car_speed[MAX_SLOTS];
 volatile uint8_t car_switch[MAX_SLOTS];
+volatile uint8_t car_act[MAX_SLOTS];
 
 volatile uint8_t car_timeout[MAX_SLOTS];
 volatile uint8_t timeout = 0;
@@ -50,11 +53,13 @@
     bitbuf = 0; // init
     bitbuf_len = 0b10000000; // init 1 pulse received
 
-    TCNT2 = 10;
+    //TCNT2 = 10;
+    TCNT2 = 9;
     TIMSK |= _BV(OCIE2); //enable timer2 interrupt
 }
 
 ISR ( TIMER2_COMP_vect ) {
+//    TCNT2 = 0;
     uint8_t clock;
     uint8_t state;
     uint8_t state2;
@@ -89,10 +94,6 @@
                 */
             }
 
-            // bugfix 20131223: timing errors, CLEAR timer2 flag before enable
-            // if this works, apply to track switches and pitlane too!
-            //GIFR = _BV(INTF0);
-
             GICR |= _BV(INT0) ; // Enable INT0
 
         } else {
@@ -142,12 +143,14 @@
 
 
 void brake_on(void) {
+    OCR1A = (int) ((float)0xff * (float)((float)config.brake / (float)15));
     LIGHT_PORT |= _BV(LIGHT_BRAKE); // brake light on
     DDRB |= _BV(1);                  // PB1 PWM Output enable
     brake_timeout = BRAKE_OFF_TIMEOUT;
 }
 
 void brake_off(void) {
+    OCR1A = 0;
     LIGHT_PORT &= ~_BV(LIGHT_BRAKE); // brake light off
     DDRB &= ~_BV(1);                  // PB1 PWM Output disable
     brake_timeout = 0;
@@ -204,6 +207,8 @@
     if (config.initialized == 0xff) {
         config.slot = 0;
         config.light = 0;
+        config.brake = 15;
+        config.accel = 15;
         config.program = 0xff;
         config.initialized = 0;
         config_save();
@@ -233,7 +238,7 @@
 
     //OCR1A = 63;                       // Dutycycle of OC1A = 25%
     //OCR1B = 127;                      // Dutycycle of OC1B = 50%
-    OCR1A = 0xff; // brake PWM!
+    OCR1A = 0; // brake PWM!
     OCR1B = 0; // Motor drive PWM
     DDRB &= ~_BV(2);                  // PB2 PWM Output disable
     DDRB &= ~_BV(1);                  // PB1 PWM Output disable
@@ -266,8 +271,10 @@
     }
 
 
+    float my_accel;
     my_switch = car_switch[config.slot]; // initialize
     my_speed = car_speed[config.slot]; // initialize
+    my_accel =  (float)config.accel / (float)15;
 
     while (1) {
         // main loop
@@ -276,7 +283,7 @@
 
         if (my_speed != car_speed[config.slot]) {
             my_speed = car_speed[config.slot];
-            OCR1B = (int) ((float)0xff * (float)((float)my_speed / (float)15));
+            OCR1B = (int) ((float)0xff * (float)((float)my_speed / (float)15) * my_accel );
             if (my_speed == 0) {
                 DDRB &= ~_BV(2);                  // PB2 PWM Output disable
                 brake_on();

mercurial