summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2022-02-02 19:29:33 +0100
committerSanto Cariotti <santo@dcariotti.me>2022-02-02 19:29:33 +0100
commit15bae2cabdb9c80219ec09f52ca91574622d392d (patch)
treef2b71457ee2d36514a102010ca6ffd4172b8e858
parenta04cf2a3e236e6a5934ff2588dacad91dc5be65e (diff)
add exam
-rw-r--r--Year_3/LSM/ex_20150209_B.c180
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);
+ }
+}