use mbed-src latest version and everything works well. RTC is also fine.
Dependencies: L3GD20 LIS3DH TextLCD mbed-rtos mbed
Use standard library mbed & mbed-rtos (GR-PEACH can run without mbed-src and special mbed-rtos).
main.cpp
- Committer:
- kenjiArai
- Date:
- 2015-02-12
- Revision:
- 9:de986e74bd93
- Parent:
- 8:4006b111c0d4
File content as of revision 9:de986e74bd93:
/* * mbed Application program for the mbed * Test program for GR-PEACH * * Copyright (c) 2014,'15 Kenji Arai / JH1PJL * http://www.page.sannet.ne.jp/kenjia/index.html * http://mbed.org/users/kenjiArai/ * Created: November 29th, 2014 * Revised: Feburary 8th, 2015 * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Include --------------------------------------------------------------------------------------- #include "mbed.h" #include "rtos.h" #include "L3GD20.h" #include "LIS3DH.h" #include "TextLCD.h" // Definition ------------------------------------------------------------------------------------ #define USE_COM // use Communication with PC(UART) #define USE_I2C_LCD #define USE_I2C_SENSOR // Com #ifdef USE_COM #define BAUD(x) pcx.baud(x) #define GETC(x) pcx.getc(x) #define PUTC(x) pcx.putc(x) #define PRINTF(...) pcx.printf(__VA_ARGS__) #define READABLE(x) pcx.readable(x) #else #define BAUD(x) {;} #define GETC(x) {;} #define PUTC(x) {;} #define PRINTF(...) {;} #define READABLE(x) {;} #endif #define TIMEBASE 12000 #define FIXED_STEPS 100 #define PI 3.1415926536 #define RAD_TO_DEG 57.29578 #define TIME_BASE_S 0.02 #define TIME_BASE_MS ( TIME_BASE_S * 1000) #define RATE 0.1 // Object ---------------------------------------------------------------------------------------- // LED's DigitalOut LEDs[4] = { DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4) }; // Swiches DigitalIn USER_SWITCH[2] = { #if defined(TARGET_RZ_A1H) DigitalIn(P6_0), DigitalIn(P6_1) #elif defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) DigitalIn(PC_13), DigitalIn(A0) #endif }; // OS check #if defined(TARGET_RZ_A1H) DigitalOut task0(P1_8); DigitalOut task1(P1_9); #elif defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F411RE) DigitalOut task0(A0); DigitalOut task1(A1); #endif // com #ifdef USE_COM Serial pcx(USBTX, USBRX); // Communication with Host #endif I2C i2c(D14,D15); // Gyro L3GX_GYRO gyro(i2c, L3GD20_V_CHIP_ADDR, L3GX_DR_95HZ, L3GX_BW_HI, L3GX_FS_250DPS); // Acc LIS3DH acc(i2c, LIS3DH_G_CHIP_ADDR, LIS3DH_DR_NR_LP_50HZ, LIS3DH_FS_8G); #ifdef USE_I2C_LCD // LCD TextLCD_I2C_N lcd0(&i2c, 0x7c, TextLCD::LCD16x2); // LCD(Akizuki AQM0802A) #endif // Mutex Mutex i2c_mutex; // RAM ------------------------------------------------------------------------------------------- Queue<uint32_t, 2> queue0; float fa[3]; // Acc 0:X, 1:Y, 2:Z float fg[3]; // Gyro 0:X, 1:Y, 2:Z /* Mail */ typedef struct { float voltage; /* AD result of measured voltage */ float current; /* AD result of measured current */ uint32_t counter; /* A counter value */ } mail_t; Mail<mail_t, 16> mail_box; uint8_t show_flag0; uint8_t show_flag1; uint32_t count; #if defined(TARGET_RZ_A1H) uint8_t big_data[4096*1024]; uint32_t big_data_index = 0; #endif // ROM / Constant data --------------------------------------------------------------------------- // Function prototypes --------------------------------------------------------------------------- // Function prototypes --------------------------------------------------------------------------- extern int mon( void); //------------------------------------------------------------------------------------------------- // Control Program //------------------------------------------------------------------------------------------------- void send_thread (void const *args) { uint32_t i = 0; while (true) { i++; // fake data update mail_t *mail = mail_box.alloc(); mail->voltage = (i * 0.1) * 33; mail->current = (i * 0.1) * 11; mail->counter = i; mail_box.put(mail); Thread::wait(1000); } } void blink(void const *n) { LEDs[(int)n] = !LEDs[(int)n]; } // Read switch status int read_sw(uint8_t n){ if (USER_SWITCH[n] == 0){ return 1; } else { return 0;} } // Monitor program void monitor(void const *args){ Thread::wait(1000); while (true){ mon(); } } void watch_time (void const *args) { uint32_t i = 0; time_t seconds; char buf[64]; #if 0 struct tm t; t.tm_year = 15 + 100; t.tm_mon = 2 - 1; t.tm_mday = 7; t.tm_hour = 22; t.tm_min = 21; t.tm_sec = 20; seconds = mktime(&t); set_time(seconds); #endif while (true) { seconds = time(NULL); strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds)); if (show_flag1){ printf("[TASK1] %s, No:%5d, Ticker:%10u\r\n",buf, i++, us_ticker_read()); } Thread::wait(1000); } } // Interrupt routine void queue_isr0() { queue0.put((uint32_t*)1); } // Update sensor data void update_angle(void const *args){ while (true) { osEvent evt = queue0.get(); // ---->lock i2c_mutex.lock(); #ifdef USE_I2C_SENSOR // read acceleration data from sensor acc.read_data(fa); // read gyroscope data from sensor gyro.read_data(fg); #else fa[0] = fa[1] = fa[2] = 1.11f; fg[0] = fg[1] = fg[2] = 1.11f; #endif // <----unlock i2c_mutex.unlock(); // debug task0 = !task0; } } // Update sensor data void display(void const *args){ uint32_t n = 0; while (true) { #ifdef USE_I2C_LCD i2c_mutex.lock(); lcd0.locate(0, 0); // 1st line top lcd0.printf(" G=%4.1f ", sqrt(fa[0]*fa[0] + fa[1]*fa[1] + fa[2]*fa[2])); lcd0.locate(0, 1); // 2nd line top lcd0.printf("%8d",n++); i2c_mutex.unlock(); #endif Thread::wait(500); // debug task1 = !task1; } } // Thread definition osThreadDef(update_angle, osPriorityNormal, 1024); osThreadDef(monitor, osPriorityNormal, 1024); osThreadDef(display, osPriorityAboveNormal, 1024); osThreadDef(watch_time, osPriorityNormal, 1024); int main(void) { PRINTF("\r\nstep1\r\n"); RtosTimer led_1_timer(blink, osTimerPeriodic, (void *)0); RtosTimer led_2_timer(blink, osTimerPeriodic, (void *)1); RtosTimer led_3_timer(blink, osTimerPeriodic, (void *)2); RtosTimer led_4_timer(blink, osTimerPeriodic, (void *)3); PRINTF("step2\r\n"); led_1_timer.start(2000); led_2_timer.start(1000); led_3_timer.start(500); led_4_timer.start(250); PRINTF("step3\r\n"); Thread thread(send_thread); PRINTF("step4\r\n"); // IRQ Ticker ticker0; Ticker ticker1; ticker0.attach(queue_isr0, TIME_BASE_S); PRINTF("step5\r\n"); // Starts threads if (osThreadCreate(osThread(display), NULL) == NULL){ PRINTF("ERROR4\r\n"); } if (osThreadCreate(osThread(monitor), NULL) == NULL){ PRINTF("ERROR3\r\n"); } if (osThreadCreate(osThread(update_angle), NULL) == NULL){ PRINTF("ERROR1\r\n"); } if (osThreadCreate(osThread(watch_time), NULL) == NULL){ printf("ERROR5\r\n"); } // I2C LCD #ifdef USE_I2C_LCD // ---->lock i2c_mutex.lock(); lcd0.locate(0, 0); // 1st line top lcd0.printf("I2C test"); lcd0.locate(0, 1); // 2nd line top lcd0.puts(" JH1PJL "); lcd0.setContrast(0x14); // <----unlock i2c_mutex.unlock(); #endif count = 0; PRINTF("step6\r\n"); while (true) { osEvent evt = mail_box.get(); if (evt.status == osEventMail) { mail_t *mail = (mail_t*)evt.value.p; if (show_flag0){ PRINTF("[MAIN]\r\n"); PRINTF("This is dummy!, "); PRINTF("Volt: %.2f V, " , mail->voltage); PRINTF("Current: %.2f A, " , mail->current); PRINTF("# of cycles: %u\r\n", mail->counter); } mail_box.free(mail); } #if defined(TARGET_RZ_A1H) for (uint32_t i = 0; i < 100; i++){ big_data[big_data_index] = ++big_data_index; if (big_data_index == (4096 * 1024)){ big_data_index = 0; } } #endif } } void mbed_die(void) { PRINTF("Error, came from os_error()!\r\n"); gpio_t led_1; gpio_init_out(&led_1, LED1); gpio_t led_2; gpio_init_out(&led_2, LED2); gpio_t led_3; gpio_init_out(&led_3, LED3); gpio_t led_4; gpio_init_out(&led_4, LED4); while (1) { gpio_write(&led_1, 1); gpio_write(&led_2, 0); gpio_write(&led_3, 0); gpio_write(&led_4, 1); wait_ms(100); gpio_write(&led_1, 0); gpio_write(&led_2, 1); gpio_write(&led_3, 1); gpio_write(&led_4, 0); wait_ms(100); } }