# HG changeset patch # User Ethan Zonca # Date 2015-06-15 21:07:11 # Node ID 3dc8ab4e292865f3f58ec72747c7a788ad67f707 # Parent c0c52bad69d726178b9800df5d5ed73848134b04 Fix stupid thermocouple error issue finally. Temporarily disable CDC transmit. Move PID calcs into a different loop for fun and profit. diff --git a/config.h b/config.h --- a/config.h +++ b/config.h @@ -3,6 +3,7 @@ #define VCP_TX_FREQ 1000 #define SSR_PERIOD 200 +#define PID_PERIOD 200 #define LED_POWER GPIOF,GPIO_PIN_0 diff --git a/display.c b/display.c --- a/display.c +++ b/display.c @@ -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) { diff --git a/main.c b/main.c --- a/main.c +++ b/main.c @@ -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; - HAL_Delay(100); // FIXME: remove? + HAL_Delay(400); // FIXME: remove? status.state_resume = status.state; status.state = STATE_TC_ERROR; status.temp = 0; status.temp_frac = 0; - } + }/* + else if(temp_pre & 0b100 && !set.ignore_tc_error) { + status.tc_errno = 8; + HAL_Delay(400); // FIXME: remove? + status.state_resume = status.state; + status.state = STATE_TC_ERROR; + status.temp = 0; + status.temp_frac = 0; + }*/ else { - if(status.state == STATE_TC_ERROR) - { - status.state = status.state_resume; - ssd1306_clearscreen(); - } + //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)) { + update_temp(); // Read MAX31855 + + HAL_GPIO_TogglePin(LED_POWER); + if(status.pid_enabled) { // Get ssr output for next time @@ -313,6 +324,13 @@ void process() ssr_output = 0; } + last_pid = ticks; + } + + // Every 200ms, set the SSR on unless output is 0 + if((ticks - last_ssr_on > SSR_PERIOD)) + { + // 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;