Mercurial > d1-mini-20ch-servo
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
