DEFINE_HEATER used to take 3 arguments. Today it takes 4. Soon it might
take 5. The transition from 3 to 4 was painful while old config files
had not caught up to the new parameters. Let's avoid the pain again in
the future by making this macro overloadable to accept any correct number
of arguments while doing the right thing. Also let's accept 5 or 6
parameters so new configs will work with today's "older" code.
Configs are always included via a config_wrapper.h now, and configs always
must include this safety-definition for a missing DEFINE_HEATER. Let's
simplify the configs by moving it to a common location.
You can reduce the max. power of each heater.
With the max_pwm value between 1 and 100% you reduce the active pwm.
For example you could reduce the power of your hotend.
My hotend for example is 12V 30W but connected to 24V. So it has
normally 120W. This is very huge. Setting the max_pwm to 25, it has
again ~30W.
This will decrease the flash size and should increase performance.
In some cases this will increase the used ram slightly.
In total this path costs 28 bytes RAM and saves 88 bytes of Flash on a STM32.
AVRs are not affected by this commit.
Was a little bit tricky. When using ADC with DMA and infitiy readings, everthing is ok. But we don't need so much readings.
To read only one shot after starting the ADC, we need something more.
Disabling continuous conversion and unset the DMA bit. So conversion is stopped. Else the next conversion could start at any ADC.
For a restart just enable again the DMA bit, the continuous conversion and start the ADC.
Works very nicely from full off (M106 S0) to full on (M106 S255).
Test: M106 should work now as expected. M106 S0 should turn full
off, M106 S255 should turn full on, both without any spike on the
scope.
Eureka!!!
The STM32 has only one data register for all channels. So I want to use the ADC over DMA.
Issues are: It is not possible to stop the DMA or the ADC without uninit and init the hole parts.
We have more or less one option. Manually start the ADC.
So what we have now. We start the ADC after reading the values from DMA buffer. The ADC now make a conversion of all channels.
We can read also the values because it uses a double buffer mode. With that mode we can read the unused buffer.
This test code in SysTickHandler() should give you a rather
accurate clock with only a few seconds deviation per hour:
#include "serial.h"
#include "sersendf.h"
void SysTick_Handler(void) {
static uint32_t count = 0;
static uint8_t minutes = 0, seconds = 0;
count++;
if ( ! (count % 500)) { // A full second.
seconds++;
if ( ! (seconds % 60)) {
seconds = 0;
minutes++;
}
sersendf_P(PSTR("%su:"), minutes);
if (seconds < 10)
serial_writechar('0');
sersendf_P(PSTR("%su\n"), seconds);
}
[...]