Simple test program to get familiar with functionality of MBED RTOS on ST Nucleo-F411RE. Tasks for LED blinking, user button, temperature measurement with DS1620, temperature measurement with internal temperature sensor of ST32F411RE, ultrasonic distance measurement and displaying result on 16x2 TextLCD.
Dependencies: DS1620_improved TextLCD_improved mbed-rtos mbed
Revision 17:94c385ff2641, committed 2015-12-18
- Comitter:
- dzoni
- Date:
- Fri Dec 18 15:23:21 2015 +0000
- Parent:
- 16:cfb774e3e7fc
- Child:
- 18:be0130c42925
- Commit message:
- Bugfixes. Works but freezes after some time. Button task requires rewrite (InterruptIn).
Changed in this revision
--- a/todo.txt Wed Dec 16 22:37:56 2015 +0000 +++ b/todo.txt Fri Dec 18 15:23:21 2015 +0000 @@ -1,1 +1,2 @@ 1. Change thread principle from Thread::wait() to FSM and its evaluation in given times and signals to particular threads. +2. Distance measurement: signal + mail, add timeout
--- a/tsk_button.cpp Wed Dec 16 22:37:56 2015 +0000
+++ b/tsk_button.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -18,7 +18,7 @@
led_flash_times.off_time = temp;
}
- Thread::wait(250);
+ Thread::wait(500);
}
}
--- a/tsk_display.cpp Wed Dec 16 22:37:56 2015 +0000
+++ b/tsk_display.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -3,10 +3,11 @@
#include "TextLCD.h"
+#include "tsk_main.h"
#include "tsk_display.h"
#include "tsk_temp.h"
+#include "tsk_inttemp.h"
#include "tsk_dist.h"
-#include "tsk_main.h"
static TextLCD *lcd;
@@ -14,10 +15,8 @@
lcd = new TextLCD(PA_8, PA_7, PA_9, PA_1, PB_5, PA_10, TextLCD::LCD16x2);
+ wait_ms(250);
lcd->cls();
- lcd->printf("Row 1");
- lcd->locate(0, 1);
- lcd->printf("Row 2");
return 1;
}
@@ -32,14 +31,36 @@
void disp_thread(void const *args) {
+ float dist;
+ float temp;
+ float intTemp;
+ uint32_t dist_raw;
+ uint32_t temp_raw;
+
+ while (true) {
+ mutexDist.lock();
+ dist = dist_data.distance;
+ dist_raw = dist_data.timerTicks;
+ mutexDist.unlock();
- while (true) {
+ mutexTemp.lock();
+ temp = temp_data.temperature;
+ temp_raw = temp_data.temp_raw;
+ mutexTemp.unlock();
+
+ mutexIntTemp.lock();
+ intTemp = int_temp_data.temperature;
+ mutexIntTemp.unlock();
+
+ uiCnt += 2;
+
lcd->cls();
- lcd->printf("Raw:%3u % 5.0f mm", temp_data.temp_raw, dist_data.distance);
-// uiCnt += 2;
+// lcd->printf("%4.2fmm (%4u)", dist, dist_raw);
+ lcd->printf("%4.2fmm (%4u)", dist, uiCnt);
lcd->locate(0, 1);
- lcd->printf("Float: %3.2f%cC", temp_data.temperature, 0xdf);
+// lcd->printf("%3.2f%cC (%3u)", temp, 0xdf, temp_raw);
+ lcd->printf("%3.1f%cC (%2.1f)", temp, 0xdf, intTemp);
- Thread::wait(1896);
+ Thread::wait(2000);
}
}
\ No newline at end of file
--- a/tsk_dist.cpp Wed Dec 16 22:37:56 2015 +0000
+++ b/tsk_dist.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -1,16 +1,26 @@
#include "mbed.h"
#include "rtos.h"
+#include "tsk_main.h"
#include "tsk_dist.h"
-struct dist_data_struct dist_data = { 10000, 10.0f };
-
+struct dist_data_struct dist_data;
static DigitalOut trigDist(PB_9);
static InterruptIn echoDist(PA_6);
-static Timer timer;
+static Timer timer;
+
+uint32_t initDist(void const *args) {
+
+ dist_data.distance = 0.0f;
+ dist_data.timerTicks = 0;
+
+ trigDist = 0;
+
+ return 1;
+}
static void rising(void) {
timer.start();
@@ -21,10 +31,12 @@
echoDist.rise(0);
echoDist.fall(0);
+// mutexDist.lock();
dist_data.timerTicks = timer.read_us();
// 340 ms-1
dist_data.distance = (timer.read()/2.0f - 0.0f)*340.0f*1000.0f;
+// mutexDist.unlock();
// Vynuluj timer
timer.reset();
@@ -39,8 +51,10 @@
trigDist = 0;
if (echoDist != 0) {
+ mutexDist.lock();
dist_data.timerTicks = 0;
dist_data.distance = 0.0f;
+ mutexDist.unlock();
} else {
// Vynuluj timer
timer.stop();
@@ -51,6 +65,6 @@
echoDist.fall(&falling);
}
- Thread::wait(500);
+ Thread::wait(1000);
}
}
--- a/tsk_dist.h Wed Dec 16 22:37:56 2015 +0000 +++ b/tsk_dist.h Fri Dec 18 15:23:21 2015 +0000 @@ -8,6 +8,7 @@ extern struct dist_data_struct dist_data; +extern uint32_t initDist(void const *args); extern void dist_thread(void const *args); #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tsk_inttemp.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -0,0 +1,73 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "stm32f411xe.h"
+
+#include "tsk_main.h"
+#include "tsk_inttemp.h"
+
+
+struct int_temp_data_struct int_temp_data = { 0 };
+
+
+uint32_t initIntTemp(void const *args) {
+
+ int_temp_data.temperature = 0.0f;
+
+ //enable ADC1 clock
+ SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);
+
+ // ADC on
+ SET_BIT(ADC1->CR2, ADC_CR2_ADON);
+ CLEAR_BIT(ADC1->CR2, ADC_CR2_CONT);
+
+ // Temp sensor on
+ CLEAR_BIT(ADC->CCR, ADC_CCR_VBATE);
+ SET_BIT(ADC->CCR, ADC_CCR_TSVREFE);
+
+ CLEAR_BIT(ADC1->CR1, ADC_CR1_RES);
+
+ return 1;
+}
+
+static uint16_t getADCTemp() {
+ // Set channel
+ ADC1->SQR1 &= ~ADC_SQR1_L; // Count = 1
+ ADC1->SQR3 |= ADC_SQR3_SQ1 & 18;
+
+ // Start conversion
+ SET_BIT(ADC1->CR2, ADC_CR2_SWSTART);
+
+ // Wait for completion
+ while (!READ_BIT(ADC1->SR, ADC_SR_EOC))
+ ;
+
+ // Return result
+ return READ_REG(ADC1->DR);
+}
+
+
+void inttemp_thread(void const *args) {
+
+ const float V25 = 943.3212f;// when V25=1.41V at ref 3.3V (0,76V)
+ const float Avg_Slope = 3.1030303f; //when avg_slope=4.3mV/C at ref 3.3V (2.5mV/C)
+ const uint16_t bufferSize = 4;
+
+ float temp;
+ uint16_t i;
+ uint16_t uiCnt = 0;
+
+
+ while (true) {
+ for (i = 0, temp = 0.0f; i < bufferSize; i++) {
+ temp += ((float)getADCTemp() - V25) / Avg_Slope + 48.2f;
+ Thread::wait(100);
+ }
+ temp /= (float)bufferSize;
+
+ mutexIntTemp.lock();
+ int_temp_data.temperature = temp;
+ mutexIntTemp.unlock();
+
+ Thread::wait(5000);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tsk_inttemp.h Fri Dec 18 15:23:21 2015 +0000
@@ -0,0 +1,13 @@
+#ifndef TSK_INTTEMP_H
+#define TSK_INTTEMP_H
+
+struct int_temp_data_struct {
+ float temperature;
+};
+
+extern struct int_temp_data_struct int_temp_data;
+
+extern uint32_t initIntTemp(void const *args);
+extern void inttemp_thread(void const *args);
+
+#endif
--- a/tsk_led.cpp Wed Dec 16 22:37:56 2015 +0000
+++ b/tsk_led.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -4,11 +4,18 @@
#include "tsk_led.h"
-struct led_flash_times_struct led_flash_times = { 100, 2500 };
+struct led_flash_times_struct led_flash_times;
static DigitalOut led2(LED2);
+uint32_t initLed(void const *args) {
+
+ led_flash_times.on_time = 100;
+ led_flash_times.off_time = 2500;
+
+ return 1;
+}
void led_thread(void const *args) {
--- a/tsk_led.h Wed Dec 16 22:37:56 2015 +0000 +++ b/tsk_led.h Fri Dec 18 15:23:21 2015 +0000 @@ -8,6 +8,7 @@ extern struct led_flash_times_struct led_flash_times; +extern uint32_t initLed(void const *args); extern void led_thread(void const *args); #endif
--- a/tsk_main.cpp Wed Dec 16 22:37:56 2015 +0000
+++ b/tsk_main.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -6,11 +6,14 @@
#include "tsk_dist.h"
#include "tsk_led.h"
#include "tsk_temp.h"
+#include "tsk_inttemp.h"
#define TASKS_NUMBER (sizeof(taskList)/sizeof(taskList[0]))
uint32_t uiCnt = 0;
-
+Mutex mutexDist;
+Mutex mutexTemp;
+Mutex mutexIntTemp;
struct task_definition_struct {
void(*task)(void const *args);
@@ -26,11 +29,12 @@
};
static struct task_definition_struct taskList[] = {
- { dist_thread, NULL, NULL, NULL, osPriorityNormal, 0, NULL, 0 },
- { temp_thread, &initDS1620Temp, NULL, NULL, osPriorityLow, 0, NULL, 0 },
- { button_thread, NULL, NULL, NULL, osPriorityNormal, 0, NULL, 0 },
- { led_thread, NULL, NULL, NULL, osPriorityNormal, 0, NULL, 0 },
- { disp_thread, &initDisplay, NULL, NULL, osPriorityNormal, 0, NULL, 0 },
+// { dist_thread, &initDist, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
+ { temp_thread, &initDS1620Temp, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
+ { inttemp_thread, &initIntTemp, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
+// { button_thread, NULL, NULL, NULL, osPriorityNormal, 0, NULL, 0 },
+ { led_thread, &initLed, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
+ { disp_thread, &initDisplay, NULL, NULL, osPriorityNormal, 100, NULL, 0 },
};
static uint32_t initTasks(void) {
@@ -60,8 +64,6 @@
int main() {
- Thread::wait(1000);
-
initTasks();
Thread::wait(osWaitForever);
--- a/tsk_main.h Wed Dec 16 22:37:56 2015 +0000 +++ b/tsk_main.h Fri Dec 18 15:23:21 2015 +0000 @@ -1,6 +1,10 @@ #ifndef TSK_MAIN_H #define TSK_MAIN_H +extern Mutex mutexDist; +extern Mutex mutexTemp; +extern Mutex mutexIntTemp; + extern uint32_t uiCnt; #endif
--- a/tsk_temp.cpp Wed Dec 16 22:37:56 2015 +0000
+++ b/tsk_temp.cpp Fri Dec 18 15:23:21 2015 +0000
@@ -3,17 +3,21 @@
#include "DS1620.h"
+#include "tsk_main.h"
#include "tsk_temp.h"
-struct temp_data_struct temp_data = { 20, 10.0f };
+struct temp_data_struct temp_data;
static DS1620 ds1620Sensor(PB_4, PB_10, PB_3);
uint32_t initDS1620Temp(void const *args) {
- ds1620Sensor.setSerialClockFrequency(freq500k);
+ temp_data.temperature = 10.0f;
+ temp_data.temp_raw = 10;
+
+ ds1620Sensor.setSerialClockFrequency(freq250k);
if ((ds1620Sensor.readConfig() & 0x03) != 0x03) {
ds1620Sensor.writeConfig(0x03);
@@ -28,6 +32,9 @@
void temp_thread(void const *args) {
+ float temp;
+ uint32_t temp_raw;
+
while (true) {
ds1620Sensor.startConversion();
@@ -36,7 +43,14 @@
while (!(ds1620Sensor.readConfig() & 0x80))
Thread::wait(10);
- temp_data.temperature = ds1620Sensor.getHighResolutionTemperature();
- temp_data.temp_raw = ds1620Sensor.readTemperatureRaw();
+ temp = ds1620Sensor.getHighResolutionTemperature();
+ temp_raw = ds1620Sensor.readTemperatureRaw();
+
+ mutexTemp.lock();
+ temp_data.temperature = temp;
+ temp_data.temp_raw = temp_raw;
+ mutexTemp.unlock();
+
+ Thread::wait(1250);
}
}