changeset 6:a9ed66598e2a draft

Fix some off-by-ones
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 19 Dec 2016 09:26:28 +0100
parents 620290fa34eb
children 6a2ed0cd19a3
files firmware/main.c
diffstat 1 files changed, 12 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/firmware/main.c	Mon Dec 19 00:49:04 2016 +0100
+++ b/firmware/main.c	Mon Dec 19 09:26:28 2016 +0100
@@ -20,33 +20,16 @@
 
 static uint16_t servo_pulse[MAX_SERVO];
 
-volatile static uint16_t servo_delay[MAX_SERVO];
+volatile static uint16_t servo_delay[MAX_SERVO + 1];
 volatile static uint8_t servo_mask_b[MAX_SERVO];
 volatile static uint8_t servo_mask_c[MAX_SERVO];
 volatile static uint8_t servo_mask_d[MAX_SERVO];
 volatile static uint8_t event;
 
 // Remap servo numbers to pins.
-// 0 = PB0
-// 1 = PB1
-// 2 = PB2
-// 3 = PB3
-// 4 = PB4
-// 5 = PB5
-// 6 = PB6
-// 7 = PB7
-// 8 = PC0
-// 9 = PC1
-// 10 = PC2
-// 11 = PC3
-// 12 = PD0
-// 13 = PD1
-// 14 = PD2
-// 15 = PD3
-// 16 = PD4
-// 17 = PD5
-// 18 = PD6
-// 19 = PD7
+// 0 = PB0  1 = PB1  2 = PB2  3 = PB3  4 = PB4  5 = PB5  6 = PB6 7 = PB7
+// 8 = PC0  9 = PC1  10 = PC2  11 = PC3  12 = PD0 13 = PD1  14 = PD2  15 = PD3
+// 16 = PD4  17 = PD5  18 = PD6 19 = PD7
 const static uint8_t servo_map[MAX_SERVO] = {
     13, 10, 11, 12, 14, 15, 16, 6, 7, 17, 9, 8, 5, 4, 3, 2, 1, 0, 19, 18
 };
@@ -54,18 +37,18 @@
 ISR(TIMER1_COMPA_vect) {
     event = 0;
     PORTB = 0b11111111;
-    PORTC = 0b00001111; // leave out RESET, SDA and SCL
+    PORTC = 0b00001111; // leave out RESET, SDA, SCL, PC7
     PORTD = 0b11111111;
     TCNT1 = 0;
-    OCR1B = servo_delay[event];
+    OCR1B = servo_delay[0];
 }
 
 
 ISR(TIMER1_COMPB_vect) {
-    event += 1;
     PORTB &= servo_mask_b[event];
     PORTC &= servo_mask_c[event];
     PORTD &= servo_mask_d[event];
+    event += 1;
     OCR1B = servo_delay[event];
 }
 
@@ -112,13 +95,17 @@
     // setup servos
     TCCR1A = 0x00;
     TCCR1B &= ~(1<<CS12 | 1<<CS11 | 1<<CS10);
-    TCCR1B |= 0x02; // prescaler 8
+    TCCR1B = 0x02; // prescaler 8
     OCR1A = 20000; // period
     TIMSK1 = 1<<OCIE1A | 1<<OCIE1B;
+    DDRB = 0xff;
+    DDRC = 0x0f;
     DDRD = 0xff;
     for (int i = 0; i < MAX_SERVO; ++i) {
         servo_pulse[i] = 0;
+        servo_delay[i] = 0xffff;
     }
+    servo_delay[MAX_SERVO] = 0xffff;
     servo_update();
     sei();
     TCCR1C |= 1<<FOC1A; // trigger COMPA