From 49922f7a4bb8b46753afa4e3d54d2f7138e493d0 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Wed, 16 Apr 2008 09:21:28 +0200 Subject: * digital/asserv/src/asserv: - added support for a second motor-power-avr board using the PWM3/VCOM_L pin as chip select. - set pwm to zero at reset. --- digital/asserv/src/asserv/pwm_mp.avr.c | 70 ++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/digital/asserv/src/asserv/pwm_mp.avr.c b/digital/asserv/src/asserv/pwm_mp.avr.c index e47b6068..e79fd0ef 100644 --- a/digital/asserv/src/asserv/pwm_mp.avr.c +++ b/digital/asserv/src/asserv/pwm_mp.avr.c @@ -45,48 +45,76 @@ uint8_t pwm_mp_go; void pwm_mp_init (void) { +#if PWM3or4 + /* Only needed for PWM3 and 4 because it is done in spi_init for SS (port + * B0). */ + PORTD |= _BV (4); + DDRD |= _BV (4); +#endif #if PWM1or2 || PWM3or4 spi_init (SPI_IT_DISABLE | SPI_ENABLE | SPI_MSB_FIRST | SPI_MASTER | SPI_CPOL_FALLING | SPI_CPHA_SETUP | SPI_FOSC_DIV16); #endif + /* Reset PWM values at reset. */ + pwm_mp_go = 1; + pwm_mp_update (); + pwm_mp_go = 0; } -/** Update PWM values. */ -void -pwm_mp_update (void) -{ #if PWM1or2 || PWM3or4 + +/** Send command using SPI. */ +static void +pwm_mp_send (int16_t pwm1, int16_t pwm2) +{ uint8_t v; uint8_t cks; - if (PWM1c (PWM1) || PWM2c (PWM2) || PWM3c (PWM3) || PWM4c (PWM4)) - pwm_mp_go = 1; - if (!pwm_mp_go) - return; -#endif -#if PWM1or2 - /* Chip enable. */ - PORTB &= ~_BV (0); /* Convert to 12 bits. */ - int16_t pwm1 = PWM1c (PWM1) << 1; - int16_t pwm2 = PWM2c (PWM2) << 1; - if (UTILS_ABS (pwm1) < 0x20) - pwm1 = 0; - if (UTILS_ABS (pwm2) < 0x20) - pwm2 = 0; + int16_t pwm1c = pwm1 << 1; + int16_t pwm2c = pwm2 << 1; + if (UTILS_ABS (pwm1c) < 0x20) + pwm1c = 0; + if (UTILS_ABS (pwm2c) < 0x20) + pwm2c = 0; /* Send, computing checksum on the way. */ cks = 0x42; - v = ((pwm1 >> 4) & 0xf0) | ((pwm2 >> 8) & 0x0f); + v = ((pwm1c >> 4) & 0xf0) | ((pwm2c >> 8) & 0x0f); spi_send (v); cks ^= v; - v = pwm1; + v = pwm1c; spi_send (v); cks ^= v; - v = pwm2; + v = pwm2c; spi_send (v); cks ^= v; spi_send (cks); +} + +#endif /* PWM1or2 || PWM3or4 */ + +/** Update PWM values. */ +void +pwm_mp_update (void) +{ +#if PWM1or2 || PWM3or4 + if (PWM1c (PWM1) || PWM2c (PWM2) || PWM3c (PWM3) || PWM4c (PWM4)) + pwm_mp_go = 1; + if (!pwm_mp_go) + return; +#endif +#if PWM1or2 + /* Chip enable. */ + PORTB &= ~_BV (0); + pwm_mp_send (PWM1c (PWM1), PWM2c (PWM2)); /* Chip disable. */ PORTB |= _BV (0); #endif +#if PWM3or4 + /* Chip enable. */ + PORTE &= ~_BV (4); + pwm_mp_send (PWM3c (PWM3), PWM4c (PWM4)); + /* Chip disable. */ + PORTE |= _BV (4); +#endif } -- cgit v1.2.3