summaryrefslogtreecommitdiffhomepage
path: root/digital/asserv/src
diff options
context:
space:
mode:
authorNicolas Schodet2008-04-16 09:21:28 +0200
committerNicolas Schodet2008-04-16 09:21:28 +0200
commit49922f7a4bb8b46753afa4e3d54d2f7138e493d0 (patch)
treedfae4072aab8cc3c6b0b6e4b2ae0844f7053816d /digital/asserv/src
parent0073cf73a50d43eadece4c1aa4498387ac5386dc (diff)
* 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.
Diffstat (limited to 'digital/asserv/src')
-rw-r--r--digital/asserv/src/asserv/pwm_mp.avr.c70
1 files 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
}