use CRC16 to verify heater PID settings in eeprom
This commit is contained in:
parent
9dc4d54133
commit
8540be950a
2
Makefile
2
Makefile
|
|
@ -96,7 +96,7 @@ PROGBAUD = 57600
|
||||||
|
|
||||||
PROGRAM = mendel
|
PROGRAM = mendel
|
||||||
|
|
||||||
SOURCES = $(PROGRAM).c serial.c dda.c gcode_parse.c gcode_process.c timer.c temp.c sermsg.c dda_queue.c watchdog.c debug.c sersendf.c heater.c analog.c delay.c intercom.c pinio.c clock.c home.c
|
SOURCES = $(PROGRAM).c serial.c dda.c gcode_parse.c gcode_process.c timer.c temp.c sermsg.c dda_queue.c watchdog.c debug.c sersendf.c heater.c analog.c delay.c intercom.c pinio.c clock.c home.c crc.c
|
||||||
|
|
||||||
ARCH = avr-
|
ARCH = avr-
|
||||||
CC = $(ARCH)gcc
|
CC = $(ARCH)gcc
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
#include "crc.h"
|
||||||
|
|
||||||
|
#include <util/crc16.h>
|
||||||
|
|
||||||
|
// uint16_t _crc16_update(uint16_t crc, uint8_t a) {
|
||||||
|
// int i;
|
||||||
|
// crc ^= a;
|
||||||
|
// for (i = 0; i < 8; ++i)
|
||||||
|
// {
|
||||||
|
// if (crc & 1)
|
||||||
|
// crc = (crc >> 1) ^ 0xA001;
|
||||||
|
// else
|
||||||
|
// crc = (crc >> 1);
|
||||||
|
// }
|
||||||
|
// return crc;
|
||||||
|
// }
|
||||||
|
|
||||||
|
uint16_t crc_block(void *data, uint16_t len) {
|
||||||
|
uint16_t crc = 0;
|
||||||
|
for (; len; data++, len--) {
|
||||||
|
crc = _crc16_update(crc, *((uint8_t *) data));
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef _CRC_H
|
||||||
|
#define _CRC_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
uint16_t crc_block(void *data, uint16_t len);
|
||||||
|
|
||||||
|
#endif /* _CRC_H */
|
||||||
13
heater.c
13
heater.c
|
|
@ -6,10 +6,12 @@
|
||||||
|
|
||||||
#include "arduino.h"
|
#include "arduino.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#ifndef EXTRUDER
|
|
||||||
#include "sersendf.h"
|
|
||||||
#endif
|
|
||||||
#include "temp.h"
|
#include "temp.h"
|
||||||
|
#include "crc.h"
|
||||||
|
|
||||||
|
#ifndef EXTRUDER
|
||||||
|
#include "sersendf.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
volatile uint8_t *heater_port;
|
volatile uint8_t *heater_port;
|
||||||
|
|
@ -59,6 +61,7 @@ typedef struct {
|
||||||
int32_t EE_i_factor;
|
int32_t EE_i_factor;
|
||||||
int32_t EE_d_factor;
|
int32_t EE_d_factor;
|
||||||
int16_t EE_i_limit;
|
int16_t EE_i_limit;
|
||||||
|
uint16_t crc;
|
||||||
} EE_factor;
|
} EE_factor;
|
||||||
|
|
||||||
EE_factor EEMEM EE_factors[NUM_HEATERS];
|
EE_factor EEMEM EE_factors[NUM_HEATERS];
|
||||||
|
|
@ -101,7 +104,8 @@ void heater_init() {
|
||||||
heaters_pid[i].d_factor = eeprom_read_dword((uint32_t *) &EE_factors[i].EE_d_factor);
|
heaters_pid[i].d_factor = eeprom_read_dword((uint32_t *) &EE_factors[i].EE_d_factor);
|
||||||
heaters_pid[i].i_limit = eeprom_read_word((uint16_t *) &EE_factors[i].EE_i_limit);
|
heaters_pid[i].i_limit = eeprom_read_word((uint16_t *) &EE_factors[i].EE_i_limit);
|
||||||
|
|
||||||
if ((heaters_pid[i].p_factor == 0) && (heaters_pid[i].i_factor == 0) && (heaters_pid[i].d_factor == 0) && (heaters_pid[i].i_limit == 0)) {
|
// if ((heaters_pid[i].p_factor == 0) && (heaters_pid[i].i_factor == 0) && (heaters_pid[i].d_factor == 0) && (heaters_pid[i].i_limit == 0)) {
|
||||||
|
if (crc_block(&heaters_pid[i].p_factor, 14) != eeprom_read_word((uint16_t *) &EE_factors[i].crc)) {
|
||||||
heaters_pid[i].p_factor = DEFAULT_P;
|
heaters_pid[i].p_factor = DEFAULT_P;
|
||||||
heaters_pid[i].i_factor = DEFAULT_I;
|
heaters_pid[i].i_factor = DEFAULT_I;
|
||||||
heaters_pid[i].d_factor = DEFAULT_D;
|
heaters_pid[i].d_factor = DEFAULT_D;
|
||||||
|
|
@ -119,6 +123,7 @@ void heater_save_settings() {
|
||||||
eeprom_write_dword((uint32_t *) &EE_factors[i].EE_i_factor, heaters_pid[i].i_factor);
|
eeprom_write_dword((uint32_t *) &EE_factors[i].EE_i_factor, heaters_pid[i].i_factor);
|
||||||
eeprom_write_dword((uint32_t *) &EE_factors[i].EE_d_factor, heaters_pid[i].d_factor);
|
eeprom_write_dword((uint32_t *) &EE_factors[i].EE_d_factor, heaters_pid[i].d_factor);
|
||||||
eeprom_write_word((uint16_t *) &EE_factors[i].EE_i_limit, heaters_pid[i].i_limit);
|
eeprom_write_word((uint16_t *) &EE_factors[i].EE_i_limit, heaters_pid[i].i_limit);
|
||||||
|
eeprom_write_word((uint16_t *) &EE_factors[i].crc, crc_block(&heaters_pid[i].p_factor, 14));
|
||||||
}
|
}
|
||||||
#endif /* BANG_BANG */
|
#endif /* BANG_BANG */
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue