diff options
author | Santo Cariotti <santo@dcariotti.me> | 2022-02-02 19:29:33 +0100 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2022-02-02 19:29:33 +0100 |
commit | 15bae2cabdb9c80219ec09f52ca91574622d392d (patch) | |
tree | f2b71457ee2d36514a102010ca6ffd4172b8e858 | |
parent | a04cf2a3e236e6a5934ff2588dacad91dc5be65e (diff) |
add exam
-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); + } +} |