@@ -3,6 +3,7 @@
#define VCP_TX_FREQ 1000
#define SSR_PERIOD 200
#define PID_PERIOD 200
#define LED_POWER GPIOF,GPIO_PIN_0
@@ -497,15 +497,22 @@ void display_process(therm_settings_t* s
// [ 30 => 120 C ]
ssd1306_DrawString("Error: ", 0, 0);
char tempstr[6];
itoa(status->tc_errno, tempstr, 10);
ssd1306_DrawString(tempstr, 0, 57);
if(status->tc_errno == 1)
ssd1306_DrawString(" Check Sensor (1)", 1, 0);
ssd1306_DrawString(" TC Open Circuit", 1, 0);
else if(status->tc_errno == 4)
ssd1306_DrawString(" Check Sensor (2)", 1, 0);
ssd1306_DrawString(" TC Short to GND", 1, 0);
else if(status->tc_errno == 8)
ssd1306_DrawString(" TC Short to VCC", 1, 0);
else
ssd1306_DrawString("#?, Unknown Error", 1, 0);
ssd1306_DrawString(" ", 2, 0);
ssd1306_DrawString("Press -> to ignore", 3, 0);
ssd1306_DrawString("-> to ignore all or", 2, 0);
ssd1306_DrawString("press to continue", 3, 0);
// Button handler
if(SW_BTN_PRESSED) {
@@ -48,6 +48,7 @@ int main(void)
/* Initialize all configured peripherals */
init_gpio();
MX_USB_DEVICE_Init();
// set.usb_plugged =
// USB startup delay
HAL_Delay(1000);
@@ -164,30 +165,38 @@ void update_temp() {
// Assemble data array into one var
uint16_t temp_pre = rxdatal[0] | (rxdatah[0]<<8);
if(temp_pre & 0b0000000000000010) {
/*
if(temp_pre & 0b010) {
ssd1306_clearscreen();
HAL_Delay(100); // FIXME: remove?
HAL_Delay(400); // FIXME: remove?
status.tc_errno = 4;
status.state = STATE_TC_ERROR;
status.temp = 0;
status.temp_frac = 0;
}
else if(temp_pre & 0b0000000000000001 && !set.ignore_tc_error) {
} */
if(temp_pre & 0b001 && !set.ignore_tc_error) {
status.tc_errno = 1;
status.state_resume = status.state;
}/*
else if(temp_pre & 0b100 && !set.ignore_tc_error) {
status.tc_errno = 8;
}*/
{
if(status.state == STATE_TC_ERROR)
status.state = status.state_resume;
//if(status.state == STATE_TC_ERROR)
//{
// status.state = status.state_resume;
// ssd1306_clearscreen();
//}
uint8_t sign = status.temp >> 15;// top bit is sign
@@ -282,25 +291,27 @@ int16_t update_pid(uint16_t k_p, uint16_
uint32_t last_ssr_on = 0;
uint32_t last_vcp_tx = 0;
uint32_t last_led = 0;
uint32_t last_pid = 0;
int16_t ssr_output = 0; // Duty cycle of ssr, 0 to SSR_PERIOD
// Turn SSR output on/off according to set duty cycle.
// TODO: Eventually maybe replace with a very slow timer or something. Double-check this code...
void process()
update_temp(); // Read MAX31855
uint32_t ticks = HAL_GetTick();
if(ticks - last_led > 400)
HAL_GPIO_TogglePin(LED_POWER);
last_led = ticks;
// Every 200ms, set the SSR on unless output is 0
if((ticks - last_ssr_on > SSR_PERIOD))
if((ticks - last_pid > PID_PERIOD))
if(status.pid_enabled)
// Get ssr output for next time
@@ -313,6 +324,13 @@ void process()
ssr_output = 0;
last_pid = ticks;
// Only support heating (ssr_output > 0) right now
if(ssr_output > 0) {
@@ -340,7 +358,8 @@ void process()
tempstr[numlen] = '\r';
tempstr[numlen+1] = '\n';
CDC_Transmit_FS(tempstr, numlen+2);
// if(set.usb_plugged)
// CDC_Transmit_FS(tempstr, numlen+2);
// while(CDC_Transmit_FS("\r\n", 2) == USBD_BUSY);
last_vcp_tx = ticks;
Status change: