Changeset - 3dc8ab4e2928
[Not reviewed]
cortex-f0
0 3 0
Ethan Zonca - 9 years ago 2015-06-15 21:07:11
ez@ethanzonca.com
Fix stupid thermocouple error issue finally. Temporarily disable CDC transmit. Move PID calcs into a different loop for fun and profit.
3 files changed with 47 insertions and 20 deletions:
0 comments (0 inline, 0 general)
config.h
Show inline comments
 
@@ -3,6 +3,7 @@
 

	
 
#define VCP_TX_FREQ 1000
 
#define SSR_PERIOD 200
 
#define PID_PERIOD 200
 

	
 
#define LED_POWER GPIOF,GPIO_PIN_0
 

	
display.c
Show inline comments
 
@@ -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) {
main.c
Show inline comments
 
@@ -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;
0 comments (0 inline, 0 general)