diff options
Diffstat (limited to 'Year_3/LSM')
| -rw-r--r-- | Year_3/LSM/ex_20150209_B.c | 180 | 
1 files changed, 180 insertions, 0 deletions
| diff --git a/Year_3/LSM/ex_20150209_B.c b/Year_3/LSM/ex_20150209_B.c new file mode 100644 index 0000000..8873ed1 --- /dev/null +++ b/Year_3/LSM/ex_20150209_B.c @@ -0,0 +1,180 @@ +#include "stm32_unict_lib.h" +#include <stdio.h> +#define X_VAL 11400 + +/* + * RA3    = PB10 + * RA2    = PB4 + * RB0    = PB0 + * RB1    = PC2 + * RA0    = ADC1_IN11 + * -      = PB5 + * +      = PB6 + * + * ==================== + * + * Not included POINT B + */ + +typedef enum { +    IDLE, +    TURNING_ON, +    TURN_ON +} status_t; + +status_t status = IDLE; + +int X_ms = X_VAL; /* 'r'*100 */ +int Z_ms = 495; /* 'c'*5 */ + +int high_temperature = 0; +int low_potence = 0; + +void +init() +{ +    DISPLAY_init(); +    GPIO_init(GPIOB); +    GPIO_init(GPIOC); +    GPIO_config_input(GPIOB, 10); +    GPIO_config_EXTI(GPIOB, EXTI10); +    EXTI_enable(EXTI10, FALLING_EDGE); + +    GPIO_config_input(GPIOB, 4); +    GPIO_config_EXTI(GPIOB, EXTI4); +    EXTI_enable(EXTI4, FALLING_EDGE); + +    GPIO_config_input(GPIOB, 5); +    GPIO_config_EXTI(GPIOB, EXTI5); +    EXTI_enable(EXTI5, FALLING_EDGE); + +    GPIO_config_input(GPIOB, 6); +    GPIO_config_EXTI(GPIOB, EXTI6); +    EXTI_enable(EXTI6, FALLING_EDGE); + +    GPIO_config_output(GPIOB, 0); +    GPIO_config_output(GPIOC, 2); + +    TIM_init(TIM2); +    TIM_set(TIM2, 0); +    TIM_config_timebase(TIM2, 8400, X_VAL * 10); +    TIM_enable_irq(TIM2, IRQ_UPDATE); +    TIM_on(TIM2); + +    TIM_init(TIM3); +    TIM_set(TIM3, 0); +    TIM_config_timebase(TIM3, 8400, Z_ms * 10); +    TIM_enable_irq(TIM3, IRQ_UPDATE); +    TIM_on(TIM3); + +    ADC_init(ADC1, ADC_RES_8, ADC_ALIGN_RIGHT); +    ADC_channel_config(ADC1, GPIOC, 1, 11); +    ADC_on(ADC1); +    ADC_sample_channel(ADC1, 11); + +    CONSOLE_init(); +} + +int +main() +{ +    init(); + +    int value; +    int adc_read; +    int min = X_VAL - 3000; +    int max = X_VAL + 3000; +    char s[5]; + +    for (;;) { +        ADC_start(ADC1); +        while (!ADC_completed(ADC1)) +            ; + +        adc_read = ADC_read(ADC1); +        value = ((adc_read * (max - min)) / 255.0) + min; +        TIM2->ARR = value * 10; + +        sprintf(s, "%f", value / 1000.0); +        DISPLAY_puts(0, s); +    } +    return 0; +} + +void +EXTI15_10_IRQHandler(void) +{ +    if (EXTI_isset(EXTI10)) { +        if (status == IDLE) { +            status = TURNING_ON; +            high_temperature = 0; +        } else if (status == TURN_ON || high_temperature) { +            GPIO_write(GPIOB, 0, 0); +            GPIO_write(GPIOC, 2, 0); +            status = IDLE; +            TIM3->CNT = 0; +            TIM2->CNT = 0; +        } + +        EXTI_clear(EXTI10); +    } +} + +void +EXTI9_5_IRQHandler(void) +{ +    if (EXTI_isset(EXTI5)) { +        if (status == IDLE) { +            Z_ms -= 50; +            TIM3->ARR = Z_ms; +            printf("%.2f ms\n", TIM3->ARR / 10.0); +        } + +        EXTI_clear(EXTI5); +    } + +    if (EXTI_isset(EXTI6)) { +        if (status == IDLE) { +            Z_ms += 50; +            TIM3->ARR = Z_ms; +            printf("%.2f ms\n", TIM3->ARR / 10.0); +        } + +        EXTI_clear(EXTI6); +    } +} + +void +EXTI4_IRQHandler(void) +{ +    if (EXTI_isset(EXTI4)) { +        if (status == TURNING_ON) { +            high_temperature = 1; +        } +        EXTI_clear(EXTI4); +    } +} + +void +TIM2_IRQHandler(void) +{ +    if (TIM_update_check(TIM2)) { +        if (status == TURNING_ON && !high_temperature) { +            status = TURN_ON; +            GPIO_write(GPIOB, 0, 1); +            GPIO_write(GPIOC, 2, 0); +        } +        TIM_update_clear(TIM2); +    } +} + +void +TIM3_IRQHandler(void) +{ +    if (TIM_update_check(TIM3)) { +        if (status == TURNING_ON) { +            GPIO_toggle(GPIOC, 2); +        } +        TIM_update_clear(TIM3); +    } +} | 
